diff options
author | Chuck Lever <chuck.lever@oracle.com> | 2012-07-11 16:30:50 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2012-07-16 15:12:16 -0400 |
commit | de734831224e74fcaf8917386e33644c4243db95 (patch) | |
tree | cc162230a4ae0086b5d2c4bb9e9163d18d82b826 /include | |
parent | 46a87b8a7b939900d779042da7097bf330ab787f (diff) |
NFS: Treat NFS4ERR_CLID_INUSE as a fatal error
For NFSv4 minor version 0, currently the cl_id_uniquifier allows the
Linux client to generate a unique nfs_client_id4 string whenever a
server replies with NFS4ERR_CLID_INUSE.
This implementation seems to be based on a flawed reading of RFC
3530. NFS4ERR_CLID_INUSE actually means that the client has presented
this nfs_client_id4 string with a different principal at some time in
the past, and that lease is still in use on the server.
For a Linux client this might be rather difficult to achieve: the
authentication flavor is named right in the nfs_client_id4.id
string. If we change flavors, we change strings automatically.
So, practically speaking, NFS4ERR_CLID_INUSE means there is some other
client using our string. There is not much that can be done to
recover automatically. Let's make it a permanent error.
Remove the recovery logic in nfs4_proc_setclientid(), and remove the
cl_id_uniquifier field from the nfs_client data structure. And,
remove the authentication flavor from the nfs_client_id4 string.
Keeping the authentication flavor in the nfs_client_id4.id string
means that we could have a separate lease for each authentication
flavor used by mounts on the client. But we want just one lease for
all the mounts on this client.
Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'include')
-rw-r--r-- | include/linux/nfs_fs_sb.h | 3 |
1 files changed, 1 insertions, 2 deletions
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h index f58325a1d8fb..65327652c61a 100644 --- a/include/linux/nfs_fs_sb.h +++ b/include/linux/nfs_fs_sb.h | |||
@@ -69,10 +69,9 @@ struct nfs_client { | |||
69 | struct idmap * cl_idmap; | 69 | struct idmap * cl_idmap; |
70 | 70 | ||
71 | /* Our own IP address, as a null-terminated string. | 71 | /* Our own IP address, as a null-terminated string. |
72 | * This is used to generate the clientid, and the callback address. | 72 | * This is used to generate the mv0 callback address. |
73 | */ | 73 | */ |
74 | char cl_ipaddr[48]; | 74 | char cl_ipaddr[48]; |
75 | unsigned char cl_id_uniquifier; | ||
76 | u32 cl_cb_ident; /* v4.0 callback identifier */ | 75 | u32 cl_cb_ident; /* v4.0 callback identifier */ |
77 | const struct nfs4_minor_version_ops *cl_mvops; | 76 | const struct nfs4_minor_version_ops *cl_mvops; |
78 | 77 | ||