summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorOlga Kornievskaia <okorniev@redhat.com>2026-04-10 12:48:05 -0400
committerTrond Myklebust <trond.myklebust@hammerspace.com>2026-04-13 14:45:24 -0700
commit515af10044f1c0d6f4356fcfb313465f02f484e9 (patch)
tree2d38cbfcb40484dd0b740daf1c1d04d724e05246
parent4fa7ab8d292b1d4271fad397d98ea440e474cd7f (diff)
NFSv4: retry GETATTR if GET_DIR_DELEGATION failed
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>
-rw-r--r--fs/nfs/nfs4proc.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index dd800403a7ce..c2078545242e 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -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;