]> git.proxmox.com Git - mirror_ubuntu-focal-kernel.git/commitdiff
NFSv4: Delegation recalls should not find revoked delegations
authorTrond Myklebust <trond.myklebust@hammerspace.com>
Tue, 22 Oct 2019 12:46:06 +0000 (08:46 -0400)
committerStefan Bader <stefan.bader@canonical.com>
Mon, 7 Mar 2022 15:37:05 +0000 (16:37 +0100)
BugLink: https://bugs.launchpad.net/bugs/1957986
If we're processsing a delegation recall, ignore the delegations that
have already been revoked or returned.

Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
(cherry picked from commit 457a50424bdde44fbd394ee459fdbfb9ffc4e412)
Signed-off-by: dann frazier <dann.frazier@canonical.com>
Acked-by: Stefan Bader <stefan.bader@canonical.com>
Acked-by: Tim Gardner <tim.gardner@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
fs/nfs/delegation.c

index af549d70ec507e3f8deb920c3a93509bd59a5ed2..c34bb81d37e2690109c5389015735db6b09dd991 100644 (file)
@@ -840,7 +840,7 @@ int nfs_async_inode_return_delegation(struct inode *inode,
        struct nfs_delegation *delegation;
 
        rcu_read_lock();
-       delegation = rcu_dereference(NFS_I(inode)->delegation);
+       delegation = nfs4_get_valid_delegation(inode);
        if (delegation == NULL)
                goto out_enoent;
        if (stateid != NULL &&
@@ -866,6 +866,7 @@ nfs_delegation_find_inode_server(struct nfs_server *server,
        list_for_each_entry_rcu(delegation, &server->delegations, super_list) {
                spin_lock(&delegation->lock);
                if (delegation->inode != NULL &&
+                   !test_bit(NFS_DELEGATION_REVOKED, &delegation->flags) &&
                    nfs_compare_fh(fhandle, &NFS_I(delegation->inode)->fh) == 0) {
                        freeme = igrab(delegation->inode);
                        if (freeme && nfs_sb_active(freeme->i_sb))