diff options
author | Christoph Hellwig <hch@lst.de> | 2017-11-04 13:44:45 +0300 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2017-11-10 08:48:46 -0500 |
commit | da2f1362c8bdf187c171a59a2c84b8ed3566d5fe (patch) | |
tree | 44159235d3573de42f02e6baa94649a3f5cc0639 /fs/namei.c | |
parent | e145b35bb97eaf86205b99feef524254c581895c (diff) | |
download | lwn-da2f1362c8bdf187c171a59a2c84b8ed3566d5fe.tar.gz lwn-da2f1362c8bdf187c171a59a2c84b8ed3566d5fe.zip |
fs: expose do_unlinkat for built-in callers
And make it take a struct filename instead of a user pointer.
Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Diffstat (limited to 'fs/namei.c')
-rw-r--r-- | fs/namei.c | 12 |
1 files changed, 5 insertions, 7 deletions
diff --git a/fs/namei.c b/fs/namei.c index c75ea03ca147..9060fd69981f 100644 --- a/fs/namei.c +++ b/fs/namei.c @@ -4009,10 +4009,9 @@ EXPORT_SYMBOL(vfs_unlink); * writeout happening, and we don't want to prevent access to the directory * while waiting on the I/O. */ -static long do_unlinkat(int dfd, const char __user *pathname) +long do_unlinkat(int dfd, struct filename *name) { int error; - struct filename *name; struct dentry *dentry; struct path path; struct qstr last; @@ -4021,8 +4020,7 @@ static long do_unlinkat(int dfd, const char __user *pathname) struct inode *delegated_inode = NULL; unsigned int lookup_flags = 0; retry: - name = filename_parentat(dfd, getname(pathname), lookup_flags, - &path, &last, &type); + name = filename_parentat(dfd, name, lookup_flags, &path, &last, &type); if (IS_ERR(name)) return PTR_ERR(name); @@ -4064,12 +4062,12 @@ exit2: mnt_drop_write(path.mnt); exit1: path_put(&path); - putname(name); if (retry_estale(error, lookup_flags)) { lookup_flags |= LOOKUP_REVAL; inode = NULL; goto retry; } + putname(name); return error; slashes: @@ -4090,12 +4088,12 @@ SYSCALL_DEFINE3(unlinkat, int, dfd, const char __user *, pathname, int, flag) if (flag & AT_REMOVEDIR) return do_rmdir(dfd, pathname); - return do_unlinkat(dfd, pathname); + return do_unlinkat(dfd, getname(pathname)); } SYSCALL_DEFINE1(unlink, const char __user *, pathname) { - return do_unlinkat(AT_FDCWD, pathname); + return do_unlinkat(AT_FDCWD, getname(pathname)); } int vfs_symlink(struct inode *dir, struct dentry *dentry, const char *oldname) |