diff options
Diffstat (limited to 'fs/nfsd')
| -rw-r--r-- | fs/nfsd/fault_inject.c | 6 | ||||
| -rw-r--r-- | fs/nfsd/nfs2acl.c | 23 | ||||
| -rw-r--r-- | fs/nfsd/nfs3proc.c | 5 | ||||
| -rw-r--r-- | fs/nfsd/nfs3xdr.c | 10 | ||||
| -rw-r--r-- | fs/nfsd/nfs4xdr.c | 4 | ||||
| -rw-r--r-- | fs/nfsd/nfsctl.c | 2 | ||||
| -rw-r--r-- | fs/nfsd/nfsproc.c | 12 | ||||
| -rw-r--r-- | fs/nfsd/nfsxdr.c | 7 | ||||
| -rw-r--r-- | fs/nfsd/vfs.c | 6 | ||||
| -rw-r--r-- | fs/nfsd/vfs.h | 8 | ||||
| -rw-r--r-- | fs/nfsd/xdr.h | 2 | ||||
| -rw-r--r-- | fs/nfsd/xdr3.h | 2 | 
12 files changed, 51 insertions, 36 deletions
diff --git a/fs/nfsd/fault_inject.c b/fs/nfsd/fault_inject.c index e761ee95617..497584c7036 100644 --- a/fs/nfsd/fault_inject.c +++ b/fs/nfsd/fault_inject.c @@ -101,7 +101,7 @@ static ssize_t fault_inject_read(struct file *file, char __user *buf,  	loff_t pos = *ppos;  	if (!pos) -		nfsd_inject_get(file->f_dentry->d_inode->i_private, &val); +		nfsd_inject_get(file_inode(file)->i_private, &val);  	size = scnprintf(read_buf, sizeof(read_buf), "%llu\n", val);  	if (pos < 0) @@ -133,10 +133,10 @@ static ssize_t fault_inject_write(struct file *file, const char __user *buf,  	size = rpc_pton(net, write_buf, size, (struct sockaddr *)&sa, sizeof(sa));  	if (size > 0) -		nfsd_inject_set_client(file->f_dentry->d_inode->i_private, &sa, size); +		nfsd_inject_set_client(file_inode(file)->i_private, &sa, size);  	else {  		val = simple_strtoll(write_buf, NULL, 0); -		nfsd_inject_set(file->f_dentry->d_inode->i_private, val); +		nfsd_inject_set(file_inode(file)->i_private, val);  	}  	return len; /* on success, claim we got the whole input */  } diff --git a/fs/nfsd/nfs2acl.c b/fs/nfsd/nfs2acl.c index 9170861c804..95d76dc6c5d 100644 --- a/fs/nfsd/nfs2acl.c +++ b/fs/nfsd/nfs2acl.c @@ -45,6 +45,10 @@ static __be32 nfsacld_proc_getacl(struct svc_rqst * rqstp,  		RETURN_STATUS(nfserr_inval);  	resp->mask = argp->mask; +	nfserr = fh_getattr(fh, &resp->stat); +	if (nfserr) +		goto fail; +  	if (resp->mask & (NFS_ACL|NFS_ACLCNT)) {  		acl = nfsd_get_posix_acl(fh, ACL_TYPE_ACCESS);  		if (IS_ERR(acl)) { @@ -115,6 +119,9 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,  		nfserr = nfserrno( nfsd_set_posix_acl(  			fh, ACL_TYPE_DEFAULT, argp->acl_default) );  	} +	if (!nfserr) { +		nfserr = fh_getattr(fh, &resp->stat); +	}  	/* argp->acl_{access,default} may have been allocated in  	   nfssvc_decode_setaclargs. */ @@ -129,10 +136,15 @@ static __be32 nfsacld_proc_setacl(struct svc_rqst * rqstp,  static __be32 nfsacld_proc_getattr(struct svc_rqst * rqstp,  		struct nfsd_fhandle *argp, struct nfsd_attrstat *resp)  { +	__be32 nfserr;  	dprintk("nfsd: GETATTR  %s\n", SVCFH_fmt(&argp->fh));  	fh_copy(&resp->fh, &argp->fh); -	return fh_verify(rqstp, &resp->fh, 0, NFSD_MAY_NOP); +	nfserr = fh_verify(rqstp, &resp->fh, 0, NFSD_MAY_NOP); +	if (nfserr) +		return nfserr; +	nfserr = fh_getattr(&resp->fh, &resp->stat); +	return nfserr;  }  /* @@ -150,6 +162,9 @@ static __be32 nfsacld_proc_access(struct svc_rqst *rqstp, struct nfsd3_accessarg  	fh_copy(&resp->fh, &argp->fh);  	resp->access = argp->access;  	nfserr = nfsd_access(rqstp, &resp->fh, &resp->access, NULL); +	if (nfserr) +		return nfserr; +	nfserr = fh_getattr(&resp->fh, &resp->stat);  	return nfserr;  } @@ -243,7 +258,7 @@ static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,  		return 0;  	inode = dentry->d_inode; -	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh); +	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);  	*p++ = htonl(resp->mask);  	if (!xdr_ressize_check(rqstp, p))  		return 0; @@ -274,7 +289,7 @@ static int nfsaclsvc_encode_getaclres(struct svc_rqst *rqstp, __be32 *p,  static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p,  		struct nfsd_attrstat *resp)  { -	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh); +	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);  	return xdr_ressize_check(rqstp, p);  } @@ -282,7 +297,7 @@ static int nfsaclsvc_encode_attrstatres(struct svc_rqst *rqstp, __be32 *p,  static int nfsaclsvc_encode_accessres(struct svc_rqst *rqstp, __be32 *p,  		struct nfsd3_accessres *resp)  { -	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh); +	p = nfs2svc_encode_fattr(rqstp, p, &resp->fh, &resp->stat);  	*p++ = htonl(resp->access);  	return xdr_ressize_check(rqstp, p);  } diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index 1fc02dfdc5c..40128991313 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c @@ -43,7 +43,6 @@ static __be32  nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,  					   struct nfsd3_attrstat *resp)  { -	int	err;  	__be32	nfserr;  	dprintk("nfsd: GETATTR(3)  %s\n", @@ -55,9 +54,7 @@ nfsd3_proc_getattr(struct svc_rqst *rqstp, struct nfsd_fhandle  *argp,  	if (nfserr)  		RETURN_STATUS(nfserr); -	err = vfs_getattr(resp->fh.fh_export->ex_path.mnt, -			  resp->fh.fh_dentry, &resp->stat); -	nfserr = nfserrno(err); +	nfserr = fh_getattr(&resp->fh, &resp->stat);  	RETURN_STATUS(nfserr);  } diff --git a/fs/nfsd/nfs3xdr.c b/fs/nfsd/nfs3xdr.c index 925c944bc0b..14d9ecb96cf 100644 --- a/fs/nfsd/nfs3xdr.c +++ b/fs/nfsd/nfs3xdr.c @@ -11,6 +11,7 @@  #include "xdr3.h"  #include "auth.h"  #include "netns.h" +#include "vfs.h"  #define NFSDDBG_FACILITY		NFSDDBG_XDR @@ -206,10 +207,10 @@ encode_post_op_attr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)  {  	struct dentry *dentry = fhp->fh_dentry;  	if (dentry && dentry->d_inode) { -	        int err; +	        __be32 err;  		struct kstat stat; -		err = vfs_getattr(fhp->fh_export->ex_path.mnt, dentry, &stat); +		err = fh_getattr(fhp, &stat);  		if (!err) {  			*p++ = xdr_one;		/* attributes follow */  			lease_get_mtime(dentry->d_inode, &stat.mtime); @@ -256,13 +257,12 @@ encode_wcc_data(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp)   */  void fill_post_wcc(struct svc_fh *fhp)  { -	int err; +	__be32 err;  	if (fhp->fh_post_saved)  		printk("nfsd: inode locked twice during operation.\n"); -	err = vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, -			&fhp->fh_post_attr); +	err = fh_getattr(fhp, &fhp->fh_post_attr);  	fhp->fh_post_change = fhp->fh_dentry->d_inode->i_version;  	if (err) {  		fhp->fh_post_saved = 0; diff --git a/fs/nfsd/nfs4xdr.c b/fs/nfsd/nfs4xdr.c index 2d1d06bae3a..8ca6d17f6cf 100644 --- a/fs/nfsd/nfs4xdr.c +++ b/fs/nfsd/nfs4xdr.c @@ -2015,7 +2015,7 @@ static int get_parent_attributes(struct svc_export *exp, struct kstat *stat)  		if (path.dentry != path.mnt->mnt_root)  			break;  	} -	err = vfs_getattr(path.mnt, path.dentry, stat); +	err = vfs_getattr(&path, stat);  	path_put(&path);  	return err;  } @@ -2068,7 +2068,7 @@ nfsd4_encode_fattr(struct svc_fh *fhp, struct svc_export *exp,  			goto out;  	} -	err = vfs_getattr(exp->ex_path.mnt, dentry, &stat); +	err = vfs_getattr(&path, &stat);  	if (err)  		goto out_nfserr;  	if ((bmval0 & (FATTR4_WORD0_FILES_FREE | FATTR4_WORD0_FILES_TOTAL | diff --git a/fs/nfsd/nfsctl.c b/fs/nfsd/nfsctl.c index 74934284d9a..2db7021b01a 100644 --- a/fs/nfsd/nfsctl.c +++ b/fs/nfsd/nfsctl.c @@ -85,7 +85,7 @@ static ssize_t (*write_op[])(struct file *, char *, size_t) = {  static ssize_t nfsctl_transaction_write(struct file *file, const char __user *buf, size_t size, loff_t *pos)  { -	ino_t ino =  file->f_path.dentry->d_inode->i_ino; +	ino_t ino =  file_inode(file)->i_ino;  	char *data;  	ssize_t rv; diff --git a/fs/nfsd/nfsproc.c b/fs/nfsd/nfsproc.c index aad6d457b9e..54c6b3d3cc7 100644 --- a/fs/nfsd/nfsproc.c +++ b/fs/nfsd/nfsproc.c @@ -26,17 +26,13 @@ static __be32  nfsd_return_attrs(__be32 err, struct nfsd_attrstat *resp)  {  	if (err) return err; -	return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, -				    resp->fh.fh_dentry, -				    &resp->stat)); +	return fh_getattr(&resp->fh, &resp->stat);  }  static __be32  nfsd_return_dirop(__be32 err, struct nfsd_diropres *resp)  {  	if (err) return err; -	return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, -				    resp->fh.fh_dentry, -				    &resp->stat)); +	return fh_getattr(&resp->fh, &resp->stat);  }  /*   * Get a file's attributes @@ -150,9 +146,7 @@ nfsd_proc_read(struct svc_rqst *rqstp, struct nfsd_readargs *argp,  				  &resp->count);  	if (nfserr) return nfserr; -	return nfserrno(vfs_getattr(resp->fh.fh_export->ex_path.mnt, -				    resp->fh.fh_dentry, -				    &resp->stat)); +	return fh_getattr(&resp->fh, &resp->stat);  }  /* diff --git a/fs/nfsd/nfsxdr.c b/fs/nfsd/nfsxdr.c index 4201ede0ec9..9c769a47ac5 100644 --- a/fs/nfsd/nfsxdr.c +++ b/fs/nfsd/nfsxdr.c @@ -4,6 +4,7 @@   * Copyright (C) 1995, 1996 Olaf Kirch <okir@monad.swb.de>   */ +#include "vfs.h"  #include "xdr.h"  #include "auth.h" @@ -196,11 +197,9 @@ encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp,  }  /* Helper function for NFSv2 ACL code */ -__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp) +__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, struct kstat *stat)  { -	struct kstat stat; -	vfs_getattr(fhp->fh_export->ex_path.mnt, fhp->fh_dentry, &stat); -	return encode_fattr(rqstp, p, fhp, &stat); +	return encode_fattr(rqstp, p, fhp, stat);  }  /* diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 31ff1d642e3..2a7eb536de0 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -979,7 +979,7 @@ static void kill_suid(struct dentry *dentry)   */  static int wait_for_concurrent_writes(struct file *file)  { -	struct inode *inode = file->f_path.dentry->d_inode; +	struct inode *inode = file_inode(file);  	static ino_t last_ino;  	static dev_t last_dev;  	int err = 0; @@ -1070,7 +1070,7 @@ __be32 nfsd_read(struct svc_rqst *rqstp, struct svc_fh *fhp,  	if (err)  		return err; -	inode = file->f_path.dentry->d_inode; +	inode = file_inode(file);  	/* Get readahead parameters */  	ra = nfsd_get_raparms(inode->i_sb->s_dev, inode->i_ino); @@ -1957,7 +1957,7 @@ static __be32 nfsd_buffered_readdir(struct file *file, filldir_t func,  	offset = *offsetp;  	while (1) { -		struct inode *dir_inode = file->f_path.dentry->d_inode; +		struct inode *dir_inode = file_inode(file);  		unsigned int reclen;  		cdp->err = nfserr_eof; /* will be cleared on successful read */ diff --git a/fs/nfsd/vfs.h b/fs/nfsd/vfs.h index 359594c393d..5b5894159f2 100644 --- a/fs/nfsd/vfs.h +++ b/fs/nfsd/vfs.h @@ -6,6 +6,7 @@  #define LINUX_NFSD_VFS_H  #include "nfsfh.h" +#include "nfsd.h"  /*   * Flags for nfsd_permission @@ -125,4 +126,11 @@ static inline void fh_drop_write(struct svc_fh *fh)  	}  } +static inline __be32 fh_getattr(struct svc_fh *fh, struct kstat *stat) +{ +	struct path p = {.mnt = fh->fh_export->ex_path.mnt, +			 .dentry = fh->fh_dentry}; +	return nfserrno(vfs_getattr(&p, stat)); +} +  #endif /* LINUX_NFSD_VFS_H */ diff --git a/fs/nfsd/xdr.h b/fs/nfsd/xdr.h index 53b1863dd8f..4f0481d6380 100644 --- a/fs/nfsd/xdr.h +++ b/fs/nfsd/xdr.h @@ -167,7 +167,7 @@ int nfssvc_encode_entry(void *, const char *name,  int nfssvc_release_fhandle(struct svc_rqst *, __be32 *, struct nfsd_fhandle *);  /* Helper functions for NFSv2 ACL code */ -__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp); +__be32 *nfs2svc_encode_fattr(struct svc_rqst *rqstp, __be32 *p, struct svc_fh *fhp, struct kstat *stat);  __be32 *nfs2svc_decode_fh(__be32 *p, struct svc_fh *fhp);  #endif /* LINUX_NFSD_H */ diff --git a/fs/nfsd/xdr3.h b/fs/nfsd/xdr3.h index 7df980eb056..b6d5542a4ac 100644 --- a/fs/nfsd/xdr3.h +++ b/fs/nfsd/xdr3.h @@ -136,6 +136,7 @@ struct nfsd3_accessres {  	__be32			status;  	struct svc_fh		fh;  	__u32			access; +	struct kstat		stat;  };  struct nfsd3_readlinkres { @@ -225,6 +226,7 @@ struct nfsd3_getaclres {  	int			mask;  	struct posix_acl	*acl_access;  	struct posix_acl	*acl_default; +	struct kstat		stat;  };  /* dummy type for release */  |