pass a struct path to vfs_statfs
Subsystems (6)
PATCH 1/2 pass a struct path to vfs_statfs
We'll need the path to implement the flags field for statvfs support. We do have it available in all callers except:
- ecryptfs_statfs. This one doesn't actually need vfs_statfs but just needs to do a caller to the lower filesystem statfs method.
- sys_ustat. Add a non-exported statfs_by_dentry helper for it which doesn't won't be able to fill out the flags field later on.
In addition rename the helpers for statfs vs fstatfs to do_*statfs instead of the misleading vfs prefix.
Signed-off-by Christoph Hellwig <[email protected]>
fs/ecryptfs/super.c +5 -1
@@ -118,7 +118,11 @@ void ecryptfs_init_inode(struct inode *i*/ static int ecryptfs_statfs (struct dentry *dentry,struct kstatfs *buf) { -return vfs_statfs (ecryptfs_dentry_to_lower (dentry), buf); +struct dentry *lower_dentry =ecryptfs_dentry_to_lower (dentry); + +if (!lower_dentry->d_sb->s_op->statfs) +return -ENOSYS ; +return lower_dentry->d_sb->s_op->statfs (lower_dentry, buf); }/**
arch/parisc/hpux/sys_hpux.c +5 -5
@@ -145,7 +145,7 @@ static int hpux_ustat(dev_t dev, struct s =user_get_super (dev);if (s ==NULL ) goto out; - err =vfs_statfs (s->s_root, &sbuf); + err =statfs_by_dentry (s->s_root, &sbuf);drop_super (s);if (err) goto out;
@@ -186,12 +186,12 @@ struct hpux_statfs {int16_t f_pad; }; -static int vfs_statfs_hpux (struct dentry *dentry,struct hpux_statfs *buf) +static int do_statfs_hpux (struct path *path,struct hpux_statfs *buf) {struct kstatfs st;int retval; - retval =vfs_statfs (dentry, &st); + retval =vfs_statfs (path, &st);if (retval)return retval;
@@ -219,7 +219,7 @@ asmlinkage long hpux_statfs(const char _ error =user_path (pathname, &path);if (!error) {struct hpux_statfs tmp; - error =vfs_statfs_hpux (path.dentry, &tmp); + error =do_statfs_hpux (&path, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ;path_put (&path);
@@ -237,7 +237,7 @@ asmlinkage long hpux_fstatfs(unsigned in file =fget (fd);if (!file) goto out; - error =vfs_statfs_hpux (file->f_path.dentry, &tmp); + error =do_statfs_hpux (&file->f_path, &tmp);if (!error &©_to_user (buf, &tmp,sizeof (tmp))) error = -EFAULT ;fput (file);
fs/cachefiles/bind.c +1 -1
@@ -146,7 +146,7 @@ static int cachefiles_daemon_add_cache(s goto error_unsupported;/* get the cache size and blocksize */ - ret =vfs_statfs (root, &stats); + ret =vfs_statfs (&path, &stats);if (ret <0 ) goto error_unsupported;
fs/cachefiles/daemon.c +5 -1
@@ -683,6 +683,10 @@ int cachefiles_has_space(struct cachefil unsigned fnr, unsigned bnr) {struct kstatfs stats; +struct path path = { + .mnt = cache->mnt, + .dentry = cache->mnt->mnt_root, + };int ret;//_enter("{%llu,%llu,%llu,%llu,%llu,%llu},%u,%u",
@@ -697,7 +701,7 @@ int cachefiles_has_space(struct cachefil/* find out how many pages of blockdev are available */ memset (&stats,0 ,sizeof (stats)); - ret =vfs_statfs (cache->mnt->mnt_root, &stats); + ret =vfs_statfs (&path, &stats);if (ret <0 ) {if (ret == -EIO )cachefiles_io_error (cache,"statfs failed" );
fs/compat.c +5 -5
@@ -266,7 +266,7 @@ asmlinkage long compat_sys_statfs(const error =user_path (pathname, &path);if (!error) {struct kstatfs tmp; - error =vfs_statfs (path.dentry, &tmp); + error =vfs_statfs (&path, &tmp);if (!error) error =put_compat_statfs (buf, &tmp);path_put (&path);
@@ -284,7 +284,7 @@ asmlinkage long compat_sys_fstatfs(unsig file =fget (fd);if (!file) goto out; - error =vfs_statfs (file->f_path.dentry, &tmp); + error =vfs_statfs (&file->f_path, &tmp);if (!error) error =put_compat_statfs (buf, &tmp);fput (file);
@@ -334,7 +334,7 @@ asmlinkage long compat_sys_statfs64(cons error =user_path (pathname, &path);if (!error) {struct kstatfs tmp; - error =vfs_statfs (path.dentry, &tmp); + error =vfs_statfs (&path, &tmp);if (!error) error =put_compat_statfs64 (buf, &tmp);path_put (&path);
@@ -355,7 +355,7 @@ asmlinkage long compat_sys_fstatfs64(uns file =fget (fd);if (!file) goto out; - error =vfs_statfs (file->f_path.dentry, &tmp); + error =vfs_statfs (&file->f_path, &tmp);if (!error) error =put_compat_statfs64 (buf, &tmp);fput (file);
@@ -378,7 +378,7 @@ asmlinkage long compat_sys_ustat(unsigne sb =user_get_super (new_decode_dev (dev));if (!sb)return -EINVAL ; - err =vfs_statfs (sb->s_root, &sbuf); + err =statfs_by_dentry (sb->s_root, &sbuf);drop_super (sb);if (err)return err;
fs/nfsd/nfs4xdr.c +5 -1
@@ -1756,6 +1756,10 @@ nfsd4_encode_fattr(struct svc_fh *fhp, sstruct nfs4_acl *acl =NULL ;struct nfsd4_compoundres *resp = rqstp->rq_resp;u32 minorversion = resp->cstate.minorversion; +struct path path = { + .mnt = exp->ex_path.mnt, + .dentry = dentry, + };BUG_ON (bmval1 &NFSD_WRITEONLY_ATTRS_WORD1 );BUG_ON (bmval0 & ~nfsd_suppattrs0 (minorversion));
@@ -1776,7 +1780,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, s FATTR4_WORD0_MAXNAME)) || (bmval1 & (FATTR4_WORD1_SPACE_AVAIL | FATTR4_WORD1_SPACE_FREE | FATTR4_WORD1_SPACE_TOTAL))) { - err =vfs_statfs (dentry, &statfs); + err =vfs_statfs (&path, &statfs);if (err) goto out_nfserr; }
fs/nfsd/vfs.c +8 -2
@@ -2019,8 +2019,14 @@ out:__be32 nfsd_statfs (struct svc_rqst *rqstp,struct svc_fh *fhp,struct kstatfs *stat,int access) { -__be32 err =fh_verify (rqstp, fhp,0 ,NFSD_MAY_NOP | access); -if (!err &&vfs_statfs (fhp->fh_dentry,stat)) +struct path path = { + .mnt = fhp->fh_export->ex_path.mnt, + .dentry = fhp->fh_dentry, + }; +__be32 err; + + err =fh_verify (rqstp, fhp,0 ,NFSD_MAY_NOP | access); +if (!err &&vfs_statfs (&path, stat)) err = nfserr_io;return err; }
fs/statfs.c +25 -23
105 lines not on this page · raw message
include/linux/fs.h +2 -1
@@ -1800,7 +1800,8 @@ extern struct vfsmount *collect_mounts(sextern void drop_collected_mounts (struct vfsmount *);extern int iterate_mounts (int (*)(struct vfsmount *,void *),void *,struct vfsmount *); -extern int vfs_statfs (struct dentry *,struct kstatfs *); +extern int vfs_statfs (struct path *,struct kstatfs *); +extern int statfs_by_dentry (struct dentry *,struct kstatfs *);extern int freeze_super (struct super_block *super);extern int thaw_super (struct super_block *super);
kernel/acct.c +1 -1
@@ -122,7 +122,7 @@ static int check_free_space(struct bsd_aspin_unlock (&acct_lock);/* May block */ -if (vfs_statfs (file->f_path.dentry, &sbuf)) +if (vfs_statfs (&file->f_path, &sbuf))return res; suspend = sbuf.f_blocks *SUSPEND ; resume = sbuf.f_blocks *RESUME ;
arch/alpha/kernel/osf_sys.c +4 -4
@@ -234,11 +234,11 @@ linux_to_osf_statfs(struct kstatfs *linu }static int -do_osf_statfs (struct dentry * dentry,struct osf_statfs __user *buffer, +do_osf_statfs (struct path *path,struct osf_statfs __user *buffer,unsigned long bufsiz) {struct kstatfs linux_stat; -int error =vfs_statfs (dentry, &linux_stat); +int error =vfs_statfs (path, &linux_stat);if (!error) error =linux_to_osf_statfs (&linux_stat, buffer, bufsiz);return error;
@@ -252,7 +252,7 @@ SYSCALL_DEFINE3(osf_statfs, char __user retval =user_path (pathname, &path);if (!retval) { - retval =do_osf_statfs (path.dentry, buffer, bufsiz); + retval = do_osf_statfs(&path buffer, bufsiz);path_put (&path); }return retval;
@@ -267,7 +267,7 @@ SYSCALL_DEFINE3(osf_fstatfs, unsigned lo retval = -EBADF ; file =fget (fd);if (file) { - retval =do_osf_statfs (file->f_path.dentry, buffer, bufsiz); + retval =do_osf_statfs (&file->f_path, buffer, bufsiz);fput (file); }return retval;