mirror of
https://github.com/linuxkit/linuxkit.git
synced 2025-10-05 16:14:51 +00:00
65 lines
1.9 KiB
Diff
65 lines
1.9 KiB
Diff
From 784c13b38b4413144b146699bb3ab090c291e6c2 Mon Sep 17 00:00:00 2001
|
|
From: James Bottomley <James.Bottomley@HansenPartnership.com>
|
|
Date: Wed, 17 Feb 2016 16:49:38 -0800
|
|
Subject: [PATCH 43/44] fs: add filp_clone_open API
|
|
|
|
I need an API that allows me to obtain a clone of the current file
|
|
pointer to pass in to an exec handler. I've labelled this as an
|
|
internal API because I can't see how it would be useful outside of the
|
|
fs subsystem. The use case will be a persistent binfmt_misc handler.
|
|
|
|
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
|
|
Acked-by: Serge Hallyn <serge.hallyn@canonical.com>
|
|
Acked-by: Jan Kara <jack@suse.cz>
|
|
---
|
|
fs/internal.h | 1 +
|
|
fs/open.c | 20 ++++++++++++++++++++
|
|
2 files changed, 21 insertions(+)
|
|
|
|
diff --git a/fs/internal.h b/fs/internal.h
|
|
index 71859c4d0b41..c0022708ff3a 100644
|
|
--- a/fs/internal.h
|
|
+++ b/fs/internal.h
|
|
@@ -108,6 +108,7 @@ extern long do_handle_open(int mountdirfd,
|
|
struct file_handle __user *ufh, int open_flag);
|
|
extern int open_check_o_direct(struct file *f);
|
|
extern int vfs_open(const struct path *, struct file *, const struct cred *);
|
|
+extern struct file *filp_clone_open(struct file *);
|
|
|
|
/*
|
|
* inode.c
|
|
diff --git a/fs/open.c b/fs/open.c
|
|
index 157b9940dd73..9d993f928ea0 100644
|
|
--- a/fs/open.c
|
|
+++ b/fs/open.c
|
|
@@ -1001,6 +1001,26 @@ struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
|
|
}
|
|
EXPORT_SYMBOL(file_open_root);
|
|
|
|
+struct file *filp_clone_open(struct file *oldfile)
|
|
+{
|
|
+ struct file *file;
|
|
+ int retval;
|
|
+
|
|
+ file = get_empty_filp();
|
|
+ if (IS_ERR(file))
|
|
+ return file;
|
|
+
|
|
+ file->f_flags = oldfile->f_flags;
|
|
+ retval = vfs_open(&oldfile->f_path, file, oldfile->f_cred);
|
|
+ if (retval) {
|
|
+ put_filp(file);
|
|
+ return ERR_PTR(retval);
|
|
+ }
|
|
+
|
|
+ return file;
|
|
+}
|
|
+EXPORT_SYMBOL(filp_clone_open);
|
|
+
|
|
long do_sys_open(int dfd, const char __user *filename, int flags, umode_t mode)
|
|
{
|
|
struct open_flags op;
|
|
--
|
|
2.11.0
|
|
|