]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
NFS: simplify the detached delegation check in update_open_stateid
authorChristoph Hellwig <hch@lst.de>
Wed, 7 Jan 2026 07:27:07 +0000 (08:27 +0100)
committerAnna Schumaker <anna.schumaker@oracle.com>
Tue, 20 Jan 2026 19:49:46 +0000 (14:49 -0500)
When nfs_detach_delegation_locked detaches a delegation from an inode,
it clears both nfsi->delegation and delegation->inode.  Use the later
in update_open_stateid to check for a detached inode, as that avoids
an extra local variable, and removes the need for a RCU derefernence
as we already hold the lock in the delegation.  This prepares for
removing the surrounding RCU critical section.

Signed-off-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Anna Schumaker <anna.schumaker@oracle.com>
fs/nfs/nfs4proc.c

index 5adaca5e476cf382dd51f74cad21a5959db8c5cf..935ec446e52e6014a0f4657a36297a2626a791fd 100644 (file)
@@ -1907,7 +1907,6 @@ int update_open_stateid(struct nfs4_state *state,
 {
        struct nfs_server *server = NFS_SERVER(state->inode);
        struct nfs_client *clp = server->nfs_client;
-       struct nfs_inode *nfsi = NFS_I(state->inode);
        struct nfs_delegation *deleg_cur;
        nfs4_stateid freeme = { };
        int ret = 0;
@@ -1926,7 +1925,7 @@ int update_open_stateid(struct nfs4_state *state,
                goto no_delegation;
 
        spin_lock(&deleg_cur->lock);
-       if (rcu_dereference(nfsi->delegation) != deleg_cur ||
+       if (!deleg_cur->inode ||
           test_bit(NFS_DELEGATION_RETURNING, &deleg_cur->flags) ||
            (deleg_cur->type & fmode) != fmode)
                goto no_delegation_unlock;