diff options
Diffstat (limited to 'fs/nfsd/nfs3proc.c')
| -rw-r--r-- | fs/nfsd/nfs3proc.c | 35 | 
1 files changed, 24 insertions, 11 deletions
diff --git a/fs/nfsd/nfs3proc.c b/fs/nfsd/nfs3proc.c index 981a3a7a6e16..a41cca619338 100644 --- a/fs/nfsd/nfs3proc.c +++ b/fs/nfsd/nfs3proc.c @@ -67,12 +67,15 @@ nfsd3_proc_setattr(struct svc_rqst *rqstp)  {  	struct nfsd3_sattrargs *argp = rqstp->rq_argp;  	struct nfsd3_attrstat *resp = rqstp->rq_resp; +	struct nfsd_attrs attrs = { +		.na_iattr	= &argp->attrs, +	};  	dprintk("nfsd: SETATTR(3)  %s\n",  				SVCFH_fmt(&argp->fh));  	fh_copy(&resp->fh, &argp->fh); -	resp->status = nfsd_setattr(rqstp, &resp->fh, &argp->attrs, +	resp->status = nfsd_setattr(rqstp, &resp->fh, &attrs,  				    argp->check_guard, argp->guardtime);  	return rpc_success;  } @@ -233,6 +236,9 @@ nfsd3_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,  {  	struct iattr *iap = &argp->attrs;  	struct dentry *parent, *child; +	struct nfsd_attrs attrs = { +		.na_iattr	= iap, +	};  	__u32 v_mtime, v_atime;  	struct inode *inode;  	__be32 status; @@ -254,7 +260,7 @@ nfsd3_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,  	if (host_err)  		return nfserrno(host_err); -	fh_lock_nested(fhp, I_MUTEX_PARENT); +	inode_lock_nested(inode, I_MUTEX_PARENT);  	child = lookup_one_len(argp->name, parent, argp->len);  	if (IS_ERR(child)) { @@ -312,11 +318,13 @@ nfsd3_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,  	if (!IS_POSIXACL(inode))  		iap->ia_mode &= ~current_umask(); +	fh_fill_pre_attrs(fhp);  	host_err = vfs_create(&init_user_ns, inode, child, iap->ia_mode, true);  	if (host_err < 0) {  		status = nfserrno(host_err);  		goto out;  	} +	fh_fill_post_attrs(fhp);  	/* A newly created file already has a file size of zero. */  	if ((iap->ia_valid & ATTR_SIZE) && (iap->ia_size == 0)) @@ -331,10 +339,10 @@ nfsd3_create_file(struct svc_rqst *rqstp, struct svc_fh *fhp,  	}  set_attr: -	status = nfsd_create_setattr(rqstp, fhp, resfhp, iap); +	status = nfsd_create_setattr(rqstp, fhp, resfhp, &attrs);  out: -	fh_unlock(fhp); +	inode_unlock(inode);  	if (child && !IS_ERR(child))  		dput(child);  	fh_drop_write(fhp); @@ -368,6 +376,9 @@ nfsd3_proc_mkdir(struct svc_rqst *rqstp)  {  	struct nfsd3_createargs *argp = rqstp->rq_argp;  	struct nfsd3_diropres *resp = rqstp->rq_resp; +	struct nfsd_attrs attrs = { +		.na_iattr	= &argp->attrs, +	};  	dprintk("nfsd: MKDIR(3)    %s %.*s\n",  				SVCFH_fmt(&argp->fh), @@ -378,8 +389,7 @@ nfsd3_proc_mkdir(struct svc_rqst *rqstp)  	fh_copy(&resp->dirfh, &argp->fh);  	fh_init(&resp->fh, NFS3_FHSIZE);  	resp->status = nfsd_create(rqstp, &resp->dirfh, argp->name, argp->len, -				   &argp->attrs, S_IFDIR, 0, &resp->fh); -	fh_unlock(&resp->dirfh); +				   &attrs, S_IFDIR, 0, &resp->fh);  	return rpc_success;  } @@ -388,6 +398,9 @@ nfsd3_proc_symlink(struct svc_rqst *rqstp)  {  	struct nfsd3_symlinkargs *argp = rqstp->rq_argp;  	struct nfsd3_diropres *resp = rqstp->rq_resp; +	struct nfsd_attrs attrs = { +		.na_iattr	= &argp->attrs, +	};  	if (argp->tlen == 0) {  		resp->status = nfserr_inval; @@ -414,7 +427,7 @@ nfsd3_proc_symlink(struct svc_rqst *rqstp)  	fh_copy(&resp->dirfh, &argp->ffh);  	fh_init(&resp->fh, NFS3_FHSIZE);  	resp->status = nfsd_symlink(rqstp, &resp->dirfh, argp->fname, -				    argp->flen, argp->tname, &resp->fh); +				    argp->flen, argp->tname, &attrs, &resp->fh);  	kfree(argp->tname);  out:  	return rpc_success; @@ -428,6 +441,9 @@ nfsd3_proc_mknod(struct svc_rqst *rqstp)  {  	struct nfsd3_mknodargs *argp = rqstp->rq_argp;  	struct nfsd3_diropres  *resp = rqstp->rq_resp; +	struct nfsd_attrs attrs = { +		.na_iattr	= &argp->attrs, +	};  	int type;  	dev_t	rdev = 0; @@ -453,8 +469,7 @@ nfsd3_proc_mknod(struct svc_rqst *rqstp)  	type = nfs3_ftypes[argp->ftype];  	resp->status = nfsd_create(rqstp, &resp->dirfh, argp->name, argp->len, -				   &argp->attrs, type, rdev, &resp->fh); -	fh_unlock(&resp->dirfh); +				   &attrs, type, rdev, &resp->fh);  out:  	return rpc_success;  } @@ -477,7 +492,6 @@ nfsd3_proc_remove(struct svc_rqst *rqstp)  	fh_copy(&resp->fh, &argp->fh);  	resp->status = nfsd_unlink(rqstp, &resp->fh, -S_IFDIR,  				   argp->name, argp->len); -	fh_unlock(&resp->fh);  	return rpc_success;  } @@ -498,7 +512,6 @@ nfsd3_proc_rmdir(struct svc_rqst *rqstp)  	fh_copy(&resp->fh, &argp->fh);  	resp->status = nfsd_unlink(rqstp, &resp->fh, S_IFDIR,  				   argp->name, argp->len); -	fh_unlock(&resp->fh);  	return rpc_success;  }  |