提交 d16f801d 编写于 作者: A Al Viro 提交者: Zheng Zengkai

switch file_open_root() to struct path

mainline inclusion
from mainline-5.14-rc1
commit ffb37ca3
category: bugfix
bugzilla: 181657 https://gitee.com/openeuler/kernel/issues/I4DDEL
Reference: https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=ffb37ca3bd16ce6ea2df2f87fde9a31e94ebb54b

---------------------------

... and provide file_open_root_mnt(), using the root of given mount.
Signed-off-by: NAl Viro <viro@zeniv.linux.org.uk>

Conflicts:
	Documentation/filesystems/porting.rst
	[ Non-bugfix 14e43bf4("vfs: don't unnecessarily clone
	  write access for writable fd") is not applied. ]
Signed-off-by: NZhihao Cheng <chengzhihao1@huawei.com>
Reviewed-by: NZhang Yi <yi.zhang@huawei.com>
Signed-off-by: NChen Jun <chenjun102@huawei.com>
[Roberto Sassu: Adjust file_open_root() called by load_digest_list()]
Signed-off-by: NZheng Zengkai <zhengzengkai@huawei.com>
上级 fddff7d8
...@@ -865,3 +865,12 @@ no matter what. Everything is handled by the caller. ...@@ -865,3 +865,12 @@ no matter what. Everything is handled by the caller.
clone_private_mount() returns a longterm mount now, so the proper destructor of clone_private_mount() returns a longterm mount now, so the proper destructor of
its result is kern_unmount() or kern_unmount_array(). its result is kern_unmount() or kern_unmount_array().
---
**mandatory**
Calling conventions for file_open_root() changed; now it takes struct path *
instead of passing mount and dentry separately. For callers that used to
pass <mnt, mnt->mnt_root> pair (i.e. the root of given mount), a new helper
is provided - file_open_root_mnt(). In-tree users adjusted.
...@@ -140,7 +140,7 @@ void mconsole_proc(struct mc_request *req) ...@@ -140,7 +140,7 @@ void mconsole_proc(struct mc_request *req)
mconsole_reply(req, "Proc not available", 1, 0); mconsole_reply(req, "Proc not available", 1, 0);
goto out; goto out;
} }
file = file_open_root(mnt->mnt_root, mnt, ptr, O_RDONLY, 0); file = file_open_root_mnt(mnt, ptr, O_RDONLY, 0);
if (IS_ERR(file)) { if (IS_ERR(file)) {
mconsole_reply(req, "Failed to open file", 1, 0); mconsole_reply(req, "Failed to open file", 1, 0);
printk(KERN_ERR "open /proc/%s: %ld\n", ptr, PTR_ERR(file)); printk(KERN_ERR "open /proc/%s: %ld\n", ptr, PTR_ERR(file));
......
...@@ -755,8 +755,8 @@ void do_coredump(const kernel_siginfo_t *siginfo) ...@@ -755,8 +755,8 @@ void do_coredump(const kernel_siginfo_t *siginfo)
task_lock(&init_task); task_lock(&init_task);
get_fs_root(init_task.fs, &root); get_fs_root(init_task.fs, &root);
task_unlock(&init_task); task_unlock(&init_task);
cprm.file = file_open_root(root.dentry, root.mnt, cprm.file = file_open_root(&root, cn.corename,
cn.corename, open_flags, 0600); open_flags, 0600);
path_put(&root); path_put(&root);
} else { } else {
cprm.file = filp_open(cn.corename, open_flags, 0600); cprm.file = filp_open(cn.corename, open_flags, 0600);
......
...@@ -229,7 +229,7 @@ static long do_handle_open(int mountdirfd, struct file_handle __user *ufh, ...@@ -229,7 +229,7 @@ static long do_handle_open(int mountdirfd, struct file_handle __user *ufh,
path_put(&path); path_put(&path);
return fd; return fd;
} }
file = file_open_root(path.dentry, path.mnt, "", open_flag, 0); file = file_open_root(&path, "", open_flag, 0);
if (IS_ERR(file)) { if (IS_ERR(file)) {
put_unused_fd(fd); put_unused_fd(fd);
retval = PTR_ERR(file); retval = PTR_ERR(file);
......
...@@ -128,7 +128,7 @@ struct open_flags { ...@@ -128,7 +128,7 @@ struct open_flags {
}; };
extern struct file *do_filp_open(int dfd, struct filename *pathname, extern struct file *do_filp_open(int dfd, struct filename *pathname,
const struct open_flags *op); const struct open_flags *op);
extern struct file *do_file_open_root(struct dentry *, struct vfsmount *, extern struct file *do_file_open_root(const struct path *,
const char *, const struct open_flags *); const char *, const struct open_flags *);
extern struct open_how build_open_how(int flags, umode_t mode); extern struct open_how build_open_how(int flags, umode_t mode);
extern int build_open_flags(const struct open_how *how, struct open_flags *op); extern int build_open_flags(const struct open_how *how, struct open_flags *op);
......
...@@ -160,7 +160,7 @@ int kernel_read_file_from_path_initns(const char *path, loff_t offset, ...@@ -160,7 +160,7 @@ int kernel_read_file_from_path_initns(const char *path, loff_t offset,
get_fs_root(init_task.fs, &root); get_fs_root(init_task.fs, &root);
task_unlock(&init_task); task_unlock(&init_task);
file = file_open_root(root.dentry, root.mnt, path, O_RDONLY, 0); file = file_open_root(&root, path, O_RDONLY, 0);
path_put(&root); path_put(&root);
if (IS_ERR(file)) if (IS_ERR(file))
return PTR_ERR(file); return PTR_ERR(file);
......
...@@ -3393,7 +3393,7 @@ struct file *do_filp_open(int dfd, struct filename *pathname, ...@@ -3393,7 +3393,7 @@ struct file *do_filp_open(int dfd, struct filename *pathname,
return filp; return filp;
} }
struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, struct file *do_file_open_root(const struct path *root,
const char *name, const struct open_flags *op) const char *name, const struct open_flags *op)
{ {
struct nameidata nd; struct nameidata nd;
...@@ -3401,16 +3401,14 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, ...@@ -3401,16 +3401,14 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt,
struct filename *filename; struct filename *filename;
int flags = op->lookup_flags | LOOKUP_ROOT; int flags = op->lookup_flags | LOOKUP_ROOT;
nd.root.mnt = mnt; if (d_is_symlink(root->dentry) && op->intent & LOOKUP_OPEN)
nd.root.dentry = dentry;
if (d_is_symlink(dentry) && op->intent & LOOKUP_OPEN)
return ERR_PTR(-ELOOP); return ERR_PTR(-ELOOP);
filename = getname_kernel(name); filename = getname_kernel(name);
if (IS_ERR(filename)) if (IS_ERR(filename))
return ERR_CAST(filename); return ERR_CAST(filename);
nd.root = *root;
set_nameidata(&nd, -1, filename); set_nameidata(&nd, -1, filename);
file = path_openat(&nd, op, flags | LOOKUP_RCU); file = path_openat(&nd, op, flags | LOOKUP_RCU);
if (unlikely(file == ERR_PTR(-ECHILD))) if (unlikely(file == ERR_PTR(-ECHILD)))
......
...@@ -1149,7 +1149,7 @@ struct file *filp_open(const char *filename, int flags, umode_t mode) ...@@ -1149,7 +1149,7 @@ struct file *filp_open(const char *filename, int flags, umode_t mode)
} }
EXPORT_SYMBOL(filp_open); EXPORT_SYMBOL(filp_open);
struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt, struct file *file_open_root(const struct path *root,
const char *filename, int flags, umode_t mode) const char *filename, int flags, umode_t mode)
{ {
struct open_flags op; struct open_flags op;
...@@ -1157,7 +1157,7 @@ struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt, ...@@ -1157,7 +1157,7 @@ struct file *file_open_root(struct dentry *dentry, struct vfsmount *mnt,
int err = build_open_flags(&how, &op); int err = build_open_flags(&how, &op);
if (err) if (err)
return ERR_PTR(err); return ERR_PTR(err);
return do_file_open_root(dentry, mnt, filename, &op); return do_file_open_root(root, filename, &op);
} }
EXPORT_SYMBOL(file_open_root); EXPORT_SYMBOL(file_open_root);
......
...@@ -1803,7 +1803,7 @@ static int process_sysctl_arg(char *param, char *val, ...@@ -1803,7 +1803,7 @@ static int process_sysctl_arg(char *param, char *val,
panic("%s: Failed to allocate path for %s\n", __func__, param); panic("%s: Failed to allocate path for %s\n", __func__, param);
strreplace(path, '.', '/'); strreplace(path, '.', '/');
file = file_open_root((*proc_mnt)->mnt_root, *proc_mnt, path, O_WRONLY, 0); file = file_open_root_mnt(*proc_mnt, path, O_WRONLY, 0);
if (IS_ERR(file)) { if (IS_ERR(file)) {
err = PTR_ERR(file); err = PTR_ERR(file);
if (err == -ENOENT) if (err == -ENOENT)
......
...@@ -39,6 +39,7 @@ ...@@ -39,6 +39,7 @@
#include <linux/fs_types.h> #include <linux/fs_types.h>
#include <linux/build_bug.h> #include <linux/build_bug.h>
#include <linux/stddef.h> #include <linux/stddef.h>
#include <linux/mount.h>
#include <asm/byteorder.h> #include <asm/byteorder.h>
#include <uapi/linux/fs.h> #include <uapi/linux/fs.h>
...@@ -2528,8 +2529,14 @@ extern long do_sys_open(int dfd, const char __user *filename, int flags, ...@@ -2528,8 +2529,14 @@ extern long do_sys_open(int dfd, const char __user *filename, int flags,
umode_t mode); umode_t mode);
extern struct file *file_open_name(struct filename *, int, umode_t); extern struct file *file_open_name(struct filename *, int, umode_t);
extern struct file *filp_open(const char *, int, umode_t); 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(const struct path *,
const char *, int, umode_t); const char *, int, umode_t);
static inline struct file *file_open_root_mnt(struct vfsmount *mnt,
const char *name, int flags, umode_t mode)
{
return file_open_root(&(struct path){.mnt = mnt, .dentry = mnt->mnt_root},
name, flags, mode);
}
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, extern struct file * open_with_fake_path(const struct path *, int,
struct inode*, const struct cred *); struct inode*, const struct cred *);
......
...@@ -26,7 +26,7 @@ static struct vfsmount *blob_to_mnt(const void *data, size_t len, const char *na ...@@ -26,7 +26,7 @@ static struct vfsmount *blob_to_mnt(const void *data, size_t len, const char *na
if (IS_ERR(mnt)) if (IS_ERR(mnt))
return mnt; return mnt;
file = file_open_root(mnt->mnt_root, mnt, name, O_CREAT | O_WRONLY, 0700); file = file_open_root_mnt(mnt, name, O_CREAT | O_WRONLY, 0700);
if (IS_ERR(file)) { if (IS_ERR(file)) {
mntput(mnt); mntput(mnt);
return ERR_CAST(file); return ERR_CAST(file);
......
...@@ -352,7 +352,7 @@ static int __init load_digest_list(struct dir_context *__ctx, const char *name, ...@@ -352,7 +352,7 @@ static int __init load_digest_list(struct dir_context *__ctx, const char *name,
goto out; goto out;
} }
file = file_open_root(dir->dentry, dir->mnt, name, O_RDONLY, 0); file = file_open_root(dir, name, O_RDONLY, 0);
if (IS_ERR(file)) { if (IS_ERR(file)) {
pr_err("Unable to open file: %s (%ld)", name, PTR_ERR(file)); pr_err("Unable to open file: %s (%ld)", name, PTR_ERR(file));
goto out; goto out;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册