If an NFSv4.1 server doesn't support NFS4_OPEN_CLAIM_DELEG_CUR_FH (e.g. Linux 3.0), and a newer NFS client tries to use it to claim an open before returning a delegation, the server might return NFS4ERR_BADXDR. That is what Linux 3.0 does, though the RFC doesn't seem to be explicit on which flags must be supported, and what error can be returned for unsupported flags. When NFS_CAP_ATOMIC_OPEN_V1 support was added in Commit 49f9a0fafd84 ("NFSv4.1: Enable open-by-filehandle"), fall-back for non-supporting servers was added for various open types, but not for delegation recall. The code pattern for delegation recall is a little different to the other open types, so I cannot simply copy the same approach. I think the below patch should do the right thing, but I haven't tested yet. Does this look reasonable? Is there a cleaner way to do it? Should we check other errors? Thanks, NeilBrown diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index caacf5e7f5e1..14f958d16648 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2174,6 +2174,13 @@ static int nfs4_open_reclaim(struct nfs4_state_owner *sp, struct nfs4_state *sta static int nfs4_handle_delegation_recall_error(struct nfs_server *server, struct nfs4_state *state, const nfs4_stateid *stateid, struct file_lock *fl, int err) { switch (err) { + case -NFS4ERR_BADXDR: { + struct nfs4_exception exception; + if (nfs4_clear_cap_atomic_open_v1(server, -EINVAL, + &exception)) + return -EAGAIN; + } + /* fallthrough */ default: printk(KERN_ERR "NFS: %s: unhandled error " "%d.\n", __func__, err);
Attachment:
signature.asc
Description: PGP signature