Commit db8ac8ba authored by Weston Andros Adamson's avatar Weston Andros Adamson Committed by Trond Myklebust

NFSv4: Send implementation id with exchange_id

Send the nfs implementation id in EXCHANGE_ID requests unless the module
parameter nfs.send_implementation_id is 0.

This adds a CONFIG variable for the nii_domain that defaults to "kernel.org".
Signed-off-by: default avatarWeston Andros Adamson <dros@netapp.com>
Signed-off-by: default avatarTrond Myklebust <Trond.Myklebust@netapp.com>
parent 57e62324
...@@ -1678,6 +1678,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted. ...@@ -1678,6 +1678,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
back to using the idmapper. back to using the idmapper.
To turn off this behaviour, set the value to '0'. To turn off this behaviour, set the value to '0'.
nfs.send_implementation_id =
[NFSv4.1] Send client implementation identification
information in exchange_id requests.
If zero, no implementation identification information
will be sent.
The default is to send the implementation identification
information.
nmi_debug= [KNL,AVR32,SH] Specify one or more actions to take nmi_debug= [KNL,AVR32,SH] Specify one or more actions to take
when a NMI is triggered. when a NMI is triggered.
Format: [state][,regs][,debounce][,die] Format: [state][,regs][,debounce][,die]
......
...@@ -99,6 +99,18 @@ config PNFS_OBJLAYOUT ...@@ -99,6 +99,18 @@ config PNFS_OBJLAYOUT
depends on NFS_FS && NFS_V4_1 && SCSI_OSD_ULD depends on NFS_FS && NFS_V4_1 && SCSI_OSD_ULD
default m default m
config NFS_V4_1_IMPLEMENTATION_ID_DOMAIN
string "NFSv4.1 Implementation ID Domain"
depends on NFS_V4_1
default "kernel.org"
help
This option defines the domain portion of the implementation ID that
may be sent in the NFS exchange_id operation. The value must be in
the format of a DNS domain name and should be set to the DNS domain
name of the distribution.
If the NFS client is unchanged from the upstream kernel, this
option should be set to the default "kernel.org".
config ROOT_NFS config ROOT_NFS
bool "Root file system on NFS" bool "Root file system on NFS"
depends on NFS_FS=y && IP_PNP depends on NFS_FS=y && IP_PNP
......
...@@ -44,6 +44,8 @@ ...@@ -44,6 +44,8 @@
#include <linux/pagemap.h> #include <linux/pagemap.h>
#include <linux/proc_fs.h> #include <linux/proc_fs.h>
#include <linux/kdev_t.h> #include <linux/kdev_t.h>
#include <linux/module.h>
#include <linux/utsname.h>
#include <linux/sunrpc/clnt.h> #include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/msg_prot.h> #include <linux/sunrpc/msg_prot.h>
#include <linux/sunrpc/gss_api.h> #include <linux/sunrpc/gss_api.h>
...@@ -271,7 +273,12 @@ static int nfs4_stat_to_errno(int); ...@@ -271,7 +273,12 @@ static int nfs4_stat_to_errno(int);
1 /* flags */ + \ 1 /* flags */ + \
1 /* spa_how */ + \ 1 /* spa_how */ + \
0 /* SP4_NONE (for now) */ + \ 0 /* SP4_NONE (for now) */ + \
1 /* zero implemetation id array */) 1 /* implementation id array of size 1 */ + \
1 /* nii_domain */ + \
XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
1 /* nii_name */ + \
XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
3 /* nii_date */)
#define decode_exchange_id_maxsz (op_decode_hdr_maxsz + \ #define decode_exchange_id_maxsz (op_decode_hdr_maxsz + \
2 /* eir_clientid */ + \ 2 /* eir_clientid */ + \
1 /* eir_sequenceid */ + \ 1 /* eir_sequenceid */ + \
...@@ -838,6 +845,12 @@ const u32 nfs41_maxread_overhead = ((RPC_MAX_HEADER_WITH_AUTH + ...@@ -838,6 +845,12 @@ const u32 nfs41_maxread_overhead = ((RPC_MAX_HEADER_WITH_AUTH +
XDR_UNIT); XDR_UNIT);
#endif /* CONFIG_NFS_V4_1 */ #endif /* CONFIG_NFS_V4_1 */
static unsigned short send_implementation_id = 1;
module_param(send_implementation_id, ushort, 0644);
MODULE_PARM_DESC(send_implementation_id,
"Send implementation ID with NFSv4.1 exchange_id");
static const umode_t nfs_type2fmt[] = { static const umode_t nfs_type2fmt[] = {
[NF4BAD] = 0, [NF4BAD] = 0,
[NF4REG] = S_IFREG, [NF4REG] = S_IFREG,
...@@ -1766,6 +1779,8 @@ static void encode_exchange_id(struct xdr_stream *xdr, ...@@ -1766,6 +1779,8 @@ static void encode_exchange_id(struct xdr_stream *xdr,
struct compound_hdr *hdr) struct compound_hdr *hdr)
{ {
__be32 *p; __be32 *p;
char impl_name[NFS4_OPAQUE_LIMIT];
int len = 0;
p = reserve_space(xdr, 4 + sizeof(args->verifier->data)); p = reserve_space(xdr, 4 + sizeof(args->verifier->data));
*p++ = cpu_to_be32(OP_EXCHANGE_ID); *p++ = cpu_to_be32(OP_EXCHANGE_ID);
...@@ -1776,7 +1791,29 @@ static void encode_exchange_id(struct xdr_stream *xdr, ...@@ -1776,7 +1791,29 @@ static void encode_exchange_id(struct xdr_stream *xdr,
p = reserve_space(xdr, 12); p = reserve_space(xdr, 12);
*p++ = cpu_to_be32(args->flags); *p++ = cpu_to_be32(args->flags);
*p++ = cpu_to_be32(0); /* zero length state_protect4_a */ *p++ = cpu_to_be32(0); /* zero length state_protect4_a */
*p = cpu_to_be32(0); /* zero length implementation id array */
if (send_implementation_id &&
sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN) > 1 &&
sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN)
<= NFS4_OPAQUE_LIMIT + 1)
len = snprintf(impl_name, sizeof(impl_name), "%s %s %s %s",
utsname()->sysname, utsname()->release,
utsname()->version, utsname()->machine);
if (len > 0) {
*p = cpu_to_be32(1); /* implementation id array length=1 */
encode_string(xdr,
sizeof(CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN) - 1,
CONFIG_NFS_V4_1_IMPLEMENTATION_ID_DOMAIN);
encode_string(xdr, len, impl_name);
/* just send zeros for nii_date - the date is in nii_name */
p = reserve_space(xdr, 12);
p = xdr_encode_hyper(p, 0);
*p = cpu_to_be32(0);
} else
*p = cpu_to_be32(0); /* implementation id array length=0 */
hdr->nops++; hdr->nops++;
hdr->replen += decode_exchange_id_maxsz; hdr->replen += decode_exchange_id_maxsz;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment