nfsd4: fix lockowner matching
Subsystems (2)
PATCH 1/1 nfsd4: fix lockowner matching
From: "J. Bruce Fields" <[email protected]>
Lockowners are looked up by file as well as by owner, but we were forgetting to do a comparison on the file. This could cause an incorrect result from lockt.
(Note looking up the inode from the lockowner is pretty awkward here. The data structures need fixing.)
Signed-off-by J. Bruce Fields <[email protected]>
--- fs/nfsd/nfs4state.c | 17 +++++++++++++++-- 1 files changed, 15 insertions(+), 2 deletions(-)
fs/nfsd/nfs4state.c +15 -2
@@ -3809,16 +3809,29 @@ nevermind: deny->ld_type =NFS4_WRITE_LT ; } +static bool same_lockowner_ino (struct nfs4_lockowner *lo,struct inode *inode,clientid_t *clid,struct xdr_netobj *owner) +{ +struct nfs4_ol_stateid *lst; + +if (!same_owner_str (&lo->lo_owner, owner, clid)) +return false; + lst =list_first_entry (&lo->lo_owner.so_stateids, + struct nfs4_ol_stateid, st_perstateowner); +return lst->st_file->fi_inode == inode; +} +static struct nfs4_lockowner *find_lockowner_str (struct inode *inode,clientid_t *clid,struct xdr_netobj *owner) {unsigned int hashval =lock_ownerstr_hashval (inode, clid->cl_id, owner); +struct nfs4_lockowner *lo;struct nfs4_stateowner *op;list_for_each_entry (op, &lock_ownerstr_hashtbl[hashval], so_strhash) { -if (same_owner_str (op, owner, clid)) -return lockowner (op); + lo =lockowner (op); +if (same_lockowner_ino (lo, inode, clid, owner)) +return lo; }return NULL ; }
Signature · 1 line
1.7.5.4