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

vfs: new helper - vfs_ustat()

... and bury user_get_super()/statfs_by_dentry() - they are
purely internal now.

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

Al Viro cf31e70d c972b4bc

+17 -26
+1 -8
arch/parisc/hpux/sys_hpux.c
··· 136 136 */ 137 137 static int hpux_ustat(dev_t dev, struct hpux_ustat __user *ubuf) 138 138 { 139 - struct super_block *s; 140 139 struct hpux_ustat tmp; /* Changed to hpux_ustat */ 141 140 struct kstatfs sbuf; 142 - int err = -EINVAL; 143 - 144 - s = user_get_super(dev); 145 - if (s == NULL) 146 - goto out; 147 - err = statfs_by_dentry(s->s_root, &sbuf); 148 - drop_super(s); 141 + int err = vfs_ustat(dev, &sbuf); 149 142 if (err) 150 143 goto out; 151 144
+1 -8
fs/compat.c
··· 342 342 */ 343 343 asmlinkage long compat_sys_ustat(unsigned dev, struct compat_ustat __user *u) 344 344 { 345 - struct super_block *sb; 346 345 struct compat_ustat tmp; 347 346 struct kstatfs sbuf; 348 - int err; 349 - 350 - sb = user_get_super(new_decode_dev(dev)); 351 - if (!sb) 352 - return -EINVAL; 353 - err = statfs_by_dentry(sb->s_root, &sbuf); 354 - drop_super(sb); 347 + int err = vfs_ustat(new_decode_dev(dev), &sbuf); 355 348 if (err) 356 349 return err; 357 350
+1
fs/internal.h
··· 78 78 extern bool grab_super_passive(struct super_block *sb); 79 79 extern struct dentry *mount_fs(struct file_system_type *, 80 80 int, const char *, void *); 81 + extern struct super_block *user_get_super(dev_t); 81 82 82 83 /* 83 84 * open.c
+13 -8
fs/statfs.c
··· 7 7 #include <linux/statfs.h> 8 8 #include <linux/security.h> 9 9 #include <linux/uaccess.h> 10 + #include "internal.h" 10 11 11 12 static int flags_by_mnt(int mnt_flags) 12 13 { ··· 46 45 flags_by_sb(mnt->mnt_sb->s_flags); 47 46 } 48 47 49 - int statfs_by_dentry(struct dentry *dentry, struct kstatfs *buf) 48 + static int statfs_by_dentry(struct dentry *dentry, struct kstatfs *buf) 50 49 { 51 50 int retval; 52 51 ··· 206 205 return error; 207 206 } 208 207 209 - SYSCALL_DEFINE2(ustat, unsigned, dev, struct ustat __user *, ubuf) 208 + int vfs_ustat(dev_t dev, struct kstatfs *sbuf) 210 209 { 211 - struct super_block *s; 212 - struct ustat tmp; 213 - struct kstatfs sbuf; 210 + struct super_block *s = user_get_super(dev); 214 211 int err; 215 - 216 - s = user_get_super(new_decode_dev(dev)); 217 212 if (!s) 218 213 return -EINVAL; 219 214 220 - err = statfs_by_dentry(s->s_root, &sbuf); 215 + err = statfs_by_dentry(s->s_root, sbuf); 221 216 drop_super(s); 217 + return err; 218 + } 219 + 220 + SYSCALL_DEFINE2(ustat, unsigned, dev, struct ustat __user *, ubuf) 221 + { 222 + struct ustat tmp; 223 + struct kstatfs sbuf; 224 + int err = vfs_ustat(new_decode_dev(dev), &sbuf); 222 225 if (err) 223 226 return err; 224 227
+1 -2
include/linux/fs.h
··· 1939 1939 extern int vfs_statfs(struct path *, struct kstatfs *); 1940 1940 extern int user_statfs(const char __user *, struct kstatfs *); 1941 1941 extern int fd_statfs(int, struct kstatfs *); 1942 - extern int statfs_by_dentry(struct dentry *, struct kstatfs *); 1942 + extern int vfs_ustat(dev_t, struct kstatfs *); 1943 1943 extern int freeze_super(struct super_block *super); 1944 1944 extern int thaw_super(struct super_block *super); 1945 1945 extern bool our_mnt(struct vfsmount *mnt); ··· 2531 2531 extern struct file_system_type *get_fs_type(const char *name); 2532 2532 extern struct super_block *get_super(struct block_device *); 2533 2533 extern struct super_block *get_active_super(struct block_device *bdev); 2534 - extern struct super_block *user_get_super(dev_t); 2535 2534 extern void drop_super(struct super_block *sb); 2536 2535 extern void iterate_supers(void (*)(struct super_block *, void *), void *); 2537 2536 extern void iterate_supers_type(struct file_system_type *,