From: J. Bruce Fields 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 Signed-off-by: Neil Brown Signed-off-by: Andrew Morton --- fs/nfsd/nfs4state.c | 18 ++++-------------- 1 files changed, 4 insertions(+), 14 deletions(-) diff -puN fs/nfsd/nfs4state.c~nfsd4-fix-nfsd4_lock-cleanup-on-failure fs/nfsd/nfs4state.c --- 25/fs/nfsd/nfs4state.c~nfsd4-fix-nfsd4_lock-cleanup-on-failure Fri Jan 13 17:54:22 2006 +++ 25-akpm/fs/nfsd/nfs4state.c Fri Jan 13 17:54:22 2006 @@ -2745,10 +2745,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, @@ -2816,7 +2814,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: @@ -2830,17 +2828,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; _