diff options
Diffstat (limited to 'fs/nfsd/vfs.c')
| -rw-r--r-- | fs/nfsd/vfs.c | 21 | 
1 files changed, 14 insertions, 7 deletions
diff --git a/fs/nfsd/vfs.c b/fs/nfsd/vfs.c index 641117f2188d..da1d9701f8e4 100644 --- a/fs/nfsd/vfs.c +++ b/fs/nfsd/vfs.c @@ -808,7 +808,7 @@ nfsd_get_raparms(dev_t dev, ino_t ino)  		if (ra->p_count == 0)  			frap = rap;  	} -	depth = nfsdstats.ra_size*11/10; +	depth = nfsdstats.ra_size;  	if (!frap) {	  		spin_unlock(&rab->pb_lock);  		return NULL; @@ -1744,6 +1744,13 @@ nfsd_rename(struct svc_rqst *rqstp, struct svc_fh *ffhp, char *fname, int flen,  	host_err = nfsd_break_lease(odentry->d_inode);  	if (host_err)  		goto out_drop_write; +	if (ndentry->d_inode) { +		host_err = nfsd_break_lease(ndentry->d_inode); +		if (host_err) +			goto out_drop_write; +	} +	if (host_err) +		goto out_drop_write;  	host_err = vfs_rename(fdir, odentry, tdir, ndentry);  	if (!host_err) {  		host_err = commit_metadata(tfhp); @@ -1812,22 +1819,22 @@ nfsd_unlink(struct svc_rqst *rqstp, struct svc_fh *fhp, int type,  	host_err = mnt_want_write(fhp->fh_export->ex_path.mnt);  	if (host_err) -		goto out_nfserr; +		goto out_put;  	host_err = nfsd_break_lease(rdentry->d_inode);  	if (host_err) -		goto out_put; +		goto out_drop_write;  	if (type != S_IFDIR)  		host_err = vfs_unlink(dirp, rdentry);  	else  		host_err = vfs_rmdir(dirp, rdentry); -out_put: -	dput(rdentry); -  	if (!host_err)  		host_err = commit_metadata(fhp); - +out_drop_write:  	mnt_drop_write(fhp->fh_export->ex_path.mnt); +out_put: +	dput(rdentry); +  out_nfserr:  	err = nfserrno(host_err);  out:  | 
