diff options
author | Steve Dickson <steved@redhat.com> | 2013-05-22 12:50:38 -0400 |
---|---|---|
committer | Trond Myklebust <Trond.Myklebust@netapp.com> | 2013-06-08 16:20:13 -0400 |
commit | 42c2c4249cd0192e29eec71e3e94d7bbc383c8de (patch) | |
tree | 7b82190aaaf9fd8ecb7404559b0f8cd0a49e818f /fs/nfs | |
parent | eb9ae686507bc5a5ca78e6b3fbe629cd5cc67864 (diff) |
NFSv4.2: Added NFS v4.2 support to the NFS client
This enable NFSv4.2 support. To enable this code the
CONFIG_NFS_V4_2 Kconfig define needs to be set and
the -o v4.2 mount option need to be used.
Signed-off-by: Steve Dickson <steved@redhat.com>
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
Diffstat (limited to 'fs/nfs')
-rw-r--r-- | fs/nfs/Kconfig | 9 | ||||
-rw-r--r-- | fs/nfs/callback.c | 1 | ||||
-rw-r--r-- | fs/nfs/callback_xdr.c | 6 | ||||
-rw-r--r-- | fs/nfs/nfs4client.c | 5 | ||||
-rw-r--r-- | fs/nfs/nfs4proc.c | 15 | ||||
-rw-r--r-- | fs/nfs/super.c | 7 |
6 files changed, 39 insertions, 4 deletions
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig index 13ca196385f5..a048928340a7 100644 --- a/fs/nfs/Kconfig +++ b/fs/nfs/Kconfig | |||
@@ -104,6 +104,15 @@ config NFS_V4_1 | |||
104 | 104 | ||
105 | If unsure, say N. | 105 | If unsure, say N. |
106 | 106 | ||
107 | config NFS_V4_2 | ||
108 | bool "NFS client support for NFSv4.2" | ||
109 | depends on NFS_V4_1 | ||
110 | help | ||
111 | This option enables support for minor version 2 of the NFSv4 protocol | ||
112 | in the kernel's NFS client. | ||
113 | |||
114 | If unsure, say N. | ||
115 | |||
107 | config PNFS_FILE_LAYOUT | 116 | config PNFS_FILE_LAYOUT |
108 | tristate | 117 | tristate |
109 | depends on NFS_V4_1 | 118 | depends on NFS_V4_1 |
diff --git a/fs/nfs/callback.c b/fs/nfs/callback.c index cff089a412c7..78e368d8186d 100644 --- a/fs/nfs/callback.c +++ b/fs/nfs/callback.c | |||
@@ -282,6 +282,7 @@ static int nfs_callback_up_net(int minorversion, struct svc_serv *serv, struct n | |||
282 | ret = nfs4_callback_up_net(serv, net); | 282 | ret = nfs4_callback_up_net(serv, net); |
283 | break; | 283 | break; |
284 | case 1: | 284 | case 1: |
285 | case 2: | ||
285 | ret = nfs41_callback_up_net(serv, net); | 286 | ret = nfs41_callback_up_net(serv, net); |
286 | break; | 287 | break; |
287 | default: | 288 | default: |
diff --git a/fs/nfs/callback_xdr.c b/fs/nfs/callback_xdr.c index 59461c957d9d..e7ee62929811 100644 --- a/fs/nfs/callback_xdr.c +++ b/fs/nfs/callback_xdr.c | |||
@@ -166,9 +166,9 @@ static __be32 decode_compound_hdr_arg(struct xdr_stream *xdr, struct cb_compound | |||
166 | if (unlikely(p == NULL)) | 166 | if (unlikely(p == NULL)) |
167 | return htonl(NFS4ERR_RESOURCE); | 167 | return htonl(NFS4ERR_RESOURCE); |
168 | hdr->minorversion = ntohl(*p++); | 168 | hdr->minorversion = ntohl(*p++); |
169 | /* Check minor version is zero or one. */ | 169 | /* Check minor version is zero or one or two. */ |
170 | if (hdr->minorversion <= 1) { | 170 | if (hdr->minorversion <= 2) { |
171 | hdr->cb_ident = ntohl(*p++); /* ignored by v4.1 */ | 171 | hdr->cb_ident = ntohl(*p++); /* ignored by v4.1 and v4.2 */ |
172 | } else { | 172 | } else { |
173 | pr_warn_ratelimited("NFS: %s: NFSv4 server callback with " | 173 | pr_warn_ratelimited("NFS: %s: NFSv4 server callback with " |
174 | "illegal minor version %u!\n", | 174 | "illegal minor version %u!\n", |
diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c index 947b0c908aa9..2a297eeda474 100644 --- a/fs/nfs/nfs4client.c +++ b/fs/nfs/nfs4client.c | |||
@@ -66,6 +66,11 @@ struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init) | |||
66 | if (err) | 66 | if (err) |
67 | goto error; | 67 | goto error; |
68 | 68 | ||
69 | if (cl_init->minorversion > NFS4_MAX_MINOR_VERSION) { | ||
70 | err = -EINVAL; | ||
71 | goto error; | ||
72 | } | ||
73 | |||
69 | spin_lock_init(&clp->cl_lock); | 74 | spin_lock_init(&clp->cl_lock); |
70 | INIT_DELAYED_WORK(&clp->cl_renewd, nfs4_renew_state); | 75 | INIT_DELAYED_WORK(&clp->cl_renewd, nfs4_renew_state); |
71 | rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client"); | 76 | rpc_init_wait_queue(&clp->cl_rpcwaitq, "NFS client"); |
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 8fbc10054115..abf46f4b5d19 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c | |||
@@ -7004,11 +7004,26 @@ static const struct nfs4_minor_version_ops nfs_v4_1_minor_ops = { | |||
7004 | }; | 7004 | }; |
7005 | #endif | 7005 | #endif |
7006 | 7006 | ||
7007 | #if defined(CONFIG_NFS_V4_2) | ||
7008 | static const struct nfs4_minor_version_ops nfs_v4_2_minor_ops = { | ||
7009 | .minor_version = 2, | ||
7010 | .call_sync = nfs4_call_sync_sequence, | ||
7011 | .match_stateid = nfs41_match_stateid, | ||
7012 | .find_root_sec = nfs41_find_root_sec, | ||
7013 | .reboot_recovery_ops = &nfs41_reboot_recovery_ops, | ||
7014 | .nograce_recovery_ops = &nfs41_nograce_recovery_ops, | ||
7015 | .state_renewal_ops = &nfs41_state_renewal_ops, | ||
7016 | }; | ||
7017 | #endif | ||
7018 | |||
7007 | const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = { | 7019 | const struct nfs4_minor_version_ops *nfs_v4_minor_ops[] = { |
7008 | [0] = &nfs_v4_0_minor_ops, | 7020 | [0] = &nfs_v4_0_minor_ops, |
7009 | #if defined(CONFIG_NFS_V4_1) | 7021 | #if defined(CONFIG_NFS_V4_1) |
7010 | [1] = &nfs_v4_1_minor_ops, | 7022 | [1] = &nfs_v4_1_minor_ops, |
7011 | #endif | 7023 | #endif |
7024 | #if defined(CONFIG_NFS_V4_2) | ||
7025 | [2] = &nfs_v4_2_minor_ops, | ||
7026 | #endif | ||
7012 | }; | 7027 | }; |
7013 | 7028 | ||
7014 | const struct inode_operations nfs4_dir_inode_operations = { | 7029 | const struct inode_operations nfs4_dir_inode_operations = { |
diff --git a/fs/nfs/super.c b/fs/nfs/super.c index c1bbb53d444a..2e94f2168b03 100644 --- a/fs/nfs/super.c +++ b/fs/nfs/super.c | |||
@@ -269,7 +269,7 @@ static match_table_t nfs_local_lock_tokens = { | |||
269 | 269 | ||
270 | enum { | 270 | enum { |
271 | Opt_vers_2, Opt_vers_3, Opt_vers_4, Opt_vers_4_0, | 271 | Opt_vers_2, Opt_vers_3, Opt_vers_4, Opt_vers_4_0, |
272 | Opt_vers_4_1, | 272 | Opt_vers_4_1, Opt_vers_4_2, |
273 | 273 | ||
274 | Opt_vers_err | 274 | Opt_vers_err |
275 | }; | 275 | }; |
@@ -280,6 +280,7 @@ static match_table_t nfs_vers_tokens = { | |||
280 | { Opt_vers_4, "4" }, | 280 | { Opt_vers_4, "4" }, |
281 | { Opt_vers_4_0, "4.0" }, | 281 | { Opt_vers_4_0, "4.0" }, |
282 | { Opt_vers_4_1, "4.1" }, | 282 | { Opt_vers_4_1, "4.1" }, |
283 | { Opt_vers_4_2, "4.2" }, | ||
283 | 284 | ||
284 | { Opt_vers_err, NULL } | 285 | { Opt_vers_err, NULL } |
285 | }; | 286 | }; |
@@ -1097,6 +1098,10 @@ static int nfs_parse_version_string(char *string, | |||
1097 | mnt->version = 4; | 1098 | mnt->version = 4; |
1098 | mnt->minorversion = 1; | 1099 | mnt->minorversion = 1; |
1099 | break; | 1100 | break; |
1101 | case Opt_vers_4_2: | ||
1102 | mnt->version = 4; | ||
1103 | mnt->minorversion = 2; | ||
1104 | break; | ||
1100 | default: | 1105 | default: |
1101 | return 0; | 1106 | return 0; |
1102 | } | 1107 | } |