Loading fs/internal.h +3 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,9 @@ extern void __init chrdev_init(void); * namei.c */ extern int __inode_permission(struct inode *, int); extern int user_path_mountpoint_at(int, const char __user *, unsigned int, struct path *); extern int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *, unsigned int, struct path *); /* * namespace.c Loading fs/namei.c +11 −12 Original line number Diff line number Diff line Loading @@ -2223,7 +2223,7 @@ user_path_parent(int dfd, const char __user *path, struct nameidata *nd, } /** * umount_lookup_last - look up last component for umount * mountpoint_last - look up last component for umount * @nd: pathwalk nameidata - currently pointing at parent directory of "last" * @path: pointer to container for result * Loading @@ -2250,7 +2250,7 @@ user_path_parent(int dfd, const char __user *path, struct nameidata *nd, * to the link, and nd->path will *not* be put. */ static int umount_lookup_last(struct nameidata *nd, struct path *path) mountpoint_last(struct nameidata *nd, struct path *path) { int error = 0; struct dentry *dentry; Loading Loading @@ -2312,17 +2312,16 @@ umount_lookup_last(struct nameidata *nd, struct path *path) } /** * path_umountat - look up a path to be umounted * path_mountpoint - look up a path to be umounted * @dfd: directory file descriptor to start walk from * @name: full pathname to walk * @flags: lookup flags * @nd: pathwalk nameidata * * Look up the given name, but don't attempt to revalidate the last component. * Returns 0 and "path" will be valid on success; Retuns error otherwise. */ static int path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) path_mountpoint(int dfd, const char *name, struct path *path, unsigned int flags) { struct file *base = NULL; struct nameidata nd; Loading @@ -2337,7 +2336,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) if (err) goto out; err = umount_lookup_last(&nd, path); err = mountpoint_last(&nd, path); while (err > 0) { void *cookie; struct path link = *path; Loading @@ -2348,7 +2347,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) err = follow_link(&link, &nd, &cookie); if (err) break; err = umount_lookup_last(&nd, path); err = mountpoint_last(&nd, path); put_link(&nd, &link, cookie); } out: Loading @@ -2362,7 +2361,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) } /** * user_path_umountat - lookup a path from userland in order to umount it * user_path_mountpoint_at - lookup a path from userland in order to umount it * @dfd: directory file descriptor * @name: pathname from userland * @flags: lookup flags Loading @@ -2376,7 +2375,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) * Returns 0 and populates "path" on success. */ int user_path_umountat(int dfd, const char __user *name, unsigned int flags, user_path_mountpoint_at(int dfd, const char __user *name, unsigned int flags, struct path *path) { struct filename *s = getname(name); Loading @@ -2385,11 +2384,11 @@ user_path_umountat(int dfd, const char __user *name, unsigned int flags, if (IS_ERR(s)) return PTR_ERR(s); error = path_umountat(dfd, s->name, path, flags | LOOKUP_RCU); error = path_mountpoint(dfd, s->name, path, flags | LOOKUP_RCU); if (unlikely(error == -ECHILD)) error = path_umountat(dfd, s->name, path, flags); error = path_mountpoint(dfd, s->name, path, flags); if (unlikely(error == -ESTALE)) error = path_umountat(dfd, s->name, path, flags | LOOKUP_REVAL); error = path_mountpoint(dfd, s->name, path, flags | LOOKUP_REVAL); if (likely(!error)) audit_inode(s, path->dentry, 0); Loading fs/namespace.c +1 −1 Original line number Diff line number Diff line Loading @@ -1321,7 +1321,7 @@ SYSCALL_DEFINE2(umount, char __user *, name, int, flags) if (!(flags & UMOUNT_NOFOLLOW)) lookup_flags |= LOOKUP_FOLLOW; retval = user_path_umountat(AT_FDCWD, name, lookup_flags, &path); retval = user_path_mountpoint_at(AT_FDCWD, name, lookup_flags, &path); if (retval) goto out; mnt = real_mount(path.mnt); Loading include/linux/namei.h +0 −3 Original line number Diff line number Diff line Loading @@ -58,7 +58,6 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND}; extern int user_path_at(int, const char __user *, unsigned, struct path *); extern int user_path_at_empty(int, const char __user *, unsigned, struct path *, int *empty); extern int user_path_umountat(int, const char __user *, unsigned int, struct path *); #define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path) #define user_lpath(name, path) user_path_at(AT_FDCWD, name, 0, path) Loading @@ -71,8 +70,6 @@ extern struct dentry *kern_path_create(int, const char *, struct path *, unsigne extern struct dentry *user_path_create(int, const char __user *, struct path *, unsigned int); extern void done_path_create(struct path *, struct dentry *); extern struct dentry *kern_path_locked(const char *, struct path *); extern int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *, unsigned int, struct path *); extern struct dentry *lookup_one_len(const char *, struct dentry *, int); Loading Loading
fs/internal.h +3 −0 Original line number Diff line number Diff line Loading @@ -45,6 +45,9 @@ extern void __init chrdev_init(void); * namei.c */ extern int __inode_permission(struct inode *, int); extern int user_path_mountpoint_at(int, const char __user *, unsigned int, struct path *); extern int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *, unsigned int, struct path *); /* * namespace.c Loading
fs/namei.c +11 −12 Original line number Diff line number Diff line Loading @@ -2223,7 +2223,7 @@ user_path_parent(int dfd, const char __user *path, struct nameidata *nd, } /** * umount_lookup_last - look up last component for umount * mountpoint_last - look up last component for umount * @nd: pathwalk nameidata - currently pointing at parent directory of "last" * @path: pointer to container for result * Loading @@ -2250,7 +2250,7 @@ user_path_parent(int dfd, const char __user *path, struct nameidata *nd, * to the link, and nd->path will *not* be put. */ static int umount_lookup_last(struct nameidata *nd, struct path *path) mountpoint_last(struct nameidata *nd, struct path *path) { int error = 0; struct dentry *dentry; Loading Loading @@ -2312,17 +2312,16 @@ umount_lookup_last(struct nameidata *nd, struct path *path) } /** * path_umountat - look up a path to be umounted * path_mountpoint - look up a path to be umounted * @dfd: directory file descriptor to start walk from * @name: full pathname to walk * @flags: lookup flags * @nd: pathwalk nameidata * * Look up the given name, but don't attempt to revalidate the last component. * Returns 0 and "path" will be valid on success; Retuns error otherwise. */ static int path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) path_mountpoint(int dfd, const char *name, struct path *path, unsigned int flags) { struct file *base = NULL; struct nameidata nd; Loading @@ -2337,7 +2336,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) if (err) goto out; err = umount_lookup_last(&nd, path); err = mountpoint_last(&nd, path); while (err > 0) { void *cookie; struct path link = *path; Loading @@ -2348,7 +2347,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) err = follow_link(&link, &nd, &cookie); if (err) break; err = umount_lookup_last(&nd, path); err = mountpoint_last(&nd, path); put_link(&nd, &link, cookie); } out: Loading @@ -2362,7 +2361,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) } /** * user_path_umountat - lookup a path from userland in order to umount it * user_path_mountpoint_at - lookup a path from userland in order to umount it * @dfd: directory file descriptor * @name: pathname from userland * @flags: lookup flags Loading @@ -2376,7 +2375,7 @@ path_umountat(int dfd, const char *name, struct path *path, unsigned int flags) * Returns 0 and populates "path" on success. */ int user_path_umountat(int dfd, const char __user *name, unsigned int flags, user_path_mountpoint_at(int dfd, const char __user *name, unsigned int flags, struct path *path) { struct filename *s = getname(name); Loading @@ -2385,11 +2384,11 @@ user_path_umountat(int dfd, const char __user *name, unsigned int flags, if (IS_ERR(s)) return PTR_ERR(s); error = path_umountat(dfd, s->name, path, flags | LOOKUP_RCU); error = path_mountpoint(dfd, s->name, path, flags | LOOKUP_RCU); if (unlikely(error == -ECHILD)) error = path_umountat(dfd, s->name, path, flags); error = path_mountpoint(dfd, s->name, path, flags); if (unlikely(error == -ESTALE)) error = path_umountat(dfd, s->name, path, flags | LOOKUP_REVAL); error = path_mountpoint(dfd, s->name, path, flags | LOOKUP_REVAL); if (likely(!error)) audit_inode(s, path->dentry, 0); Loading
fs/namespace.c +1 −1 Original line number Diff line number Diff line Loading @@ -1321,7 +1321,7 @@ SYSCALL_DEFINE2(umount, char __user *, name, int, flags) if (!(flags & UMOUNT_NOFOLLOW)) lookup_flags |= LOOKUP_FOLLOW; retval = user_path_umountat(AT_FDCWD, name, lookup_flags, &path); retval = user_path_mountpoint_at(AT_FDCWD, name, lookup_flags, &path); if (retval) goto out; mnt = real_mount(path.mnt); Loading
include/linux/namei.h +0 −3 Original line number Diff line number Diff line Loading @@ -58,7 +58,6 @@ enum {LAST_NORM, LAST_ROOT, LAST_DOT, LAST_DOTDOT, LAST_BIND}; extern int user_path_at(int, const char __user *, unsigned, struct path *); extern int user_path_at_empty(int, const char __user *, unsigned, struct path *, int *empty); extern int user_path_umountat(int, const char __user *, unsigned int, struct path *); #define user_path(name, path) user_path_at(AT_FDCWD, name, LOOKUP_FOLLOW, path) #define user_lpath(name, path) user_path_at(AT_FDCWD, name, 0, path) Loading @@ -71,8 +70,6 @@ extern struct dentry *kern_path_create(int, const char *, struct path *, unsigne extern struct dentry *user_path_create(int, const char __user *, struct path *, unsigned int); extern void done_path_create(struct path *, struct dentry *); extern struct dentry *kern_path_locked(const char *, struct path *); extern int vfs_path_lookup(struct dentry *, struct vfsmount *, const char *, unsigned int, struct path *); extern struct dentry *lookup_one_len(const char *, struct dentry *, int); Loading