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: 156b094829 ("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>
This commit is contained in:
Olga Kornievskaia 2026-04-10 12:48:05 -04:00 committed by Trond Myklebust
parent 4fa7ab8d29
commit 515af10044

View 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;