* [PATCH 3/3] NFSv4: parse and display server implementation ids
2012-02-16 16:17 [PATCH 1/3] NFSv4: Send implementation id with exchange_id Weston Andros Adamson
@ 2012-02-16 16:17 ` Weston Andros Adamson
0 siblings, 0 replies; 9+ messages in thread
From: Weston Andros Adamson @ 2012-02-16 16:17 UTC (permalink / raw)
To: trond.myklebust; +Cc: linux-nfs, Weston Andros Adamson
Shows the implementation ids in /proc/self/mountstats. This doesn't break
the nfs-utils mountstats tool.
Signed-off-by: Weston Andros Adamson <dros@netapp.com>
---
fs/nfs/client.c | 1 +
fs/nfs/nfs4proc.c | 21 +++++++++++++++++++++
fs/nfs/nfs4xdr.c | 42 +++++++++++++++++++++++++++++++++++++-----
fs/nfs/super.c | 8 ++++++++
include/linux/nfs_fs_sb.h | 2 ++
include/linux/nfs_xdr.h | 15 +++++++--------
6 files changed, 76 insertions(+), 13 deletions(-)
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index d0f850f..3fd9a47 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -302,6 +302,7 @@ static void nfs_free_client(struct nfs_client *clp)
kfree(clp->cl_hostname);
kfree(clp->server_scope);
+ kfree(clp->impl_id);
kfree(clp);
dprintk("<-- nfs_free_client()\n");
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 20c3bb0..90a17cc 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4950,11 +4950,24 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
goto out;
}
+ res.impl_id = kzalloc(sizeof(struct nfs41_impl_id), GFP_KERNEL);
+ if (unlikely(!res.impl_id)) {
+ status = -ENOMEM;
+ goto out_server_scope;
+ }
+
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
if (!status)
status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags);
if (!status) {
+ /* use the most recent implementation id */
+ kfree(clp->impl_id);
+ clp->impl_id = res.impl_id;
+ } else
+ kfree(res.impl_id);
+
+ if (!status) {
if (clp->server_scope &&
!nfs41_same_server_scope(clp->server_scope,
res.server_scope)) {
@@ -4970,8 +4983,16 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
goto out;
}
}
+
+out_server_scope:
kfree(res.server_scope);
out:
+ if (clp->impl_id)
+ dprintk("%s: Server Implementation ID: "
+ "domain: %s, name: %s, date: %llu,%u\n",
+ __func__, clp->impl_id->domain, clp->impl_id->name,
+ clp->impl_id->date.seconds,
+ clp->impl_id->date.nseconds);
dprintk("<-- %s status= %d\n", __func__, status);
return status;
}
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index 70ded94..6bf3fe9 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -291,7 +291,11 @@ static int nfs4_stat_to_errno(int);
/* eir_server_scope<> */ \
XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + 1 + \
1 /* eir_server_impl_id array length */ + \
- 0 /* ignored eir_server_impl_id contents */)
+ 1 /* nii_domain */ + \
+ XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
+ 1 /* nii_name */ + \
+ XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
+ 3 /* nii_date */)
#define encode_channel_attrs_maxsz (6 + 1 /* ca_rdma_ird.len (0) */)
#define decode_channel_attrs_maxsz (6 + \
1 /* ca_rdma_ird.len */ + \
@@ -5253,6 +5257,7 @@ static int decode_exchange_id(struct xdr_stream *xdr,
char *dummy_str;
int status;
struct nfs_client *clp = res->client;
+ uint32_t impl_id_count;
status = decode_op_hdr(xdr, OP_EXCHANGE_ID);
if (status)
@@ -5294,11 +5299,38 @@ static int decode_exchange_id(struct xdr_stream *xdr,
memcpy(res->server_scope->server_scope, dummy_str, dummy);
res->server_scope->server_scope_sz = dummy;
- /* Throw away Implementation id array */
- status = decode_opaque_inline(xdr, &dummy, &dummy_str);
- if (unlikely(status))
- return status;
+ /* Implementation Id */
+ p = xdr_inline_decode(xdr, 4);
+ if (unlikely(!p))
+ goto out_overflow;
+ impl_id_count = be32_to_cpup(p++);
+ if (impl_id_count) {
+ /* nii_domain */
+ status = decode_opaque_inline(xdr, &dummy, &dummy_str);
+ if (unlikely(status))
+ return status;
+ if (unlikely(dummy > NFS4_OPAQUE_LIMIT))
+ return -EIO;
+ memcpy(res->impl_id->domain, dummy_str, dummy);
+
+ /* nii_name */
+ status = decode_opaque_inline(xdr, &dummy, &dummy_str);
+ if (unlikely(status))
+ return status;
+ if (unlikely(dummy > NFS4_OPAQUE_LIMIT))
+ return -EIO;
+ memcpy(res->impl_id->name, dummy_str, dummy);
+
+ /* nii_date */
+ p = xdr_inline_decode(xdr, 12);
+ if (unlikely(!p))
+ goto out_overflow;
+ p = xdr_decode_hyper(p, &res->impl_id->date.seconds);
+ res->impl_id->date.nseconds = be32_to_cpup(p);
+
+ /* if there's more than one entry, ignore the rest */
+ }
return 0;
out_overflow:
print_overflow_msg(__func__, xdr);
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index d05024a..5462225 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -809,6 +809,14 @@ static int nfs_show_stats(struct seq_file *m, struct dentry *root)
seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
+ if (nfss->nfs_client && nfss->nfs_client->impl_id) {
+ struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
+ seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
+ "date='%llu,%u'",
+ impl_id->name, impl_id->domain,
+ impl_id->date.seconds, impl_id->date.nseconds);
+ }
+
seq_printf(m, "\n\tcaps:\t");
seq_printf(m, "caps=0x%x", nfss->caps);
seq_printf(m, ",wtmult=%u", nfss->wtmult);
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index 3bf4766..03d0b91 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -18,6 +18,7 @@ struct nfs4_sequence_res;
struct nfs_server;
struct nfs4_minor_version_ops;
struct server_scope;
+struct nfs41_impl_id;
/*
* The nfs_client identifies our client state to the server.
@@ -86,6 +87,7 @@ struct nfs_client {
#endif
struct server_scope *server_scope; /* from exchange_id */
+ struct nfs41_impl_id *impl_id; /* from exchange_id */
struct net *net;
};
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index adbc84a..046c1bf 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1054,14 +1054,6 @@ struct nfstime4 {
};
#ifdef CONFIG_NFS_V4_1
-struct nfs_impl_id4 {
- u32 domain_len;
- char *domain;
- u32 name_len;
- char *name;
- struct nfstime4 date;
-};
-
#define NFS4_EXCHANGE_ID_LEN (48)
struct nfs41_exchange_id_args {
struct nfs_client *client;
@@ -1082,10 +1074,17 @@ struct server_scope {
char server_scope[NFS4_OPAQUE_LIMIT];
};
+struct nfs41_impl_id {
+ char domain[NFS4_OPAQUE_LIMIT + 1];
+ char name[NFS4_OPAQUE_LIMIT + 1];
+ struct nfstime4 date;
+};
+
struct nfs41_exchange_id_res {
struct nfs_client *client;
u32 flags;
struct server_scope *server_scope;
+ struct nfs41_impl_id *impl_id;
};
struct nfs41_create_session_args {
--
1.7.4.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 1/3] NFSv4: Send implementation id with exchange_id
@ 2012-02-17 20:20 Weston Andros Adamson
2012-02-17 20:20 ` [PATCH 2/3] NFSv4: fix server_scope memory leak Weston Andros Adamson
2012-02-17 20:20 ` [PATCH 3/3] NFSv4: parse and display server implementation ids Weston Andros Adamson
0 siblings, 2 replies; 9+ messages in thread
From: Weston Andros Adamson @ 2012-02-17 20:20 UTC (permalink / raw)
To: Trond.Myklebust; +Cc: linux-nfs, Weston Andros Adamson
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: Weston Andros Adamson <dros@netapp.com>
---
Update: Applied Trond's comments
Documentation/kernel-parameters.txt | 9 +++++++
fs/nfs/Kconfig | 12 ++++++++++
fs/nfs/nfs4xdr.c | 41 +++++++++++++++++++++++++++++++++-
3 files changed, 60 insertions(+), 2 deletions(-)
diff --git a/Documentation/kernel-parameters.txt b/Documentation/kernel-parameters.txt
index 1d369c6..7bae0fd 100644
--- a/Documentation/kernel-parameters.txt
+++ b/Documentation/kernel-parameters.txt
@@ -1678,6 +1678,15 @@ bytes respectively. Such letter suffixes can also be entirely omitted.
back to using the idmapper.
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
when a NMI is triggered.
Format: [state][,regs][,debounce][,die]
diff --git a/fs/nfs/Kconfig b/fs/nfs/Kconfig
index ee86cfc..7bce64c 100644
--- a/fs/nfs/Kconfig
+++ b/fs/nfs/Kconfig
@@ -99,6 +99,18 @@ config PNFS_OBJLAYOUT
depends on NFS_FS && NFS_V4_1 && SCSI_OSD_ULD
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
bool "Root file system on NFS"
depends on NFS_FS=y && IP_PNP
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index ae78343..d824aed 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -44,6 +44,8 @@
#include <linux/pagemap.h>
#include <linux/proc_fs.h>
#include <linux/kdev_t.h>
+#include <linux/module.h>
+#include <linux/utsname.h>
#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/msg_prot.h>
#include <linux/sunrpc/gss_api.h>
@@ -271,7 +273,12 @@ static int nfs4_stat_to_errno(int);
1 /* flags */ + \
1 /* spa_how */ + \
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 + \
2 /* eir_clientid */ + \
1 /* eir_sequenceid */ + \
@@ -838,6 +845,12 @@ const u32 nfs41_maxread_overhead = ((RPC_MAX_HEADER_WITH_AUTH +
XDR_UNIT);
#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[] = {
[NF4BAD] = 0,
[NF4REG] = S_IFREG,
@@ -1766,6 +1779,8 @@ static void encode_exchange_id(struct xdr_stream *xdr,
struct compound_hdr *hdr)
{
__be32 *p;
+ char impl_name[NFS4_OPAQUE_LIMIT];
+ int len = 0;
p = reserve_space(xdr, 4 + sizeof(args->verifier->data));
*p++ = cpu_to_be32(OP_EXCHANGE_ID);
@@ -1776,7 +1791,29 @@ static void encode_exchange_id(struct xdr_stream *xdr,
p = reserve_space(xdr, 12);
*p++ = cpu_to_be32(args->flags);
*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->replen += decode_exchange_id_maxsz;
}
--
1.7.4.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 2/3] NFSv4: fix server_scope memory leak
2012-02-17 20:20 [PATCH 1/3] NFSv4: Send implementation id with exchange_id Weston Andros Adamson
@ 2012-02-17 20:20 ` Weston Andros Adamson
2012-02-17 20:20 ` [PATCH 3/3] NFSv4: parse and display server implementation ids Weston Andros Adamson
1 sibling, 0 replies; 9+ messages in thread
From: Weston Andros Adamson @ 2012-02-17 20:20 UTC (permalink / raw)
To: Trond.Myklebust; +Cc: linux-nfs, Weston Andros Adamson
server_scope would never be freed if nfs4_check_cl_exchange_flags() returned
non-zero
Signed-off-by: Weston Andros Adamson <dros@netapp.com>
---
This should be pushed to stable@vger.kernel.org
fs/nfs/nfs4proc.c | 15 +++++++++------
1 files changed, 9 insertions(+), 6 deletions(-)
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 87c584d..20c3bb0 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4945,8 +4945,10 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
clp->cl_rpcclient->cl_auth->au_flavor);
res.server_scope = kzalloc(sizeof(struct server_scope), GFP_KERNEL);
- if (unlikely(!res.server_scope))
- return -ENOMEM;
+ if (unlikely(!res.server_scope)) {
+ status = -ENOMEM;
+ goto out;
+ }
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
if (!status)
@@ -4963,12 +4965,13 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
clp->server_scope = NULL;
}
- if (!clp->server_scope)
+ if (!clp->server_scope) {
clp->server_scope = res.server_scope;
- else
- kfree(res.server_scope);
+ goto out;
+ }
}
-
+ kfree(res.server_scope);
+out:
dprintk("<-- %s status= %d\n", __func__, status);
return status;
}
--
1.7.4.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* [PATCH 3/3] NFSv4: parse and display server implementation ids
2012-02-17 20:20 [PATCH 1/3] NFSv4: Send implementation id with exchange_id Weston Andros Adamson
2012-02-17 20:20 ` [PATCH 2/3] NFSv4: fix server_scope memory leak Weston Andros Adamson
@ 2012-02-17 20:20 ` Weston Andros Adamson
2012-03-03 14:09 ` Bryan Schumaker
1 sibling, 1 reply; 9+ messages in thread
From: Weston Andros Adamson @ 2012-02-17 20:20 UTC (permalink / raw)
To: Trond.Myklebust; +Cc: linux-nfs, Weston Andros Adamson
Shows the implementation ids in /proc/self/mountstats. This doesn't break
the nfs-utils mountstats tool.
Signed-off-by: Weston Andros Adamson <dros@netapp.com>
---
fs/nfs/client.c | 1 +
fs/nfs/nfs4proc.c | 21 +++++++++++++++++++++
fs/nfs/nfs4xdr.c | 42 +++++++++++++++++++++++++++++++++++++-----
fs/nfs/super.c | 8 ++++++++
include/linux/nfs_fs_sb.h | 2 ++
include/linux/nfs_xdr.h | 15 +++++++--------
6 files changed, 76 insertions(+), 13 deletions(-)
diff --git a/fs/nfs/client.c b/fs/nfs/client.c
index d0f850f..3fd9a47 100644
--- a/fs/nfs/client.c
+++ b/fs/nfs/client.c
@@ -302,6 +302,7 @@ static void nfs_free_client(struct nfs_client *clp)
kfree(clp->cl_hostname);
kfree(clp->server_scope);
+ kfree(clp->impl_id);
kfree(clp);
dprintk("<-- nfs_free_client()\n");
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index 20c3bb0..90a17cc 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -4950,11 +4950,24 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
goto out;
}
+ res.impl_id = kzalloc(sizeof(struct nfs41_impl_id), GFP_KERNEL);
+ if (unlikely(!res.impl_id)) {
+ status = -ENOMEM;
+ goto out_server_scope;
+ }
+
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
if (!status)
status = nfs4_check_cl_exchange_flags(clp->cl_exchange_flags);
if (!status) {
+ /* use the most recent implementation id */
+ kfree(clp->impl_id);
+ clp->impl_id = res.impl_id;
+ } else
+ kfree(res.impl_id);
+
+ if (!status) {
if (clp->server_scope &&
!nfs41_same_server_scope(clp->server_scope,
res.server_scope)) {
@@ -4970,8 +4983,16 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
goto out;
}
}
+
+out_server_scope:
kfree(res.server_scope);
out:
+ if (clp->impl_id)
+ dprintk("%s: Server Implementation ID: "
+ "domain: %s, name: %s, date: %llu,%u\n",
+ __func__, clp->impl_id->domain, clp->impl_id->name,
+ clp->impl_id->date.seconds,
+ clp->impl_id->date.nseconds);
dprintk("<-- %s status= %d\n", __func__, status);
return status;
}
diff --git a/fs/nfs/nfs4xdr.c b/fs/nfs/nfs4xdr.c
index d824aed..b7c0433 100644
--- a/fs/nfs/nfs4xdr.c
+++ b/fs/nfs/nfs4xdr.c
@@ -291,7 +291,11 @@ static int nfs4_stat_to_errno(int);
/* eir_server_scope<> */ \
XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + 1 + \
1 /* eir_server_impl_id array length */ + \
- 0 /* ignored eir_server_impl_id contents */)
+ 1 /* nii_domain */ + \
+ XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
+ 1 /* nii_name */ + \
+ XDR_QUADLEN(NFS4_OPAQUE_LIMIT) + \
+ 3 /* nii_date */)
#define encode_channel_attrs_maxsz (6 + 1 /* ca_rdma_ird.len (0) */)
#define decode_channel_attrs_maxsz (6 + \
1 /* ca_rdma_ird.len */ + \
@@ -5256,6 +5260,7 @@ static int decode_exchange_id(struct xdr_stream *xdr,
char *dummy_str;
int status;
struct nfs_client *clp = res->client;
+ uint32_t impl_id_count;
status = decode_op_hdr(xdr, OP_EXCHANGE_ID);
if (status)
@@ -5297,11 +5302,38 @@ static int decode_exchange_id(struct xdr_stream *xdr,
memcpy(res->server_scope->server_scope, dummy_str, dummy);
res->server_scope->server_scope_sz = dummy;
- /* Throw away Implementation id array */
- status = decode_opaque_inline(xdr, &dummy, &dummy_str);
- if (unlikely(status))
- return status;
+ /* Implementation Id */
+ p = xdr_inline_decode(xdr, 4);
+ if (unlikely(!p))
+ goto out_overflow;
+ impl_id_count = be32_to_cpup(p++);
+ if (impl_id_count) {
+ /* nii_domain */
+ status = decode_opaque_inline(xdr, &dummy, &dummy_str);
+ if (unlikely(status))
+ return status;
+ if (unlikely(dummy > NFS4_OPAQUE_LIMIT))
+ return -EIO;
+ memcpy(res->impl_id->domain, dummy_str, dummy);
+
+ /* nii_name */
+ status = decode_opaque_inline(xdr, &dummy, &dummy_str);
+ if (unlikely(status))
+ return status;
+ if (unlikely(dummy > NFS4_OPAQUE_LIMIT))
+ return -EIO;
+ memcpy(res->impl_id->name, dummy_str, dummy);
+
+ /* nii_date */
+ p = xdr_inline_decode(xdr, 12);
+ if (unlikely(!p))
+ goto out_overflow;
+ p = xdr_decode_hyper(p, &res->impl_id->date.seconds);
+ res->impl_id->date.nseconds = be32_to_cpup(p);
+
+ /* if there's more than one entry, ignore the rest */
+ }
return 0;
out_overflow:
print_overflow_msg(__func__, xdr);
diff --git a/fs/nfs/super.c b/fs/nfs/super.c
index d05024a..5462225 100644
--- a/fs/nfs/super.c
+++ b/fs/nfs/super.c
@@ -809,6 +809,14 @@ static int nfs_show_stats(struct seq_file *m, struct dentry *root)
seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
+ if (nfss->nfs_client && nfss->nfs_client->impl_id) {
+ struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
+ seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
+ "date='%llu,%u'",
+ impl_id->name, impl_id->domain,
+ impl_id->date.seconds, impl_id->date.nseconds);
+ }
+
seq_printf(m, "\n\tcaps:\t");
seq_printf(m, "caps=0x%x", nfss->caps);
seq_printf(m, ",wtmult=%u", nfss->wtmult);
diff --git a/include/linux/nfs_fs_sb.h b/include/linux/nfs_fs_sb.h
index 3bf4766..03d0b91 100644
--- a/include/linux/nfs_fs_sb.h
+++ b/include/linux/nfs_fs_sb.h
@@ -18,6 +18,7 @@ struct nfs4_sequence_res;
struct nfs_server;
struct nfs4_minor_version_ops;
struct server_scope;
+struct nfs41_impl_id;
/*
* The nfs_client identifies our client state to the server.
@@ -86,6 +87,7 @@ struct nfs_client {
#endif
struct server_scope *server_scope; /* from exchange_id */
+ struct nfs41_impl_id *impl_id; /* from exchange_id */
struct net *net;
};
diff --git a/include/linux/nfs_xdr.h b/include/linux/nfs_xdr.h
index adbc84a..046c1bf 100644
--- a/include/linux/nfs_xdr.h
+++ b/include/linux/nfs_xdr.h
@@ -1054,14 +1054,6 @@ struct nfstime4 {
};
#ifdef CONFIG_NFS_V4_1
-struct nfs_impl_id4 {
- u32 domain_len;
- char *domain;
- u32 name_len;
- char *name;
- struct nfstime4 date;
-};
-
#define NFS4_EXCHANGE_ID_LEN (48)
struct nfs41_exchange_id_args {
struct nfs_client *client;
@@ -1082,10 +1074,17 @@ struct server_scope {
char server_scope[NFS4_OPAQUE_LIMIT];
};
+struct nfs41_impl_id {
+ char domain[NFS4_OPAQUE_LIMIT + 1];
+ char name[NFS4_OPAQUE_LIMIT + 1];
+ struct nfstime4 date;
+};
+
struct nfs41_exchange_id_res {
struct nfs_client *client;
u32 flags;
struct server_scope *server_scope;
+ struct nfs41_impl_id *impl_id;
};
struct nfs41_create_session_args {
--
1.7.4.4
^ permalink raw reply related [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] NFSv4: parse and display server implementation ids
2012-02-17 20:20 ` [PATCH 3/3] NFSv4: parse and display server implementation ids Weston Andros Adamson
@ 2012-03-03 14:09 ` Bryan Schumaker
2012-03-04 23:33 ` Myklebust, Trond
0 siblings, 1 reply; 9+ messages in thread
From: Bryan Schumaker @ 2012-03-03 14:09 UTC (permalink / raw)
To: Weston Andros Adamson; +Cc: Trond.Myklebust, linux-nfs
Hi Dros,
On 02/17/2012 03:20 PM, Weston Andros Adamson wrote:
> Shows the implementation ids in /proc/self/mountstats. This doesn't break
> the nfs-utils mountstats tool.
>
> Signed-off-by: Weston Andros Adamson <dros@netapp.com>
> ---
> fs/nfs/client.c | 1 +
> fs/nfs/nfs4proc.c | 21 +++++++++++++++++++++
> fs/nfs/nfs4xdr.c | 42 +++++++++++++++++++++++++++++++++++++-----
> fs/nfs/super.c | 8 ++++++++
> include/linux/nfs_fs_sb.h | 2 ++
> include/linux/nfs_xdr.h | 15 +++++++--------
> 6 files changed, 76 insertions(+), 13 deletions(-)
>
<snip>
> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
> index d05024a..5462225 100644
> --- a/fs/nfs/super.c
> +++ b/fs/nfs/super.c
> @@ -809,6 +809,14 @@ static int nfs_show_stats(struct seq_file *m, struct dentry *root)
>
> seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
>
> + if (nfss->nfs_client && nfss->nfs_client->impl_id) {
> + struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
"struct nfs41_impl_id" is only defined when CONFIG_NFS_V4_1 is enabled, so if I compile without NFS 4.1 enabled I get this error:
CC [M] fs/nfs/super.o
/home/bjschuma/linux/modules/fs/nfs/super.c: In function 'nfs_show_stats':
/home/bjschuma/linux/modules/fs/nfs/super.c:843:14: error: dereferencing pointer to incomplete type
/home/bjschuma/linux/modules/fs/nfs/super.c:843:29: error: dereferencing pointer to incomplete type
/home/bjschuma/linux/modules/fs/nfs/super.c:844:14: error: dereferencing pointer to incomplete type
/home/bjschuma/linux/modules/fs/nfs/super.c:844:37: error: dereferencing pointer to incomplete type
make[3]: *** [fs/nfs/super.o] Error 1
- Bryan
> + seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
> + "date='%llu,%u'",
> + impl_id->name, impl_id->domain,
> + impl_id->date.seconds, impl_id->date.nseconds);
> + }
> +
> seq_printf(m, "\n\tcaps:\t");
> seq_printf(m, "caps=0x%x", nfss->caps);
> seq_printf(m, ",wtmult=%u", nfss->wtmult);
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] NFSv4: parse and display server implementation ids
2012-03-03 14:09 ` Bryan Schumaker
@ 2012-03-04 23:33 ` Myklebust, Trond
2012-03-06 17:08 ` Adamson, Dros
0 siblings, 1 reply; 9+ messages in thread
From: Myklebust, Trond @ 2012-03-04 23:33 UTC (permalink / raw)
To: Schumaker, Bryan; +Cc: Adamson, Dros, linux-nfs@vger.kernel.org
T24gU2F0LCAyMDEyLTAzLTAzIGF0IDA5OjA5IC0wNTAwLCBCcnlhbiBTY2h1bWFrZXIgd3JvdGU6
DQo+IEhpIERyb3MsDQo+IA0KPiBPbiAwMi8xNy8yMDEyIDAzOjIwIFBNLCBXZXN0b24gQW5kcm9z
IEFkYW1zb24gd3JvdGU6DQo+IA0KPiA+IFNob3dzIHRoZSBpbXBsZW1lbnRhdGlvbiBpZHMgaW4g
L3Byb2Mvc2VsZi9tb3VudHN0YXRzLiAgVGhpcyBkb2Vzbid0IGJyZWFrDQo+ID4gdGhlIG5mcy11
dGlscyBtb3VudHN0YXRzIHRvb2wuDQo+ID4gDQo+ID4gU2lnbmVkLW9mZi1ieTogV2VzdG9uIEFu
ZHJvcyBBZGFtc29uIDxkcm9zQG5ldGFwcC5jb20+DQo+ID4gLS0tDQo+ID4gIGZzL25mcy9jbGll
bnQuYyAgICAgICAgICAgfCAgICAxICsNCj4gPiAgZnMvbmZzL25mczRwcm9jLmMgICAgICAgICB8
ICAgMjEgKysrKysrKysrKysrKysrKysrKysrDQo+ID4gIGZzL25mcy9uZnM0eGRyLmMgICAgICAg
ICAgfCAgIDQyICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0tLQ0KPiA+
ICBmcy9uZnMvc3VwZXIuYyAgICAgICAgICAgIHwgICAgOCArKysrKysrKw0KPiA+ICBpbmNsdWRl
L2xpbnV4L25mc19mc19zYi5oIHwgICAgMiArKw0KPiA+ICBpbmNsdWRlL2xpbnV4L25mc194ZHIu
aCAgIHwgICAxNSArKysrKysrLS0tLS0tLS0NCj4gPiAgNiBmaWxlcyBjaGFuZ2VkLCA3NiBpbnNl
cnRpb25zKCspLCAxMyBkZWxldGlvbnMoLSkNCj4gPiANCj4gDQo+IDxzbmlwPg0KPiANCj4gPiBk
aWZmIC0tZ2l0IGEvZnMvbmZzL3N1cGVyLmMgYi9mcy9uZnMvc3VwZXIuYw0KPiA+IGluZGV4IGQw
NTAyNGEuLjU0NjIyMjUgMTAwNjQ0DQo+ID4gLS0tIGEvZnMvbmZzL3N1cGVyLmMNCj4gPiArKysg
Yi9mcy9uZnMvc3VwZXIuYw0KPiA+IEBAIC04MDksNiArODA5LDE0IEBAIHN0YXRpYyBpbnQgbmZz
X3Nob3dfc3RhdHMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgZGVudHJ5ICpyb290KQ0KPiA+
ICANCj4gPiAgCXNlcV9wcmludGYobSwgIlxuXHRhZ2U6XHQlbHUiLCAoamlmZmllcyAtIG5mc3Mt
Pm1vdW50X3RpbWUpIC8gSFopOw0KPiA+ICANCj4gPiArCWlmIChuZnNzLT5uZnNfY2xpZW50ICYm
IG5mc3MtPm5mc19jbGllbnQtPmltcGxfaWQpIHsNCj4gPiArCQlzdHJ1Y3QgbmZzNDFfaW1wbF9p
ZCAqaW1wbF9pZCA9IG5mc3MtPm5mc19jbGllbnQtPmltcGxfaWQ7DQo+IA0KPiANCj4gInN0cnVj
dCBuZnM0MV9pbXBsX2lkIiBpcyBvbmx5IGRlZmluZWQgd2hlbiBDT05GSUdfTkZTX1Y0XzEgaXMg
ZW5hYmxlZCwgc28gaWYgSSBjb21waWxlIHdpdGhvdXQgTkZTIDQuMSBlbmFibGVkIEkgZ2V0IHRo
aXMgZXJyb3I6DQo+IA0KPiAgIENDIFtNXSAgZnMvbmZzL3N1cGVyLm8NCj4gL2hvbWUvYmpzY2h1
bWEvbGludXgvbW9kdWxlcy9mcy9uZnMvc3VwZXIuYzogSW4gZnVuY3Rpb24gJ25mc19zaG93X3N0
YXRzJzoNCj4gL2hvbWUvYmpzY2h1bWEvbGludXgvbW9kdWxlcy9mcy9uZnMvc3VwZXIuYzo4NDM6
MTQ6IGVycm9yOiBkZXJlZmVyZW5jaW5nIHBvaW50ZXIgdG8gaW5jb21wbGV0ZSB0eXBlDQo+IC9o
b21lL2Jqc2NodW1hL2xpbnV4L21vZHVsZXMvZnMvbmZzL3N1cGVyLmM6ODQzOjI5OiBlcnJvcjog
ZGVyZWZlcmVuY2luZyBwb2ludGVyIHRvIGluY29tcGxldGUgdHlwZQ0KPiAvaG9tZS9ianNjaHVt
YS9saW51eC9tb2R1bGVzL2ZzL25mcy9zdXBlci5jOjg0NDoxNDogZXJyb3I6IGRlcmVmZXJlbmNp
bmcgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUNCj4gL2hvbWUvYmpzY2h1bWEvbGludXgvbW9k
dWxlcy9mcy9uZnMvc3VwZXIuYzo4NDQ6Mzc6IGVycm9yOiBkZXJlZmVyZW5jaW5nIHBvaW50ZXIg
dG8gaW5jb21wbGV0ZSB0eXBlDQo+IG1ha2VbM106ICoqKiBbZnMvbmZzL3N1cGVyLm9dIEVycm9y
IDENCg0KSGkgQnJ5YW4gJiBEcm9zDQoNCkkndmUgYXBwbGllZCB0aGUgZm9sbG93aW5nIHBhdGNo
IHRvIGZpeCB0aGlzIGlzc3VlLiBQbGVhc2UgYWR2aXNlIGlmDQp5b3UncmUgc3RpbGwgc2VlaW5n
IGNvbXBpbGUgcHJvYmxlbXMgd2hlbiBpdCBpcyBhcHBsaWVkLg0KDQo4PC0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0NCkZyb20gZDAzMjc2OWI4MzNkOGZiYWFhNjIwYTU0MzAwOTc5ZGQ1ODgxZDQ5MyBNb24g
U2VwIDE3IDAwOjAwOjAwIDIwMDENCkZyb206IFRyb25kIE15a2xlYnVzdCA8VHJvbmQuTXlrbGVi
dXN0QG5ldGFwcC5jb20+DQpEYXRlOiBTdW4sIDQgTWFyIDIwMTIgMTg6MTI6NTcgLTA1MDANClN1
YmplY3Q6IFtQQVRDSF0gTkZTOiBGaXggYSBjb21waWxlIGlzc3VlIHdoZW4gIUNPTkZJR19ORlNf
VjRfMQ0KDQpUaGUgYXR0ZW1wdCB0byBkaXNwbGF5IHRoZSBpbXBsZW1lbnRhdGlvbiBJRCBuZWVk
cyB0byBiZSBjb25kaXRpb25hbCBvbg0Kd2hldGhlciBvciBub3QgQ09ORklHX05GU19WNF8xIGlz
IGRlZmluZWQNCg0KUmVwb3J0ZWQtYnk6IEJyeWFuIFNjaHVtYWtlciA8QnJ5YW4uU2NodW1ha2Vy
QG5ldGFwcC5jb20+DQpTaWduZWQtb2ZmLWJ5OiBUcm9uZCBNeWtsZWJ1c3QgPFRyb25kLk15a2xl
YnVzdEBuZXRhcHAuY29tPg0KLS0tDQogZnMvbmZzL3N1cGVyLmMgfCAgIDIyICsrKysrKysrKysr
KysrKy0tLS0tLS0NCiAxIGZpbGVzIGNoYW5nZWQsIDE1IGluc2VydGlvbnMoKyksIDcgZGVsZXRp
b25zKC0pDQoNCmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9zdXBlci5jDQpp
bmRleCAzOTM1YTM3Li42MTQxOWM5IDEwMDY0NA0KLS0tIGEvZnMvbmZzL3N1cGVyLmMNCisrKyBi
L2ZzL25mcy9zdXBlci5jDQpAQCAtNzg1LDggKzc4NSwyMiBAQCBzdGF0aWMgdm9pZCBzaG93X3Bu
ZnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKQ0KIAllbHNl
DQogCQlzZXFfcHJpbnRmKG0sICJub3QgY29uZmlndXJlZCIpOw0KIH0NCisNCitzdGF0aWMgdm9p
ZCBzaG93X2ltcGxlbWVudGF0aW9uX2lkKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IG5mc19z
ZXJ2ZXIgKm5mc3MpDQorew0KKwlpZiAobmZzcy0+bmZzX2NsaWVudCAmJiBuZnNzLT5uZnNfY2xp
ZW50LT5pbXBsX2lkKSB7DQorCQlzdHJ1Y3QgbmZzNDFfaW1wbF9pZCAqaW1wbF9pZCA9IG5mc3Mt
Pm5mc19jbGllbnQtPmltcGxfaWQ7DQorCQlzZXFfcHJpbnRmKG0sICJcblx0aW1wbF9pZDpcdG5h
bWU9JyVzJyxkb21haW49JyVzJywiDQorCQkJICAgImRhdGU9JyVsbHUsJXUnIiwNCisJCQkgICBp
bXBsX2lkLT5uYW1lLCBpbXBsX2lkLT5kb21haW4sDQorCQkJICAgaW1wbF9pZC0+ZGF0ZS5zZWNv
bmRzLCBpbXBsX2lkLT5kYXRlLm5zZWNvbmRzKTsNCisJfQ0KK30NCiAjZWxzZQ0KIHN0YXRpYyB2
b2lkIHNob3dfcG5mcyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2
ZXIpIHt9DQorc3RhdGljIHZvaWQgc2hvd19pbXBsZW1lbnRhdGlvbl9pZChzdHJ1Y3Qgc2VxX2Zp
bGUgKm0sIHN0cnVjdCBuZnNfc2VydmVyICpuZnNzKQ0KK3sNCit9DQogI2VuZGlmDQogI2VuZGlm
DQogDQpAQCAtODM2LDEzICs4NTAsNyBAQCBzdGF0aWMgaW50IG5mc19zaG93X3N0YXRzKHN0cnVj
dCBzZXFfZmlsZSAqbSwgc3RydWN0IGRlbnRyeSAqcm9vdCkNCiANCiAJc2VxX3ByaW50ZihtLCAi
XG5cdGFnZTpcdCVsdSIsIChqaWZmaWVzIC0gbmZzcy0+bW91bnRfdGltZSkgLyBIWik7DQogDQot
CWlmIChuZnNzLT5uZnNfY2xpZW50ICYmIG5mc3MtPm5mc19jbGllbnQtPmltcGxfaWQpIHsNCi0J
CXN0cnVjdCBuZnM0MV9pbXBsX2lkICppbXBsX2lkID0gbmZzcy0+bmZzX2NsaWVudC0+aW1wbF9p
ZDsNCi0JCXNlcV9wcmludGYobSwgIlxuXHRpbXBsX2lkOlx0bmFtZT0nJXMnLGRvbWFpbj0nJXMn
LCINCi0JCQkgICAiZGF0ZT0nJWxsdSwldSciLA0KLQkJCSAgIGltcGxfaWQtPm5hbWUsIGltcGxf
aWQtPmRvbWFpbiwNCi0JCQkgICBpbXBsX2lkLT5kYXRlLnNlY29uZHMsIGltcGxfaWQtPmRhdGUu
bnNlY29uZHMpOw0KLQl9DQorCXNob3dfaW1wbGVtZW50YXRpb25faWQobSwgbmZzcyk7DQogDQog
CXNlcV9wcmludGYobSwgIlxuXHRjYXBzOlx0Iik7DQogCXNlcV9wcmludGYobSwgImNhcHM9MHgl
eCIsIG5mc3MtPmNhcHMpOw0KLS0gDQoxLjcuNy42DQoNCg0KLS0gDQpUcm9uZCBNeWtsZWJ1c3QN
CkxpbnV4IE5GUyBjbGllbnQgbWFpbnRhaW5lcg0KDQpOZXRBcHANClRyb25kLk15a2xlYnVzdEBu
ZXRhcHAuY29tDQp3d3cubmV0YXBwLmNvbQ0KDQo=
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] NFSv4: parse and display server implementation ids
2012-03-04 23:33 ` Myklebust, Trond
@ 2012-03-06 17:08 ` Adamson, Dros
2012-03-06 17:12 ` Myklebust, Trond
2012-03-06 17:15 ` Bryan Schumaker
0 siblings, 2 replies; 9+ messages in thread
From: Adamson, Dros @ 2012-03-06 17:08 UTC (permalink / raw)
To: Myklebust, Trond
Cc: Schumaker, Bryan, Adamson, Dros, linux-nfs@vger.kernel.org
[-- Attachment #1: Type: text/plain, Size: 4425 bytes --]
On Mar 4, 2012, at 6:33 PM, Myklebust, Trond wrote:
> On Sat, 2012-03-03 at 09:09 -0500, Bryan Schumaker wrote:
>> Hi Dros,
>>
>> On 02/17/2012 03:20 PM, Weston Andros Adamson wrote:
>>
>>> Shows the implementation ids in /proc/self/mountstats. This doesn't break
>>> the nfs-utils mountstats tool.
>>>
>>> Signed-off-by: Weston Andros Adamson <dros@netapp.com>
>>> ---
>>> fs/nfs/client.c | 1 +
>>> fs/nfs/nfs4proc.c | 21 +++++++++++++++++++++
>>> fs/nfs/nfs4xdr.c | 42 +++++++++++++++++++++++++++++++++++++-----
>>> fs/nfs/super.c | 8 ++++++++
>>> include/linux/nfs_fs_sb.h | 2 ++
>>> include/linux/nfs_xdr.h | 15 +++++++--------
>>> 6 files changed, 76 insertions(+), 13 deletions(-)
>>>
>>
>> <snip>
>>
>>> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
>>> index d05024a..5462225 100644
>>> --- a/fs/nfs/super.c
>>> +++ b/fs/nfs/super.c
>>> @@ -809,6 +809,14 @@ static int nfs_show_stats(struct seq_file *m, struct dentry *root)
>>>
>>> seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
>>>
>>> + if (nfss->nfs_client && nfss->nfs_client->impl_id) {
>>> + struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
>>
>>
>> "struct nfs41_impl_id" is only defined when CONFIG_NFS_V4_1 is enabled, so if I compile without NFS 4.1 enabled I get this error:
>>
>> CC [M] fs/nfs/super.o
>> /home/bjschuma/linux/modules/fs/nfs/super.c: In function 'nfs_show_stats':
>> /home/bjschuma/linux/modules/fs/nfs/super.c:843:14: error: dereferencing pointer to incomplete type
>> /home/bjschuma/linux/modules/fs/nfs/super.c:843:29: error: dereferencing pointer to incomplete type
>> /home/bjschuma/linux/modules/fs/nfs/super.c:844:14: error: dereferencing pointer to incomplete type
>> /home/bjschuma/linux/modules/fs/nfs/super.c:844:37: error: dereferencing pointer to incomplete type
>> make[3]: *** [fs/nfs/super.o] Error 1
Oops! Good catch Bryan!
>
> Hi Bryan & Dros
>
> I've applied the following patch to fix this issue. Please advise if
> you're still seeing compile problems when it is applied.
>
> 8<----------------------------------------------------------------------------
> From d032769b833d8fbaaa620a54300979dd5881d493 Mon Sep 17 00:00:00 2001
> From: Trond Myklebust <Trond.Myklebust@netapp.com>
> Date: Sun, 4 Mar 2012 18:12:57 -0500
> Subject: [PATCH] NFS: Fix a compile issue when !CONFIG_NFS_V4_1
>
> The attempt to display the implementation ID needs to be conditional on
> whether or not CONFIG_NFS_V4_1 is defined
>
> Reported-by: Bryan Schumaker <Bryan.Schumaker@netapp.com>
> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
> ---
> fs/nfs/super.c | 22 +++++++++++++++-------
> 1 files changed, 15 insertions(+), 7 deletions(-)
>
> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
> index 3935a37..61419c9 100644
> --- a/fs/nfs/super.c
> +++ b/fs/nfs/super.c
> @@ -785,8 +785,22 @@ static void show_pnfs(struct seq_file *m, struct nfs_server *server)
> else
> seq_printf(m, "not configured");
> }
> +
> +static void show_implementation_id(struct seq_file *m, struct nfs_server *nfss)
> +{
> + if (nfss->nfs_client && nfss->nfs_client->impl_id) {
> + struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
> + seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
> + "date='%llu,%u'",
> + impl_id->name, impl_id->domain,
> + impl_id->date.seconds, impl_id->date.nseconds);
> + }
> +}
> #else
> static void show_pnfs(struct seq_file *m, struct nfs_server *server) {}
> +static void show_implementation_id(struct seq_file *m, struct nfs_server *nfss)
> +{
> +}
> #endif
> #endif
>
> @@ -836,13 +850,7 @@ static int nfs_show_stats(struct seq_file *m, struct dentry *root)
>
> seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
>
> - if (nfss->nfs_client && nfss->nfs_client->impl_id) {
> - struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
> - seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
> - "date='%llu,%u'",
> - impl_id->name, impl_id->domain,
> - impl_id->date.seconds, impl_id->date.nseconds);
> - }
> + show_implementation_id(m, nfss);
>
> seq_printf(m, "\n\tcaps:\t");
> seq_printf(m, "caps=0x%x", nfss->caps);
> --
> 1.7.7.6
Works for me. I need to test with different CONFIG opts more often!
-dros
[-- Attachment #2: smime.p7s --]
[-- Type: application/pkcs7-signature, Size: 1374 bytes --]
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] NFSv4: parse and display server implementation ids
2012-03-06 17:08 ` Adamson, Dros
@ 2012-03-06 17:12 ` Myklebust, Trond
2012-03-06 17:15 ` Bryan Schumaker
1 sibling, 0 replies; 9+ messages in thread
From: Myklebust, Trond @ 2012-03-06 17:12 UTC (permalink / raw)
To: Adamson, Dros; +Cc: Schumaker, Bryan, linux-nfs@vger.kernel.org
T24gVHVlLCAyMDEyLTAzLTA2IGF0IDE3OjA4ICswMDAwLCBBZGFtc29uLCBEcm9zIHdyb3RlOg0K
PiBPbiBNYXIgNCwgMjAxMiwgYXQgNjozMyBQTSwgTXlrbGVidXN0LCBUcm9uZCB3cm90ZToNCj4g
DQo+ID4gT24gU2F0LCAyMDEyLTAzLTAzIGF0IDA5OjA5IC0wNTAwLCBCcnlhbiBTY2h1bWFrZXIg
d3JvdGU6DQo+ID4+IEhpIERyb3MsDQo+ID4+IA0KPiA+PiBPbiAwMi8xNy8yMDEyIDAzOjIwIFBN
LCBXZXN0b24gQW5kcm9zIEFkYW1zb24gd3JvdGU6DQo+ID4+IA0KPiA+Pj4gU2hvd3MgdGhlIGlt
cGxlbWVudGF0aW9uIGlkcyBpbiAvcHJvYy9zZWxmL21vdW50c3RhdHMuICBUaGlzIGRvZXNuJ3Qg
YnJlYWsNCj4gPj4+IHRoZSBuZnMtdXRpbHMgbW91bnRzdGF0cyB0b29sLg0KPiA+Pj4gDQo+ID4+
PiBTaWduZWQtb2ZmLWJ5OiBXZXN0b24gQW5kcm9zIEFkYW1zb24gPGRyb3NAbmV0YXBwLmNvbT4N
Cj4gPj4+IC0tLQ0KPiA+Pj4gZnMvbmZzL2NsaWVudC5jICAgICAgICAgICB8ICAgIDEgKw0KPiA+
Pj4gZnMvbmZzL25mczRwcm9jLmMgICAgICAgICB8ICAgMjEgKysrKysrKysrKysrKysrKysrKysr
DQo+ID4+PiBmcy9uZnMvbmZzNHhkci5jICAgICAgICAgIHwgICA0MiArKysrKysrKysrKysrKysr
KysrKysrKysrKysrKysrKysrKysrLS0tLS0NCj4gPj4+IGZzL25mcy9zdXBlci5jICAgICAgICAg
ICAgfCAgICA4ICsrKysrKysrDQo+ID4+PiBpbmNsdWRlL2xpbnV4L25mc19mc19zYi5oIHwgICAg
MiArKw0KPiA+Pj4gaW5jbHVkZS9saW51eC9uZnNfeGRyLmggICB8ICAgMTUgKysrKysrKy0tLS0t
LS0tDQo+ID4+PiA2IGZpbGVzIGNoYW5nZWQsIDc2IGluc2VydGlvbnMoKyksIDEzIGRlbGV0aW9u
cygtKQ0KPiA+Pj4gDQo+ID4+IA0KPiA+PiA8c25pcD4NCj4gPj4gDQo+ID4+PiBkaWZmIC0tZ2l0
IGEvZnMvbmZzL3N1cGVyLmMgYi9mcy9uZnMvc3VwZXIuYw0KPiA+Pj4gaW5kZXggZDA1MDI0YS4u
NTQ2MjIyNSAxMDA2NDQNCj4gPj4+IC0tLSBhL2ZzL25mcy9zdXBlci5jDQo+ID4+PiArKysgYi9m
cy9uZnMvc3VwZXIuYw0KPiA+Pj4gQEAgLTgwOSw2ICs4MDksMTQgQEAgc3RhdGljIGludCBuZnNf
c2hvd19zdGF0cyhzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHN0cnVjdCBkZW50cnkgKnJvb3QpDQo+ID4+
PiANCj4gPj4+IAlzZXFfcHJpbnRmKG0sICJcblx0YWdlOlx0JWx1IiwgKGppZmZpZXMgLSBuZnNz
LT5tb3VudF90aW1lKSAvIEhaKTsNCj4gPj4+IA0KPiA+Pj4gKwlpZiAobmZzcy0+bmZzX2NsaWVu
dCAmJiBuZnNzLT5uZnNfY2xpZW50LT5pbXBsX2lkKSB7DQo+ID4+PiArCQlzdHJ1Y3QgbmZzNDFf
aW1wbF9pZCAqaW1wbF9pZCA9IG5mc3MtPm5mc19jbGllbnQtPmltcGxfaWQ7DQo+ID4+IA0KPiA+
PiANCj4gPj4gInN0cnVjdCBuZnM0MV9pbXBsX2lkIiBpcyBvbmx5IGRlZmluZWQgd2hlbiBDT05G
SUdfTkZTX1Y0XzEgaXMgZW5hYmxlZCwgc28gaWYgSSBjb21waWxlIHdpdGhvdXQgTkZTIDQuMSBl
bmFibGVkIEkgZ2V0IHRoaXMgZXJyb3I6DQo+ID4+IA0KPiA+PiAgQ0MgW01dICBmcy9uZnMvc3Vw
ZXIubw0KPiA+PiAvaG9tZS9ianNjaHVtYS9saW51eC9tb2R1bGVzL2ZzL25mcy9zdXBlci5jOiBJ
biBmdW5jdGlvbiAnbmZzX3Nob3dfc3RhdHMnOg0KPiA+PiAvaG9tZS9ianNjaHVtYS9saW51eC9t
b2R1bGVzL2ZzL25mcy9zdXBlci5jOjg0MzoxNDogZXJyb3I6IGRlcmVmZXJlbmNpbmcgcG9pbnRl
ciB0byBpbmNvbXBsZXRlIHR5cGUNCj4gPj4gL2hvbWUvYmpzY2h1bWEvbGludXgvbW9kdWxlcy9m
cy9uZnMvc3VwZXIuYzo4NDM6Mjk6IGVycm9yOiBkZXJlZmVyZW5jaW5nIHBvaW50ZXIgdG8gaW5j
b21wbGV0ZSB0eXBlDQo+ID4+IC9ob21lL2Jqc2NodW1hL2xpbnV4L21vZHVsZXMvZnMvbmZzL3N1
cGVyLmM6ODQ0OjE0OiBlcnJvcjogZGVyZWZlcmVuY2luZyBwb2ludGVyIHRvIGluY29tcGxldGUg
dHlwZQ0KPiA+PiAvaG9tZS9ianNjaHVtYS9saW51eC9tb2R1bGVzL2ZzL25mcy9zdXBlci5jOjg0
NDozNzogZXJyb3I6IGRlcmVmZXJlbmNpbmcgcG9pbnRlciB0byBpbmNvbXBsZXRlIHR5cGUNCj4g
Pj4gbWFrZVszXTogKioqIFtmcy9uZnMvc3VwZXIub10gRXJyb3IgMQ0KPiANCj4gT29wcyEgIEdv
b2QgY2F0Y2ggQnJ5YW4hDQo+IA0KPiA+IA0KPiA+IEhpIEJyeWFuICYgRHJvcw0KPiA+IA0KPiA+
IEkndmUgYXBwbGllZCB0aGUgZm9sbG93aW5nIHBhdGNoIHRvIGZpeCB0aGlzIGlzc3VlLiBQbGVh
c2UgYWR2aXNlIGlmDQo+ID4geW91J3JlIHN0aWxsIHNlZWluZyBjb21waWxlIHByb2JsZW1zIHdo
ZW4gaXQgaXMgYXBwbGllZC4NCj4gPiANCj4gV29ya3MgZm9yIG1lLiAgSSBuZWVkIHRvIHRlc3Qg
d2l0aCBkaWZmZXJlbnQgQ09ORklHIG9wdHMgbW9yZSBvZnRlbiENCg0KQWN0dWFsbHksIHRoZSBh
Ym92ZSBwYXRjaCB3YXMgZmFpbGluZyBpZiAhQ09ORklHX05GU19WNCwgc28gaXQgaGFzIGJlZW4N
CmFtZW5kZWQgYSBqdXN0IGxpdHRsZSBtb3JlIHRvIGRvIHRoZSByaWdodCB0aGluZy4NCjg8LS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0NCkZyb20gN2UwM2I3Y2MwNzM2ZWVmZTc0NzE3ODJjMzQ0MTEyYWQ2ZWJhOTUxZSBNb24g
U2VwIDE3IDAwOjAwOjAwIDIwMDENCkZyb206IFRyb25kIE15a2xlYnVzdCA8VHJvbmQuTXlrbGVi
dXN0QG5ldGFwcC5jb20+DQpEYXRlOiBTdW4sIDQgTWFyIDIwMTIgMTg6MTI6NTcgLTA1MDANClN1
YmplY3Q6IFtQQVRDSCB2Ml0gTkZTOiBGaXggYSBjb21waWxlIGlzc3VlIHdoZW4gIUNPTkZJR19O
RlNfVjRfMQ0KDQpUaGUgYXR0ZW1wdCB0byBkaXNwbGF5IHRoZSBpbXBsZW1lbnRhdGlvbiBJRCBu
ZWVkcyB0byBiZSBjb25kaXRpb25hbCBvbg0Kd2hldGhlciBvciBub3QgQ09ORklHX05GU19WNF8x
IGlzIGRlZmluZWQNCg0KUmVwb3J0ZWQtYnk6IEJyeWFuIFNjaHVtYWtlciA8QnJ5YW4uU2NodW1h
a2VyQG5ldGFwcC5jb20+DQpTaWduZWQtb2ZmLWJ5OiBUcm9uZCBNeWtsZWJ1c3QgPFRyb25kLk15
a2xlYnVzdEBuZXRhcHAuY29tPg0KLS0tDQogZnMvbmZzL3N1cGVyLmMgfCAgIDI4ICsrKysrKysr
KysrKysrKysrKystLS0tLS0tLS0NCiAxIGZpbGVzIGNoYW5nZWQsIDE5IGluc2VydGlvbnMoKyks
IDkgZGVsZXRpb25zKC0pDQoNCmRpZmYgLS1naXQgYS9mcy9uZnMvc3VwZXIuYyBiL2ZzL25mcy9z
dXBlci5jDQppbmRleCAzOTM1YTM3Li5hYWM0MDMwIDEwMDY0NA0KLS0tIGEvZnMvbmZzL3N1cGVy
LmMNCisrKyBiL2ZzL25mcy9zdXBlci5jDQpAQCAtNzc1LDcgKzc3NSw2IEBAIHN0YXRpYyB2b2lk
IHNob3dfc2Vzc2lvbnMoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqc2Vy
dmVyKSB7fQ0KICNlbmRpZg0KICNlbmRpZg0KIA0KLSNpZmRlZiBDT05GSUdfTkZTX1Y0DQogI2lm
ZGVmIENPTkZJR19ORlNfVjRfMQ0KIHN0YXRpYyB2b2lkIHNob3dfcG5mcyhzdHJ1Y3Qgc2VxX2Zp
bGUgKm0sIHN0cnVjdCBuZnNfc2VydmVyICpzZXJ2ZXIpDQogew0KQEAgLTc4NSw5ICs3ODQsMjYg
QEAgc3RhdGljIHZvaWQgc2hvd19wbmZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IG5mc19z
ZXJ2ZXIgKnNlcnZlcikNCiAJZWxzZQ0KIAkJc2VxX3ByaW50ZihtLCAibm90IGNvbmZpZ3VyZWQi
KTsNCiB9DQorDQorc3RhdGljIHZvaWQgc2hvd19pbXBsZW1lbnRhdGlvbl9pZChzdHJ1Y3Qgc2Vx
X2ZpbGUgKm0sIHN0cnVjdCBuZnNfc2VydmVyICpuZnNzKQ0KK3sNCisJaWYgKG5mc3MtPm5mc19j
bGllbnQgJiYgbmZzcy0+bmZzX2NsaWVudC0+aW1wbF9pZCkgew0KKwkJc3RydWN0IG5mczQxX2lt
cGxfaWQgKmltcGxfaWQgPSBuZnNzLT5uZnNfY2xpZW50LT5pbXBsX2lkOw0KKwkJc2VxX3ByaW50
ZihtLCAiXG5cdGltcGxfaWQ6XHRuYW1lPSclcycsZG9tYWluPSclcycsIg0KKwkJCSAgICJkYXRl
PSclbGx1LCV1JyIsDQorCQkJICAgaW1wbF9pZC0+bmFtZSwgaW1wbF9pZC0+ZG9tYWluLA0KKwkJ
CSAgIGltcGxfaWQtPmRhdGUuc2Vjb25kcywgaW1wbF9pZC0+ZGF0ZS5uc2Vjb25kcyk7DQorCX0N
Cit9DQogI2Vsc2UNCi1zdGF0aWMgdm9pZCBzaG93X3BuZnMoc3RydWN0IHNlcV9maWxlICptLCBz
dHJ1Y3QgbmZzX3NlcnZlciAqc2VydmVyKSB7fQ0KKyNpZmRlZiBDT05GSUdfTkZTX1Y0DQorc3Rh
dGljIHZvaWQgc2hvd19wbmZzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IG5mc19zZXJ2ZXIg
KnNlcnZlcikNCit7DQorfQ0KICNlbmRpZg0KK3N0YXRpYyB2b2lkIHNob3dfaW1wbGVtZW50YXRp
b25faWQoc3RydWN0IHNlcV9maWxlICptLCBzdHJ1Y3QgbmZzX3NlcnZlciAqbmZzcykNCit7DQor
fQ0KICNlbmRpZg0KIA0KIHN0YXRpYyBpbnQgbmZzX3Nob3dfZGV2bmFtZShzdHJ1Y3Qgc2VxX2Zp
bGUgKm0sIHN0cnVjdCBkZW50cnkgKnJvb3QpDQpAQCAtODM2LDEzICs4NTIsNyBAQCBzdGF0aWMg
aW50IG5mc19zaG93X3N0YXRzKHN0cnVjdCBzZXFfZmlsZSAqbSwgc3RydWN0IGRlbnRyeSAqcm9v
dCkNCiANCiAJc2VxX3ByaW50ZihtLCAiXG5cdGFnZTpcdCVsdSIsIChqaWZmaWVzIC0gbmZzcy0+
bW91bnRfdGltZSkgLyBIWik7DQogDQotCWlmIChuZnNzLT5uZnNfY2xpZW50ICYmIG5mc3MtPm5m
c19jbGllbnQtPmltcGxfaWQpIHsNCi0JCXN0cnVjdCBuZnM0MV9pbXBsX2lkICppbXBsX2lkID0g
bmZzcy0+bmZzX2NsaWVudC0+aW1wbF9pZDsNCi0JCXNlcV9wcmludGYobSwgIlxuXHRpbXBsX2lk
Olx0bmFtZT0nJXMnLGRvbWFpbj0nJXMnLCINCi0JCQkgICAiZGF0ZT0nJWxsdSwldSciLA0KLQkJ
CSAgIGltcGxfaWQtPm5hbWUsIGltcGxfaWQtPmRvbWFpbiwNCi0JCQkgICBpbXBsX2lkLT5kYXRl
LnNlY29uZHMsIGltcGxfaWQtPmRhdGUubnNlY29uZHMpOw0KLQl9DQorCXNob3dfaW1wbGVtZW50
YXRpb25faWQobSwgbmZzcyk7DQogDQogCXNlcV9wcmludGYobSwgIlxuXHRjYXBzOlx0Iik7DQog
CXNlcV9wcmludGYobSwgImNhcHM9MHgleCIsIG5mc3MtPmNhcHMpOw0KLS0gDQoxLjcuNy42DQoN
Cg0KLS0gDQpUcm9uZCBNeWtsZWJ1c3QNCkxpbnV4IE5GUyBjbGllbnQgbWFpbnRhaW5lcg0KDQpO
ZXRBcHANClRyb25kLk15a2xlYnVzdEBuZXRhcHAuY29tDQp3d3cubmV0YXBwLmNvbQ0KDQo=
^ permalink raw reply [flat|nested] 9+ messages in thread
* Re: [PATCH 3/3] NFSv4: parse and display server implementation ids
2012-03-06 17:08 ` Adamson, Dros
2012-03-06 17:12 ` Myklebust, Trond
@ 2012-03-06 17:15 ` Bryan Schumaker
1 sibling, 0 replies; 9+ messages in thread
From: Bryan Schumaker @ 2012-03-06 17:15 UTC (permalink / raw)
To: Adamson, Dros
Cc: Myklebust, Trond, Schumaker, Bryan, linux-nfs@vger.kernel.org
On 03/06/2012 12:08 PM, Adamson, Dros wrote:
>
> On Mar 4, 2012, at 6:33 PM, Myklebust, Trond wrote:
>
>> On Sat, 2012-03-03 at 09:09 -0500, Bryan Schumaker wrote:
>>> Hi Dros,
>>>
>>> On 02/17/2012 03:20 PM, Weston Andros Adamson wrote:
>>>
>>>> Shows the implementation ids in /proc/self/mountstats. This doesn't break
>>>> the nfs-utils mountstats tool.
>>>>
>>>> Signed-off-by: Weston Andros Adamson <dros@netapp.com>
>>>> ---
>>>> fs/nfs/client.c | 1 +
>>>> fs/nfs/nfs4proc.c | 21 +++++++++++++++++++++
>>>> fs/nfs/nfs4xdr.c | 42 +++++++++++++++++++++++++++++++++++++-----
>>>> fs/nfs/super.c | 8 ++++++++
>>>> include/linux/nfs_fs_sb.h | 2 ++
>>>> include/linux/nfs_xdr.h | 15 +++++++--------
>>>> 6 files changed, 76 insertions(+), 13 deletions(-)
>>>>
>>>
>>> <snip>
>>>
>>>> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
>>>> index d05024a..5462225 100644
>>>> --- a/fs/nfs/super.c
>>>> +++ b/fs/nfs/super.c
>>>> @@ -809,6 +809,14 @@ static int nfs_show_stats(struct seq_file *m, struct dentry *root)
>>>>
>>>> seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
>>>>
>>>> + if (nfss->nfs_client && nfss->nfs_client->impl_id) {
>>>> + struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
>>>
>>>
>>> "struct nfs41_impl_id" is only defined when CONFIG_NFS_V4_1 is enabled, so if I compile without NFS 4.1 enabled I get this error:
>>>
>>> CC [M] fs/nfs/super.o
>>> /home/bjschuma/linux/modules/fs/nfs/super.c: In function 'nfs_show_stats':
>>> /home/bjschuma/linux/modules/fs/nfs/super.c:843:14: error: dereferencing pointer to incomplete type
>>> /home/bjschuma/linux/modules/fs/nfs/super.c:843:29: error: dereferencing pointer to incomplete type
>>> /home/bjschuma/linux/modules/fs/nfs/super.c:844:14: error: dereferencing pointer to incomplete type
>>> /home/bjschuma/linux/modules/fs/nfs/super.c:844:37: error: dereferencing pointer to incomplete type
>>> make[3]: *** [fs/nfs/super.o] Error 1
>
> Oops! Good catch Bryan!
>
>>
>> Hi Bryan & Dros
>>
>> I've applied the following patch to fix this issue. Please advise if
>> you're still seeing compile problems when it is applied.
>>
>> 8<----------------------------------------------------------------------------
>> From d032769b833d8fbaaa620a54300979dd5881d493 Mon Sep 17 00:00:00 2001
>> From: Trond Myklebust <Trond.Myklebust@netapp.com>
>> Date: Sun, 4 Mar 2012 18:12:57 -0500
>> Subject: [PATCH] NFS: Fix a compile issue when !CONFIG_NFS_V4_1
>>
>> The attempt to display the implementation ID needs to be conditional on
>> whether or not CONFIG_NFS_V4_1 is defined
>>
>> Reported-by: Bryan Schumaker <Bryan.Schumaker@netapp.com>
>> Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
>> ---
>> fs/nfs/super.c | 22 +++++++++++++++-------
>> 1 files changed, 15 insertions(+), 7 deletions(-)
>>
>> diff --git a/fs/nfs/super.c b/fs/nfs/super.c
>> index 3935a37..61419c9 100644
>> --- a/fs/nfs/super.c
>> +++ b/fs/nfs/super.c
>> @@ -785,8 +785,22 @@ static void show_pnfs(struct seq_file *m, struct nfs_server *server)
>> else
>> seq_printf(m, "not configured");
>> }
>> +
>> +static void show_implementation_id(struct seq_file *m, struct nfs_server *nfss)
>> +{
>> + if (nfss->nfs_client && nfss->nfs_client->impl_id) {
>> + struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
>> + seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
>> + "date='%llu,%u'",
>> + impl_id->name, impl_id->domain,
>> + impl_id->date.seconds, impl_id->date.nseconds);
>> + }
>> +}
>> #else
>> static void show_pnfs(struct seq_file *m, struct nfs_server *server) {}
>> +static void show_implementation_id(struct seq_file *m, struct nfs_server *nfss)
>> +{
>> +}
>> #endif
>> #endif
>>
>> @@ -836,13 +850,7 @@ static int nfs_show_stats(struct seq_file *m, struct dentry *root)
>>
>> seq_printf(m, "\n\tage:\t%lu", (jiffies - nfss->mount_time) / HZ);
>>
>> - if (nfss->nfs_client && nfss->nfs_client->impl_id) {
>> - struct nfs41_impl_id *impl_id = nfss->nfs_client->impl_id;
>> - seq_printf(m, "\n\timpl_id:\tname='%s',domain='%s',"
>> - "date='%llu,%u'",
>> - impl_id->name, impl_id->domain,
>> - impl_id->date.seconds, impl_id->date.nseconds);
>> - }
>> + show_implementation_id(m, nfss);
>>
>> seq_printf(m, "\n\tcaps:\t");
>> seq_printf(m, "caps=0x%x", nfss->caps);
>> --
>> 1.7.7.6
>
> Works for me. I need to test with different CONFIG opts more often!
That's actually how I found this. I set up Jenkins to change all the nfs CONFIG options to make sure I had everything covered for my modules patches. I've added compile testing to my normal nightly tests now, so these issuse should be caught faster.
- Bryan
>
> -dros
^ permalink raw reply [flat|nested] 9+ messages in thread
end of thread, other threads:[~2012-03-06 17:15 UTC | newest]
Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2012-02-17 20:20 [PATCH 1/3] NFSv4: Send implementation id with exchange_id Weston Andros Adamson
2012-02-17 20:20 ` [PATCH 2/3] NFSv4: fix server_scope memory leak Weston Andros Adamson
2012-02-17 20:20 ` [PATCH 3/3] NFSv4: parse and display server implementation ids Weston Andros Adamson
2012-03-03 14:09 ` Bryan Schumaker
2012-03-04 23:33 ` Myklebust, Trond
2012-03-06 17:08 ` Adamson, Dros
2012-03-06 17:12 ` Myklebust, Trond
2012-03-06 17:15 ` Bryan Schumaker
-- strict thread matches above, loose matches on Subject: below --
2012-02-16 16:17 [PATCH 1/3] NFSv4: Send implementation id with exchange_id Weston Andros Adamson
2012-02-16 16:17 ` [PATCH 3/3] NFSv4: parse and display server implementation ids Weston Andros Adamson
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.