From: NeilBrown Fix oops in release_lockowner. We need to break out to two loops, not just one, and if the loop finds nothing, 'local' won't be NULL. So just put the body of the 'if' inside the loop. From: Andy Adamson From: "J. Bruce Fields" Signed-off-by: Neil Brown --- 25-akpm/fs/nfsd/nfs4state.c | 41 ++++++++++++++++++++--------------------- 1 files changed, 20 insertions(+), 21 deletions(-) diff -puN fs/nfsd/nfs4state.c~knfsd-7-of-11-nfsd-releaselkownerpatch fs/nfsd/nfs4state.c --- 25/fs/nfsd/nfs4state.c~knfsd-7-of-11-nfsd-releaselkownerpatch 2004-05-28 00:10:38.706863072 -0700 +++ 25-akpm/fs/nfsd/nfs4state.c 2004-05-28 00:10:38.711862312 -0700 @@ -2334,28 +2334,27 @@ nfsd4_release_lockowner(struct svc_rqst /* find the lockowner */ status = nfs_ok; - for (i=0; i < LOCK_HASH_SIZE; i++) { - list_for_each_entry(local, &lock_ownerstr_hashtbl[i], so_strhash) { - if(cmp_owner_str(local, owner, clid)) - break; - } - } - if (local) { - struct nfs4_stateid *stp; - - /* check for any locks held by any stateid associated with the - * (lock) stateowner */ - status = nfserr_locks_held; - list_for_each_entry(stp, &local->so_perfilestate, st_perfilestate) { - if(stp->st_vfs_set) { - if (check_for_locks(&stp->st_vfs_file, local)) - goto out; + for (i=0; i < LOCK_HASH_SIZE; i++) + list_for_each_entry(local, &lock_ownerstr_hashtbl[i], so_strhash) + if(cmp_owner_str(local, owner, clid)) { + struct nfs4_stateid *stp; + + /* check for any locks held by any stateid + * associated with the (lock) stateowner */ + status = nfserr_locks_held; + list_for_each_entry(stp, &local->so_perfilestate, + st_perfilestate) { + if(stp->st_vfs_set) { + if (check_for_locks(&stp->st_vfs_file, + local)) + goto out; + } + } + /* no locks held by (lock) stateowner */ + status = nfs_ok; + release_stateowner(local); + goto out; } - } - /* no locks held by (lock) stateowner */ - status = nfs_ok; - release_stateowner(local); - } out: nfs4_unlock_state(); return status; _