diff options
Diffstat (limited to 'fs/nfsd/nfs4state.c')
| -rw-r--r-- | fs/nfsd/nfs4state.c | 23 | 
1 files changed, 9 insertions, 14 deletions
diff --git a/fs/nfsd/nfs4state.c b/fs/nfsd/nfs4state.c index 1841f8bf845..7f71c69cdcd 100644 --- a/fs/nfsd/nfs4state.c +++ b/fs/nfsd/nfs4state.c @@ -4211,16 +4211,14 @@ out:   * vfs_test_lock.  (Arguably perhaps test_lock should be done with an   * inode operation.)   */ -static int nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock) +static __be32 nfsd_test_lock(struct svc_rqst *rqstp, struct svc_fh *fhp, struct file_lock *lock)  {  	struct file *file; -	int err; - -	err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file); -	if (err) -		return err; -	err = vfs_test_lock(file, lock); -	nfsd_close(file); +	__be32 err = nfsd_open(rqstp, fhp, S_IFREG, NFSD_MAY_READ, &file); +	if (!err) { +		err = nfserrno(vfs_test_lock(file, lock)); +		nfsd_close(file); +	}  	return err;  } @@ -4234,7 +4232,6 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,  	struct inode *inode;  	struct file_lock file_lock;  	struct nfs4_lockowner *lo; -	int error;  	__be32 status;  	if (locks_in_grace()) @@ -4280,12 +4277,10 @@ nfsd4_lockt(struct svc_rqst *rqstp, struct nfsd4_compound_state *cstate,  	nfs4_transform_lock_offset(&file_lock); -	status = nfs_ok; -	error = nfsd_test_lock(rqstp, &cstate->current_fh, &file_lock); -	if (error) { -		status = nfserrno(error); +	status = nfsd_test_lock(rqstp, &cstate->current_fh, &file_lock); +	if (status)  		goto out; -	} +  	if (file_lock.fl_type != F_UNLCK) {  		status = nfserr_denied;  		nfs4_set_lock_denied(&file_lock, &lockt->lt_denied);  |