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

kill vfs_stat_fd / vfs_lstat_fd

There's really no reason to keep vfs_stat_fd and vfs_lstat_fd with
Oleg's vfs_fstatat. Use vfs_fstatat for the few cases having the
directory fd, and switch all others to vfs_stat / vfs_lstat.

Reviewed-by: Christoph Hellwig <hch@lst.de>

Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>

authored by

Christoph Hellwig and committed by
Al Viro
2eae7a18 0112fc22

+52 -73
+10 -8
fs/compat.c
··· 181 181 struct compat_stat __user *statbuf) 182 182 { 183 183 struct kstat stat; 184 - int error = vfs_stat_fd(AT_FDCWD, filename, &stat); 184 + int error; 185 185 186 - if (!error) 187 - error = cp_compat_stat(&stat, statbuf); 188 - return error; 186 + error = vfs_stat(filename, &stat); 187 + if (error) 188 + return error; 189 + return cp_compat_stat(&stat, statbuf); 189 190 } 190 191 191 192 asmlinkage long compat_sys_newlstat(char __user * filename, 192 193 struct compat_stat __user *statbuf) 193 194 { 194 195 struct kstat stat; 195 - int error = vfs_lstat_fd(AT_FDCWD, filename, &stat); 196 + int error; 196 197 197 - if (!error) 198 - error = cp_compat_stat(&stat, statbuf); 199 - return error; 198 + error = vfs_lstat(filename, &stat); 199 + if (error) 200 + return error; 201 + return cp_compat_stat(&stat, statbuf); 200 202 } 201 203 202 204 #ifndef __ARCH_WANT_STAT64
+42 -63
fs/stat.c
··· 55 55 56 56 EXPORT_SYMBOL(vfs_getattr); 57 57 58 - int vfs_stat_fd(int dfd, char __user *name, struct kstat *stat) 59 - { 60 - struct path path; 61 - int error; 62 - 63 - error = user_path_at(dfd, name, LOOKUP_FOLLOW, &path); 64 - if (!error) { 65 - error = vfs_getattr(path.mnt, path.dentry, stat); 66 - path_put(&path); 67 - } 68 - return error; 69 - } 70 - 71 - int vfs_stat(char __user *name, struct kstat *stat) 72 - { 73 - return vfs_stat_fd(AT_FDCWD, name, stat); 74 - } 75 - 76 - EXPORT_SYMBOL(vfs_stat); 77 - 78 - int vfs_lstat_fd(int dfd, char __user *name, struct kstat *stat) 79 - { 80 - struct path path; 81 - int error; 82 - 83 - error = user_path_at(dfd, name, 0, &path); 84 - if (!error) { 85 - error = vfs_getattr(path.mnt, path.dentry, stat); 86 - path_put(&path); 87 - } 88 - return error; 89 - } 90 - 91 - int vfs_lstat(char __user *name, struct kstat *stat) 92 - { 93 - return vfs_lstat_fd(AT_FDCWD, name, stat); 94 - } 95 - 96 - EXPORT_SYMBOL(vfs_lstat); 97 - 98 58 int vfs_fstat(unsigned int fd, struct kstat *stat) 99 59 { 100 60 struct file *f = fget(fd); ··· 66 106 } 67 107 return error; 68 108 } 69 - 70 109 EXPORT_SYMBOL(vfs_fstat); 71 110 72 111 int vfs_fstatat(int dfd, char __user *filename, struct kstat *stat, int flag) 73 112 { 113 + struct path path; 74 114 int error = -EINVAL; 115 + int lookup_flags = 0; 75 116 76 117 if ((flag & ~AT_SYMLINK_NOFOLLOW) != 0) 77 118 goto out; 78 119 79 - if (flag & AT_SYMLINK_NOFOLLOW) 80 - error = vfs_lstat_fd(dfd, filename, stat); 81 - else 82 - error = vfs_stat_fd(dfd, filename, stat); 120 + if (!(flag & AT_SYMLINK_NOFOLLOW)) 121 + lookup_flags |= LOOKUP_FOLLOW; 122 + 123 + error = user_path_at(dfd, filename, lookup_flags, &path); 124 + if (error) 125 + goto out; 126 + 127 + error = vfs_getattr(path.mnt, path.dentry, stat); 128 + path_put(&path); 83 129 out: 84 130 return error; 85 131 } 86 - 87 132 EXPORT_SYMBOL(vfs_fstatat); 133 + 134 + int vfs_stat(char __user *name, struct kstat *stat) 135 + { 136 + return vfs_fstatat(AT_FDCWD, name, stat, 0); 137 + } 138 + EXPORT_SYMBOL(vfs_stat); 139 + 140 + int vfs_lstat(char __user *name, struct kstat *stat) 141 + { 142 + return vfs_fstatat(AT_FDCWD, name, stat, AT_SYMLINK_NOFOLLOW); 143 + } 144 + EXPORT_SYMBOL(vfs_lstat); 88 145 89 146 90 147 #ifdef __ARCH_WANT_OLD_STAT ··· 150 173 SYSCALL_DEFINE2(stat, char __user *, filename, struct __old_kernel_stat __user *, statbuf) 151 174 { 152 175 struct kstat stat; 153 - int error = vfs_stat_fd(AT_FDCWD, filename, &stat); 176 + int error; 154 177 155 - if (!error) 156 - error = cp_old_stat(&stat, statbuf); 178 + error = vfs_stat(filename, &stat); 179 + if (error) 180 + return error; 157 181 158 - return error; 182 + return cp_old_stat(&stat, statbuf); 159 183 } 160 184 161 185 SYSCALL_DEFINE2(lstat, char __user *, filename, struct __old_kernel_stat __user *, statbuf) 162 186 { 163 187 struct kstat stat; 164 - int error = vfs_lstat_fd(AT_FDCWD, filename, &stat); 188 + int error; 165 189 166 - if (!error) 167 - error = cp_old_stat(&stat, statbuf); 190 + error = vfs_lstat(filename, &stat); 191 + if (error) 192 + return error; 168 193 169 - return error; 194 + return cp_old_stat(&stat, statbuf); 170 195 } 171 196 172 197 SYSCALL_DEFINE2(fstat, unsigned int, fd, struct __old_kernel_stat __user *, statbuf) ··· 237 258 SYSCALL_DEFINE2(newstat, char __user *, filename, struct stat __user *, statbuf) 238 259 { 239 260 struct kstat stat; 240 - int error = vfs_stat_fd(AT_FDCWD, filename, &stat); 261 + int error = vfs_stat(filename, &stat); 241 262 242 - if (!error) 243 - error = cp_new_stat(&stat, statbuf); 244 - 245 - return error; 263 + if (error) 264 + return error; 265 + return cp_new_stat(&stat, statbuf); 246 266 } 247 267 248 268 SYSCALL_DEFINE2(newlstat, char __user *, filename, struct stat __user *, statbuf) 249 269 { 250 270 struct kstat stat; 251 - int error = vfs_lstat_fd(AT_FDCWD, filename, &stat); 271 + int error; 252 272 253 - if (!error) 254 - error = cp_new_stat(&stat, statbuf); 273 + error = vfs_lstat(filename, &stat); 274 + if (error) 275 + return error; 255 276 256 - return error; 277 + return cp_new_stat(&stat, statbuf); 257 278 } 258 279 259 280 #if !defined(__ARCH_WANT_STAT64) || defined(__ARCH_WANT_SYS_NEWFSTATAT)
-2
include/linux/fs.h
··· 2299 2299 2300 2300 extern int vfs_stat(char __user *, struct kstat *); 2301 2301 extern int vfs_lstat(char __user *, struct kstat *); 2302 - extern int vfs_stat_fd(int dfd, char __user *, struct kstat *); 2303 - extern int vfs_lstat_fd(int dfd, char __user *, struct kstat *); 2304 2302 extern int vfs_fstat(unsigned int, struct kstat *); 2305 2303 extern int vfs_fstatat(int , char __user *, struct kstat *, int); 2306 2304