diff options
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 18 |
1 files changed, 10 insertions, 8 deletions
diff --git a/fs/namei.c b/fs/namei.c index 8c14353fb750..6bbd8fdfb1f5 100644 --- a/fs/namei.c +++ b/fs/namei.c | |||
@@ -2662,7 +2662,7 @@ out_dput: | |||
2662 | */ | 2662 | */ |
2663 | static int do_last(struct nameidata *nd, struct path *path, | 2663 | static int do_last(struct nameidata *nd, struct path *path, |
2664 | struct file *file, const struct open_flags *op, | 2664 | struct file *file, const struct open_flags *op, |
2665 | int *opened, const char *pathname) | 2665 | int *opened, struct filename *name) |
2666 | { | 2666 | { |
2667 | struct dentry *dir = nd->path.dentry; | 2667 | struct dentry *dir = nd->path.dentry; |
2668 | int open_flag = op->open_flag; | 2668 | int open_flag = op->open_flag; |
@@ -2674,6 +2674,7 @@ static int do_last(struct nameidata *nd, struct path *path, | |||
2674 | struct path save_parent = { .dentry = NULL, .mnt = NULL }; | 2674 | struct path save_parent = { .dentry = NULL, .mnt = NULL }; |
2675 | bool retried = false; | 2675 | bool retried = false; |
2676 | int error; | 2676 | int error; |
2677 | const char *pathname = name->name; | ||
2677 | 2678 | ||
2678 | nd->flags &= ~LOOKUP_PARENT; | 2679 | nd->flags &= ~LOOKUP_PARENT; |
2679 | nd->flags |= op->intent; | 2680 | nd->flags |= op->intent; |
@@ -2908,7 +2909,7 @@ stale_open: | |||
2908 | goto retry_lookup; | 2909 | goto retry_lookup; |
2909 | } | 2910 | } |
2910 | 2911 | ||
2911 | static struct file *path_openat(int dfd, const char *pathname, | 2912 | static struct file *path_openat(int dfd, struct filename *pathname, |
2912 | struct nameidata *nd, const struct open_flags *op, int flags) | 2913 | struct nameidata *nd, const struct open_flags *op, int flags) |
2913 | { | 2914 | { |
2914 | struct file *base = NULL; | 2915 | struct file *base = NULL; |
@@ -2923,12 +2924,12 @@ static struct file *path_openat(int dfd, const char *pathname, | |||
2923 | 2924 | ||
2924 | file->f_flags = op->open_flag; | 2925 | file->f_flags = op->open_flag; |
2925 | 2926 | ||
2926 | error = path_init(dfd, pathname, flags | LOOKUP_PARENT, nd, &base); | 2927 | error = path_init(dfd, pathname->name, flags | LOOKUP_PARENT, nd, &base); |
2927 | if (unlikely(error)) | 2928 | if (unlikely(error)) |
2928 | goto out; | 2929 | goto out; |
2929 | 2930 | ||
2930 | current->total_link_count = 0; | 2931 | current->total_link_count = 0; |
2931 | error = link_path_walk(pathname, nd); | 2932 | error = link_path_walk(pathname->name, nd); |
2932 | if (unlikely(error)) | 2933 | if (unlikely(error)) |
2933 | goto out; | 2934 | goto out; |
2934 | 2935 | ||
@@ -2974,7 +2975,7 @@ out: | |||
2974 | return file; | 2975 | return file; |
2975 | } | 2976 | } |
2976 | 2977 | ||
2977 | struct file *do_filp_open(int dfd, const char *pathname, | 2978 | struct file *do_filp_open(int dfd, struct filename *pathname, |
2978 | const struct open_flags *op, int flags) | 2979 | const struct open_flags *op, int flags) |
2979 | { | 2980 | { |
2980 | struct nameidata nd; | 2981 | struct nameidata nd; |
@@ -2993,6 +2994,7 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, | |||
2993 | { | 2994 | { |
2994 | struct nameidata nd; | 2995 | struct nameidata nd; |
2995 | struct file *file; | 2996 | struct file *file; |
2997 | struct filename filename = { .name = name }; | ||
2996 | 2998 | ||
2997 | nd.root.mnt = mnt; | 2999 | nd.root.mnt = mnt; |
2998 | nd.root.dentry = dentry; | 3000 | nd.root.dentry = dentry; |
@@ -3002,11 +3004,11 @@ struct file *do_file_open_root(struct dentry *dentry, struct vfsmount *mnt, | |||
3002 | if (dentry->d_inode->i_op->follow_link && op->intent & LOOKUP_OPEN) | 3004 | if (dentry->d_inode->i_op->follow_link && op->intent & LOOKUP_OPEN) |
3003 | return ERR_PTR(-ELOOP); | 3005 | return ERR_PTR(-ELOOP); |
3004 | 3006 | ||
3005 | file = path_openat(-1, name, &nd, op, flags | LOOKUP_RCU); | 3007 | file = path_openat(-1, &filename, &nd, op, flags | LOOKUP_RCU); |
3006 | if (unlikely(file == ERR_PTR(-ECHILD))) | 3008 | if (unlikely(file == ERR_PTR(-ECHILD))) |
3007 | file = path_openat(-1, name, &nd, op, flags); | 3009 | file = path_openat(-1, &filename, &nd, op, flags); |
3008 | if (unlikely(file == ERR_PTR(-ESTALE))) | 3010 | if (unlikely(file == ERR_PTR(-ESTALE))) |
3009 | file = path_openat(-1, name, &nd, op, flags | LOOKUP_REVAL); | 3011 | file = path_openat(-1, &filename, &nd, op, flags | LOOKUP_REVAL); |
3010 | return file; | 3012 | return file; |
3011 | } | 3013 | } |
3012 | 3014 | ||