Commit 2abc77af authored by Al Viro's avatar Al Viro

new helper: open_with_fake_path()

open a file by given inode, faking ->f_path.  Use with shitloads
of caution - at the very least you'd damn better make sure that
some dentry alias of that inode is pinned down by the path in
question.  Again, this is no general-purpose interface and I hope
it will eventually go away.  Right now overlayfs wants something
like that, but nothing else should.

Any out-of-tree code with bright idea of using this one *will*
eventually get hurt, with zero notice and great delight on my part.
I refuse to use EXPORT_SYMBOL_GPL(), especially in situations when
it's really EXPORT_SYMBOL_DONT_USE_IT(), but don't take that export
as "you are welcome to use it".
Signed-off-by: default avatarAl Viro <viro@zeniv.linux.org.uk>
parent 69527c55
...@@ -925,6 +925,24 @@ struct file *dentry_open(const struct path *path, int flags, ...@@ -925,6 +925,24 @@ struct file *dentry_open(const struct path *path, int flags,
} }
EXPORT_SYMBOL(dentry_open); EXPORT_SYMBOL(dentry_open);
struct file *open_with_fake_path(const struct path *path, int flags,
struct inode *inode, const struct cred *cred)
{
struct file *f = alloc_empty_file(flags, cred);
if (!IS_ERR(f)) {
int error;
f->f_path = *path;
error = do_dentry_open(f, inode, NULL);
if (error) {
fput(f);
f = ERR_PTR(error);
}
}
return f;
}
EXPORT_SYMBOL(open_with_fake_path);
static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op) static inline int build_open_flags(int flags, umode_t mode, struct open_flags *op)
{ {
int lookup_flags = 0; int lookup_flags = 0;
......
...@@ -2424,6 +2424,8 @@ extern struct file *filp_open(const char *, int, umode_t); ...@@ -2424,6 +2424,8 @@ extern struct file *filp_open(const char *, int, umode_t);
extern struct file *file_open_root(struct dentry *, struct vfsmount *, extern struct file *file_open_root(struct dentry *, struct vfsmount *,
const char *, int, umode_t); const char *, int, umode_t);
extern struct file * dentry_open(const struct path *, int, const struct cred *); extern struct file * dentry_open(const struct path *, int, const struct cred *);
extern struct file * open_with_fake_path(const struct path *, int,
struct inode*, const struct cred *);
static inline struct file *file_clone_open(struct file *file) static inline struct file *file_clone_open(struct file *file)
{ {
return dentry_open(&file->f_path, file->f_flags, file->f_cred); return dentry_open(&file->f_path, file->f_flags, file->f_cred);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment