|
@@ -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;
|
|
|
}
|