diff options
Diffstat (limited to 'fs/nfsd/vfs.c')
| -rw-r--r-- | fs/nfsd/vfs.c | 9 | 
1 files changed, 8 insertions, 1 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 2e1cebde90d..129f3c9f62d 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -1363,7 +1363,7 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,  		goto out;  	if (!(iap->ia_valid & ATTR_MODE))  		iap->ia_mode = 0; -	err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_CREATE); +	err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_EXEC);  	if (err)  		goto out; @@ -1385,6 +1385,13 @@ nfsd_create_v3(struct svc_rqst *rqstp, struct svc_fh *fhp,  	if (IS_ERR(dchild))  		goto out_nfserr; +	/* If file doesn't exist, check for permissions to create one */ +	if (!dchild->d_inode) { +		err = fh_verify(rqstp, fhp, S_IFDIR, NFSD_MAY_CREATE); +		if (err) +			goto out; +	} +  	err = fh_compose(resfhp, fhp->fh_export, dchild, fhp);  	if (err)  		goto out;  |