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>
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;
}
}
default:
err = nfs4_handle_exception(server, err, &exception);
break;
+ case -EAGAIN:
case -ENOTSUPP:
case -EOPNOTSUPP:
exception.retry = true;