Commit 515af100 authored by Olga Kornievskaia's avatar Olga Kornievskaia Committed by Trond Myklebust
Browse files

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: 156b0948 ("NFS: Request a directory delegation on ACCESS, CREATE, and UNLINK")
Signed-off-by: default avatarOlga Kornievskaia <okorniev@redhat.com>
Signed-off-by: default avatarTrond Myklebust <trond.myklebust@hammerspace.com>
parent 4fa7ab8d
Loading
Loading
Loading
Loading
+8 −0
Original line number Diff line number Diff line
@@ -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;