Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

new helpers: file_removexattr(), filename_removexattr()

switch path_removexattrat() and fremovexattr(2) to those

Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

+35 -18
+35 -18
fs/xattr.c
··· 957 957 return vfs_removexattr(idmap, d, name); 958 958 } 959 959 960 - static int path_removexattr(const char __user *pathname, 961 - const char __user *name, unsigned int lookup_flags) 960 + static int file_removexattr(struct file *f, struct xattr_name *kname) 961 + { 962 + int error = mnt_want_write_file(f); 963 + 964 + if (!error) { 965 + audit_file(f); 966 + error = removexattr(file_mnt_idmap(f), 967 + f->f_path.dentry, kname->name); 968 + mnt_drop_write_file(f); 969 + } 970 + return error; 971 + } 972 + 973 + /* unconditionally consumes filename */ 974 + static int filename_removexattr(int dfd, struct filename *filename, 975 + unsigned int lookup_flags, struct xattr_name *kname) 962 976 { 963 977 struct path path; 964 978 int error; 965 - struct xattr_name kname; 966 979 967 - error = import_xattr_name(&kname, name); 968 - if (error) 969 - return error; 970 980 retry: 971 - error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path); 981 + error = filename_lookup(dfd, filename, lookup_flags, &path, NULL); 972 982 if (error) 973 - return error; 983 + goto out; 974 984 error = mnt_want_write(path.mnt); 975 985 if (!error) { 976 - error = removexattr(mnt_idmap(path.mnt), path.dentry, kname.name); 986 + error = removexattr(mnt_idmap(path.mnt), path.dentry, kname->name); 977 987 mnt_drop_write(path.mnt); 978 988 } 979 989 path_put(&path); ··· 991 981 lookup_flags |= LOOKUP_REVAL; 992 982 goto retry; 993 983 } 984 + out: 985 + putname(filename); 994 986 return error; 987 + } 988 + 989 + static int path_removexattr(const char __user *pathname, 990 + const char __user *name, unsigned int lookup_flags) 991 + { 992 + struct xattr_name kname; 993 + int error; 994 + 995 + error = import_xattr_name(&kname, name); 996 + if (error) 997 + return error; 998 + return filename_removexattr(AT_FDCWD, getname(pathname), lookup_flags, 999 + &kname); 995 1000 } 996 1001 997 1002 SYSCALL_DEFINE2(removexattr, const char __user *, pathname, ··· 1029 1004 1030 1005 if (fd_empty(f)) 1031 1006 return -EBADF; 1032 - audit_file(fd_file(f)); 1033 1007 1034 1008 error = import_xattr_name(&kname, name); 1035 1009 if (error) 1036 1010 return error; 1037 - 1038 - error = mnt_want_write_file(fd_file(f)); 1039 - if (!error) { 1040 - error = removexattr(file_mnt_idmap(fd_file(f)), 1041 - fd_file(f)->f_path.dentry, kname.name); 1042 - mnt_drop_write_file(fd_file(f)); 1043 - } 1044 - return error; 1011 + return file_removexattr(fd_file(f), &kname); 1045 1012 } 1046 1013 1047 1014 int xattr_list_one(char **buffer, ssize_t *remaining_size, const char *name)