nfsd4: remove lockowner when removing lock stateid
authorJ. Bruce Fields <bfields@redhat.com>
Tue, 20 May 2014 19:55:21 +0000 (15:55 -0400)
committerJ. Bruce Fields <bfields@redhat.com>
Wed, 21 May 2014 15:11:21 +0000 (11:11 -0400)
The nfsv4 state code has always assumed a one-to-one correspondance
between lock stateid's and lockowners even if it appears not to in some
places.

We may actually change that, but for now when FREE_STATEID releases a
lock stateid it also needs to release the parent lockowner.

Symptoms were a subsequent LOCK crashing in find_lockowner_str when it
calls same_lockowner_ino on a lockowner that unexpectedly has an empty
so_stateids list.

Cc: stable@vger.kernel.org
Signed-off-by: J. Bruce Fields <bfields@redhat.com>
fs/nfsd/nfs4state.c

index 32b699bebb9c3e7281ba58e1d123dc6c2f0ce361..89e42409b23749e5be540ffe34a7f46392b0bbc4 100644 (file)
@@ -3717,9 +3717,16 @@ out:
 static __be32
 nfsd4_free_lock_stateid(struct nfs4_ol_stateid *stp)
 {
-       if (check_for_locks(stp->st_file, lockowner(stp->st_stateowner)))
+       struct nfs4_lockowner *lo = lockowner(stp->st_stateowner);
+
+       if (check_for_locks(stp->st_file, lo))
                return nfserr_locks_held;
-       release_lock_stateid(stp);
+       /*
+        * Currently there's a 1-1 lock stateid<->lockowner
+        * correspondance, and we have to delete the lockowner when we
+        * delete the lock stateid:
+        */
+       unhash_lockowner(lo);
        return nfs_ok;
 }
 
This page took 0.028257 seconds and 5 git commands to generate.