2006-01-13 01:01:02

by NeilBrown

[permalink] [raw]
Subject: [PATCH kNFSd 005 of 26] nfsd4: fix nfsd4_lock cleanup on failure


release_state_owner also puts the lock owner on the close_lru. There's no need
for that, though; replays of the failed lock would be handled by the openowner
not the lockowner.

Also consolidate the cleanup a bit, fixing leaks that can happen if errors
occur between the time a new lock owner is allocated and the lock is done.

Remove a comment and dprintk that look a little redundant.

Signed-off-by: J. Bruce Fields <[email protected]>
Signed-off-by: Neil Brown <[email protected]>

### Diffstat output
./fs/nfsd/nfs4state.c | 18 ++++--------------
1 file changed, 4 insertions(+), 14 deletions(-)

diff ./fs/nfsd/nfs4state.c~current~ ./fs/nfsd/nfs4state.c
--- ./fs/nfsd/nfs4state.c~current~ 2006-01-13 11:51:05.000000000 +1100
+++ ./fs/nfsd/nfs4state.c 2006-01-13 11:51:05.000000000 +1100
@@ -2744,10 +2744,8 @@ nfsd4_lock(struct svc_rqst *rqstp, struc
if (lock_sop == NULL)
goto out;
lock_stp = alloc_init_lock_stateid(lock_sop, fp, open_stp);
- if (lock_stp == NULL) {
- release_stateowner(lock_sop);
+ if (lock_stp == NULL)
goto out;
- }
} else {
/* lock (lock owner + lock stateid) already exists */
status = nfs4_preprocess_seqid_op(current_fh,
@@ -2815,7 +2813,7 @@ nfsd4_lock(struct svc_rqst *rqstp, struc
status = nfserr_deadlock;
default:
dprintk("NFSD: nfsd4_lock: posix_lock_file() failed! status %d\n",status);
- goto out_destroy_new_stateid;
+ goto out;
}

conflicting_lock:
@@ -2829,17 +2827,9 @@ conflicting_lock:
goto out;
}
nfs4_set_lock_denied(conflock, &lock->lk_denied);
-
-out_destroy_new_stateid:
- if (lock->lk_is_new) {
- dprintk("NFSD: nfsd4_lock: destroy new stateid!\n");
- /*
- * An error encountered after instantiation of the new
- * stateid has forced us to destroy it.
- */
- release_state_owner(lock_stp, LOCK_STATE);
- }
out:
+ if (status && lock->lk_is_new && lock_sop)
+ release_stateowner(lock_sop);
if (lock->lk_stateowner) {
nfs4_get_stateowner(lock->lk_stateowner);
*replay_owner = lock->lk_stateowner;


-------------------------------------------------------
This SF.net email is sponsored by: Splunk Inc. Do you grep through log files
for problems? Stop! Download the new AJAX search engine that makes
searching your log files as easy as surfing the web. DOWNLOAD SPLUNK!
http://ads.osdn.com/?ad_id=7637&alloc_id=16865&op=click
_______________________________________________
NFS maillist - [email protected]
https://lists.sourceforge.net/lists/listinfo/nfs