]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
NFSv4: retry GETATTR if GET_DIR_DELEGATION failed
authorOlga Kornievskaia <okorniev@redhat.com>
Fri, 10 Apr 2026 16:48:05 +0000 (12:48 -0400)
committerTrond Myklebust <trond.myklebust@hammerspace.com>
Mon, 13 Apr 2026 21:45:24 +0000 (14:45 -0700)
Currently, getting a directory delegation is opportinistic and gets
added to an existing GETATTR that's trying to retrieve some needed
attributes. However, GET_DIRDELEGATION can fail and that currently
causes a GETATTR to fail and an error is propagated to the user.

Instead, the original GETATTR should be retried without requesting
a directory delegation. Also, now chosing to clear asking for
the direct delegation for this specific inode.

Fixes: 156b09482933 ("NFS: Request a directory delegation on ACCESS, CREATE, and UNLINK")
Signed-off-by: Olga Kornievskaia <okorniev@redhat.com>
Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
fs/nfs/nfs4proc.c

index dd800403a7cecc883edbc612146419c1184ab5e3..c2078545242efb8db9a0687bf70009887fe9f56a 100644 (file)
@@ -4469,6 +4469,13 @@ static int _nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
                case -ENOTSUPP:
                case -EOPNOTSUPP:
                        server->caps &= ~NFS_CAP_DIR_DELEG;
+                       break;
+               case -NFS4ERR_INVAL:
+               case -NFS4ERR_IO:
+               case -NFS4ERR_DIRDELEG_UNAVAIL:
+               case -NFS4ERR_NOTDIR:
+                       clear_bit(NFS_INO_REQ_DIR_DELEG, &(NFS_I(inode)->flags));
+                       status = -EAGAIN;
                }
        }
 
@@ -4490,6 +4497,7 @@ int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle,
                default:
                        err = nfs4_handle_exception(server, err, &exception);
                        break;
+               case -EAGAIN:
                case -ENOTSUPP:
                case -EOPNOTSUPP:
                        exception.retry = true;