* [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems
@ 2013-08-13 18:35 Trond Myklebust
2013-08-13 18:35 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Trond Myklebust
` (2 more replies)
0 siblings, 3 replies; 16+ messages in thread
From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw)
To: linux-nfs
Set up basic tracepoints for debugging client id creation/destruction
and session creation/destruction.
Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com>
---
fs/nfs/Makefile | 3 +-
fs/nfs/nfs4proc.c | 9 +++
fs/nfs/nfs4trace.c | 10 +++
fs/nfs/nfs4trace.h | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++
4 files changed, 226 insertions(+), 1 deletion(-)
create mode 100644 fs/nfs/nfs4trace.c
create mode 100644 fs/nfs/nfs4trace.h
diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile
index e0bb048..71ba4c2 100644
--- a/fs/nfs/Makefile
+++ b/fs/nfs/Makefile
@@ -21,7 +21,8 @@ nfsv3-$(CONFIG_NFS_V3_ACL) += nfs3acl.o
obj-$(CONFIG_NFS_V4) += nfsv4.o
nfsv4-y := nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o nfs4super.o nfs4file.o \
delegation.o idmap.o callback.o callback_xdr.o callback_proc.o \
- nfs4namespace.o nfs4getroot.o nfs4client.o dns_resolve.o
+ nfs4namespace.o nfs4getroot.o nfs4client.o dns_resolve.o \
+ nfs4trace.c
nfsv4-$(CONFIG_NFS_USE_LEGACY_DNS) += cache_lib.o
nfsv4-$(CONFIG_SYSCTL) += nfs4sysctl.o
nfsv4-$(CONFIG_NFS_V4_1) += nfs4session.o pnfs.o pnfs_dev.o
diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
index a187f4d..3a55f24 100644
--- a/fs/nfs/nfs4proc.c
+++ b/fs/nfs/nfs4proc.c
@@ -66,6 +66,8 @@
#include "nfs4session.h"
#include "fscache.h"
+#include "nfs4trace.h"
+
#define NFSDBG_FACILITY NFSDBG_PROC
#define NFS4_POLL_RETRY_MIN (HZ/10)
@@ -4730,6 +4732,7 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program,
clp->cl_rpcclient->cl_auth->au_ops->au_name,
setclientid.sc_name_len, setclientid.sc_name);
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ trace_nfs4_setclientid(clp, status);
dprintk("NFS reply setclientid: %d\n", status);
return status;
}
@@ -4757,6 +4760,7 @@ int nfs4_proc_setclientid_confirm(struct nfs_client *clp,
clp->cl_rpcclient->cl_auth->au_ops->au_name,
clp->cl_clientid);
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ trace_nfs4_setclientid_confirm(clp, status);
dprintk("NFS reply setclientid_confirm: %d\n", status);
return status;
}
@@ -5887,6 +5891,7 @@ int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred
}
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ trace_nfs4_bind_conn_to_session(clp, status);
if (status == 0) {
if (memcmp(res.session->sess_id.data,
clp->cl_session->sess_id.data, NFS4_MAX_SESSIONID_LEN)) {
@@ -5972,6 +5977,7 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred)
}
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ trace_nfs4_exchange_id(clp, status);
if (status == 0)
status = nfs4_check_cl_exchange_flags(res.flags);
@@ -6032,6 +6038,7 @@ static int _nfs4_proc_destroy_clientid(struct nfs_client *clp,
int status;
status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ trace_nfs4_destroy_clientid(clp, status);
if (status)
dprintk("NFS: Got error %d from the server %s on "
"DESTROY_CLIENTID.", status, clp->cl_hostname);
@@ -6295,6 +6302,7 @@ static int _nfs4_proc_create_session(struct nfs_client *clp,
args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN);
status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ trace_nfs4_create_session(clp, status);
if (!status) {
/* Verify the session's negotiated channel_attrs values */
@@ -6358,6 +6366,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session,
return status;
status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT);
+ trace_nfs4_destroy_session(session->clp, status);
if (status)
dprintk("NFS: Got error %d from the server on DESTROY_SESSION. "
diff --git a/fs/nfs/nfs4trace.c b/fs/nfs/nfs4trace.c
new file mode 100644
index 0000000..3f02183
--- /dev/null
+++ b/fs/nfs/nfs4trace.c
@@ -0,0 +1,10 @@
+/*
+ * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com>
+ */
+#include <linux/nfs_fs.h>
+#include "nfs4_fs.h"
+#include "internal.h"
+
+#define CREATE_TRACE_POINTS
+#include "nfs4trace.h"
+
diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h
new file mode 100644
index 0000000..451954f
--- /dev/null
+++ b/fs/nfs/nfs4trace.h
@@ -0,0 +1,205 @@
+#undef TRACE_SYSTEM
+#define TRACE_SYSTEM nfs4
+
+#if !defined(_TRACE_NFS4_H) || defined(TRACE_HEADER_MULTI_READ)
+#define _TRACE_NFS4_H
+
+#include <linux/tracepoint.h>
+
+#define show_nfsv4_errors(error) __print_symbolic(error, \
+ { NFS4_OK, "OK" }, \
+ /* Mapped by nfs4_stat_to_errno() */ \
+ { -EPERM, "EPERM" }, \
+ { -ENOENT, "ENOENT" }, \
+ { -EIO, "EIO" }, \
+ { -ENXIO, "ENXIO" }, \
+ { -EACCES, "EACCES" }, \
+ { -EEXIST, "EEXIST" }, \
+ { -EXDEV, "EXDEV" }, \
+ { -ENOTDIR, "ENOTDIR" }, \
+ { -EISDIR, "EISDIR" }, \
+ { -EFBIG, "EFBIG" }, \
+ { -ENOSPC, "ENOSPC" }, \
+ { -EROFS, "EROFS" }, \
+ { -EMLINK, "EMLINK" }, \
+ { -ENAMETOOLONG, "ENAMETOOLONG" }, \
+ { -ENOTEMPTY, "ENOTEMPTY" }, \
+ { -EDQUOT, "EDQUOT" }, \
+ { -ESTALE, "ESTALE" }, \
+ { -EBADHANDLE, "EBADHANDLE" }, \
+ { -EBADCOOKIE, "EBADCOOKIE" }, \
+ { -ENOTSUPP, "ENOTSUPP" }, \
+ { -ETOOSMALL, "ETOOSMALL" }, \
+ { -EREMOTEIO, "EREMOTEIO" }, \
+ { -EBADTYPE, "EBADTYPE" }, \
+ { -EAGAIN, "EAGAIN" }, \
+ { -ELOOP, "ELOOP" }, \
+ { -EOPNOTSUPP, "EOPNOTSUPP" }, \
+ { -EDEADLK, "EDEADLK" }, \
+ /* RPC errors */ \
+ { -ENOMEM, "ENOMEM" }, \
+ { -EKEYEXPIRED, "EKEYEXPIRED" }, \
+ { -ETIMEDOUT, "ETIMEDOUT" }, \
+ { -ERESTARTSYS, "ERESTARTSYS" }, \
+ { -ECONNREFUSED, "ECONNREFUSED" }, \
+ { -ECONNRESET, "ECONNRESET" }, \
+ { -ENETUNREACH, "ENETUNREACH" }, \
+ { -EHOSTUNREACH, "EHOSTUNREACH" }, \
+ { -EHOSTDOWN, "EHOSTDOWN" }, \
+ { -EPIPE, "EPIPE" }, \
+ { -EPFNOSUPPORT, "EPFNOSUPPORT" }, \
+ { -EPROTONOSUPPORT, "EPROTONOSUPPORT" }, \
+ /* NFSv4 native errors */ \
+ { -NFS4ERR_ACCESS, "ACCESS" }, \
+ { -NFS4ERR_ATTRNOTSUPP, "ATTRNOTSUPP" }, \
+ { -NFS4ERR_ADMIN_REVOKED, "ADMIN_REVOKED" }, \
+ { -NFS4ERR_BACK_CHAN_BUSY, "BACK_CHAN_BUSY" }, \
+ { -NFS4ERR_BADCHAR, "BADCHAR" }, \
+ { -NFS4ERR_BADHANDLE, "BADHANDLE" }, \
+ { -NFS4ERR_BADIOMODE, "BADIOMODE" }, \
+ { -NFS4ERR_BADLAYOUT, "BADLAYOUT" }, \
+ { -NFS4ERR_BADNAME, "BADNAME" }, \
+ { -NFS4ERR_BADOWNER, "BADOWNER" }, \
+ { -NFS4ERR_BADSESSION, "BADSESSION" }, \
+ { -NFS4ERR_BADSLOT, "BADSLOT" }, \
+ { -NFS4ERR_BADTYPE, "BADTYPE" }, \
+ { -NFS4ERR_BADXDR, "BADXDR" }, \
+ { -NFS4ERR_BAD_COOKIE, "BAD_COOKIE" }, \
+ { -NFS4ERR_BAD_HIGH_SLOT, "BAD_HIGH_SLOT" }, \
+ { -NFS4ERR_BAD_RANGE, "BAD_RANGE" }, \
+ { -NFS4ERR_BAD_SEQID, "BAD_SEQID" }, \
+ { -NFS4ERR_BAD_SESSION_DIGEST, "BAD_SESSION_DIGEST" }, \
+ { -NFS4ERR_BAD_STATEID, "BAD_STATEID" }, \
+ { -NFS4ERR_CB_PATH_DOWN, "CB_PATH_DOWN" }, \
+ { -NFS4ERR_CLID_INUSE, "CLID_INUSE" }, \
+ { -NFS4ERR_CLIENTID_BUSY, "CLIENTID_BUSY" }, \
+ { -NFS4ERR_COMPLETE_ALREADY, "COMPLETE_ALREADY" }, \
+ { -NFS4ERR_CONN_NOT_BOUND_TO_SESSION, \
+ "CONN_NOT_BOUND_TO_SESSION" }, \
+ { -NFS4ERR_DEADLOCK, "DEADLOCK" }, \
+ { -NFS4ERR_DEADSESSION, "DEAD_SESSION" }, \
+ { -NFS4ERR_DELAY, "DELAY" }, \
+ { -NFS4ERR_DELEG_ALREADY_WANTED, \
+ "DELEG_ALREADY_WANTED" }, \
+ { -NFS4ERR_DELEG_REVOKED, "DELEG_REVOKED" }, \
+ { -NFS4ERR_DENIED, "DENIED" }, \
+ { -NFS4ERR_DIRDELEG_UNAVAIL, "DIRDELEG_UNAVAIL" }, \
+ { -NFS4ERR_DQUOT, "DQUOT" }, \
+ { -NFS4ERR_ENCR_ALG_UNSUPP, "ENCR_ALG_UNSUPP" }, \
+ { -NFS4ERR_EXIST, "EXIST" }, \
+ { -NFS4ERR_EXPIRED, "EXPIRED" }, \
+ { -NFS4ERR_FBIG, "FBIG" }, \
+ { -NFS4ERR_FHEXPIRED, "FHEXPIRED" }, \
+ { -NFS4ERR_FILE_OPEN, "FILE_OPEN" }, \
+ { -NFS4ERR_GRACE, "GRACE" }, \
+ { -NFS4ERR_HASH_ALG_UNSUPP, "HASH_ALG_UNSUPP" }, \
+ { -NFS4ERR_INVAL, "INVAL" }, \
+ { -NFS4ERR_IO, "IO" }, \
+ { -NFS4ERR_ISDIR, "ISDIR" }, \
+ { -NFS4ERR_LAYOUTTRYLATER, "LAYOUTTRYLATER" }, \
+ { -NFS4ERR_LAYOUTUNAVAILABLE, "LAYOUTUNAVAILABLE" }, \
+ { -NFS4ERR_LEASE_MOVED, "LEASE_MOVED" }, \
+ { -NFS4ERR_LOCKED, "LOCKED" }, \
+ { -NFS4ERR_LOCKS_HELD, "LOCKS_HELD" }, \
+ { -NFS4ERR_LOCK_RANGE, "LOCK_RANGE" }, \
+ { -NFS4ERR_MINOR_VERS_MISMATCH, "MINOR_VERS_MISMATCH" }, \
+ { -NFS4ERR_MLINK, "MLINK" }, \
+ { -NFS4ERR_MOVED, "MOVED" }, \
+ { -NFS4ERR_NAMETOOLONG, "NAMETOOLONG" }, \
+ { -NFS4ERR_NOENT, "NOENT" }, \
+ { -NFS4ERR_NOFILEHANDLE, "NOFILEHANDLE" }, \
+ { -NFS4ERR_NOMATCHING_LAYOUT, "NOMATCHING_LAYOUT" }, \
+ { -NFS4ERR_NOSPC, "NOSPC" }, \
+ { -NFS4ERR_NOTDIR, "NOTDIR" }, \
+ { -NFS4ERR_NOTEMPTY, "NOTEMPTY" }, \
+ { -NFS4ERR_NOTSUPP, "NOTSUPP" }, \
+ { -NFS4ERR_NOT_ONLY_OP, "NOT_ONLY_OP" }, \
+ { -NFS4ERR_NOT_SAME, "NOT_SAME" }, \
+ { -NFS4ERR_NO_GRACE, "NO_GRACE" }, \
+ { -NFS4ERR_NXIO, "NXIO" }, \
+ { -NFS4ERR_OLD_STATEID, "OLD_STATEID" }, \
+ { -NFS4ERR_OPENMODE, "OPENMODE" }, \
+ { -NFS4ERR_OP_ILLEGAL, "OP_ILLEGAL" }, \
+ { -NFS4ERR_OP_NOT_IN_SESSION, "OP_NOT_IN_SESSION" }, \
+ { -NFS4ERR_PERM, "PERM" }, \
+ { -NFS4ERR_PNFS_IO_HOLE, "PNFS_IO_HOLE" }, \
+ { -NFS4ERR_PNFS_NO_LAYOUT, "PNFS_NO_LAYOUT" }, \
+ { -NFS4ERR_RECALLCONFLICT, "RECALLCONFLICT" }, \
+ { -NFS4ERR_RECLAIM_BAD, "RECLAIM_BAD" }, \
+ { -NFS4ERR_RECLAIM_CONFLICT, "RECLAIM_CONFLICT" }, \
+ { -NFS4ERR_REJECT_DELEG, "REJECT_DELEG" }, \
+ { -NFS4ERR_REP_TOO_BIG, "REP_TOO_BIG" }, \
+ { -NFS4ERR_REP_TOO_BIG_TO_CACHE, \
+ "REP_TOO_BIG_TO_CACHE" }, \
+ { -NFS4ERR_REQ_TOO_BIG, "REQ_TOO_BIG" }, \
+ { -NFS4ERR_RESTOREFH, "RESTOREFH" }, \
+ { -NFS4ERR_RETRY_UNCACHED_REP, "RETRY_UNCACHED_REP" }, \
+ { -NFS4ERR_RETURNCONFLICT, "RETURNCONFLICT" }, \
+ { -NFS4ERR_ROFS, "ROFS" }, \
+ { -NFS4ERR_SAME, "SAME" }, \
+ { -NFS4ERR_SHARE_DENIED, "SHARE_DENIED" }, \
+ { -NFS4ERR_SEQUENCE_POS, "SEQUENCE_POS" }, \
+ { -NFS4ERR_SEQ_FALSE_RETRY, "SEQ_FALSE_RETRY" }, \
+ { -NFS4ERR_SEQ_MISORDERED, "SEQ_MISORDERED" }, \
+ { -NFS4ERR_SERVERFAULT, "SERVERFAULT" }, \
+ { -NFS4ERR_STALE, "STALE" }, \
+ { -NFS4ERR_STALE_CLIENTID, "STALE_CLIENTID" }, \
+ { -NFS4ERR_STALE_STATEID, "STALE_STATEID" }, \
+ { -NFS4ERR_SYMLINK, "SYMLINK" }, \
+ { -NFS4ERR_TOOSMALL, "TOOSMALL" }, \
+ { -NFS4ERR_TOO_MANY_OPS, "TOO_MANY_OPS" }, \
+ { -NFS4ERR_UNKNOWN_LAYOUTTYPE, "UNKNOWN_LAYOUTTYPE" }, \
+ { -NFS4ERR_UNSAFE_COMPOUND, "UNSAFE_COMPOUND" }, \
+ { -NFS4ERR_WRONGSEC, "WRONGSEC" }, \
+ { -NFS4ERR_WRONG_CRED, "WRONG_CRED" }, \
+ { -NFS4ERR_WRONG_TYPE, "WRONG_TYPE" }, \
+ { -NFS4ERR_XDEV, "XDEV" })
+
+DECLARE_EVENT_CLASS(nfs4_clientid_event,
+ TP_PROTO(const struct nfs_client *clp,
+ int error),
+
+ TP_ARGS(clp, error),
+
+ TP_STRUCT__entry(
+ __string(dstaddr,
+ rpc_peeraddr2str(clp->cl_rpcclient,
+ RPC_DISPLAY_ADDR))
+ __field(int, error)
+ ),
+
+ TP_fast_assign(
+ __entry->error = error;
+ __assign_str(dstaddr,
+ rpc_peeraddr2str(clp->cl_rpcclient,
+ RPC_DISPLAY_ADDR));
+ ),
+
+ TP_printk("error=%d (%s), dstaddr=%s",
+ __entry->error,
+ show_nfsv4_errors(__entry->error),
+ __get_str(dstaddr)
+ )
+);
+#define DEFINE_NFS4_CLIENTID_EVENT(name) \
+DEFINE_EVENT(nfs4_clientid_event, name, \
+ TP_PROTO(const struct nfs_client *clp, \
+ int error), \
+ TP_ARGS(clp, error))
+DEFINE_NFS4_CLIENTID_EVENT(nfs4_setclientid);
+DEFINE_NFS4_CLIENTID_EVENT(nfs4_setclientid_confirm);
+#ifdef CONFIG_NFS_V4_1
+DEFINE_NFS4_CLIENTID_EVENT(nfs4_exchange_id);
+DEFINE_NFS4_CLIENTID_EVENT(nfs4_create_session);
+DEFINE_NFS4_CLIENTID_EVENT(nfs4_destroy_session);
+DEFINE_NFS4_CLIENTID_EVENT(nfs4_destroy_clientid);
+DEFINE_NFS4_CLIENTID_EVENT(nfs4_bind_conn_to_session);
+#endif /* CONFIG_NFS_V4_1 */
+
+#endif /* _TRACE_NFS4_H */
+
+#undef TRACE_INCLUDE_PATH
+#define TRACE_INCLUDE_PATH .
+#define TRACE_INCLUDE_FILE nfs4trace
+/* This part must be outside protection */
+#include <trace/define_trace.h>
--
1.8.3.1
^ permalink raw reply related [flat|nested] 16+ messages in thread* [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle 2013-08-13 18:35 [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 03/10] NFSv4: Add tracepoints for debugging file open Trond Myklebust 2013-08-13 19:52 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Adamson, Dros 2013-08-13 20:57 ` [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems Myklebust, Trond 2013-08-14 15:31 ` J. Bruce Fields 2 siblings, 2 replies; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs We want to be able to display the crc32 hash of the filehandle in tracepoints. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/inode.c | 3 +-- fs/nfs/internal.h | 20 ++++++++++++++++++++ 2 files changed, 21 insertions(+), 2 deletions(-) diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c index af6e806..9a98b04 100644 --- a/fs/nfs/inode.c +++ b/fs/nfs/inode.c @@ -38,7 +38,6 @@ #include <linux/slab.h> #include <linux/compat.h> #include <linux/freezer.h> -#include <linux/crc32.h> #include <asm/uaccess.h> @@ -1190,7 +1189,7 @@ u32 _nfs_display_fhandle_hash(const struct nfs_fh *fh) { /* wireshark uses 32-bit AUTODIN crc and does a bitwise * not on the result */ - return ~crc32(0xFFFFFFFF, &fh->data[0], fh->size); + return nfs_fhandle_hash(fh); } /* diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h index 9b694f1..50f7068 100644 --- a/fs/nfs/internal.h +++ b/fs/nfs/internal.h @@ -5,6 +5,7 @@ #include "nfs4_fs.h" #include <linux/mount.h> #include <linux/security.h> +#include <linux/crc32.h> #define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS) @@ -574,3 +575,22 @@ u64 nfs_timespec_to_change_attr(const struct timespec *ts) { return ((u64)ts->tv_sec << 30) + ts->tv_nsec; } + +#ifdef CONFIG_CRC32 +/** + * nfs_fhandle_hash - calculate the crc32 hash for the filehandle + * @fh - pointer to filehandle + * + * returns a crc32 hash for the filehandle that is compatible with + * the one displayed by "wireshark". + */ +static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh) +{ + return ~crc32_le(0xFFFFFFFF, &fh->data[0], fh->size); +} +#else +static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh) +{ + return 0; +} +#endif -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 03/10] NFSv4: Add tracepoints for debugging file open 2013-08-13 18:35 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 04/10] NFSv4: Add tracepoints for debugging file locking Trond Myklebust 2013-08-13 19:52 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Adamson, Dros 1 sibling, 1 reply; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Set up basic tracepoints for debugging NFSv4 file open/close Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/nfs4proc.c | 4 ++ fs/nfs/nfs4trace.h | 112 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 116 insertions(+) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 3a55f24..213c519 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -1442,6 +1442,7 @@ static int nfs4_do_open_reclaim(struct nfs_open_context *ctx, struct nfs4_state int err; do { err = _nfs4_do_open_reclaim(ctx, state); + trace_nfs4_open_reclaim(ctx, state, 0, err); if (nfs4_clear_cap_atomic_open_v1(server, err, &exception)) continue; if (err != -NFS4ERR_DELAY) @@ -1897,6 +1898,7 @@ static int nfs4_do_open_expired(struct nfs_open_context *ctx, struct nfs4_state do { err = _nfs4_open_expired(ctx, state); + trace_nfs4_open_expired(ctx, state, 0, err); if (nfs4_clear_cap_atomic_open_v1(server, err, &exception)) continue; switch (err) { @@ -2199,6 +2201,7 @@ static struct nfs4_state *nfs4_do_open(struct inode *dir, do { status = _nfs4_do_open(dir, ctx, flags, sattr, label); res = ctx->state; + trace_nfs4_open_file(ctx, res, flags, status); if (status == 0) break; /* NOTE: BAD_SEQID means the server and client disagree about the @@ -2389,6 +2392,7 @@ static void nfs4_close_done(struct rpc_task *task, void *data) dprintk("%s: begin!\n", __func__); if (!nfs4_sequence_done(task, &calldata->res.seq_res)) return; + trace_nfs4_close(state, calldata->arg.fmode, task->tk_status); /* hmm. we are done with the inode, and in the process of freeing * the state_owner. we keep this around to process errors */ diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 451954f..251806f 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -155,6 +155,19 @@ { -NFS4ERR_WRONG_TYPE, "WRONG_TYPE" }, \ { -NFS4ERR_XDEV, "XDEV" }) +#define show_open_flags(flag) \ + __print_flags((unsigned long)flags, "|", \ + { O_CREAT, "O_CREAT" }, \ + { O_EXCL, "O_EXCL" }, \ + { O_TRUNC, "O_TRUNC" }, \ + { O_DIRECT, "O_DIRECT" }) + +#define show_fmode_flags(fmode) \ + __print_flags((unsigned long)fmode, "|", \ + { FMODE_READ, "READ" }, \ + { FMODE_WRITE, "WRITE" }, \ + { FMODE_EXEC, "EXEC" }) + DECLARE_EVENT_CLASS(nfs4_clientid_event, TP_PROTO(const struct nfs_client *clp, int error), @@ -196,6 +209,105 @@ DEFINE_NFS4_CLIENTID_EVENT(nfs4_destroy_clientid); DEFINE_NFS4_CLIENTID_EVENT(nfs4_bind_conn_to_session); #endif /* CONFIG_NFS_V4_1 */ +DECLARE_EVENT_CLASS(nfs4_open_event, + TP_PROTO(const struct nfs_open_context *ctx, + const struct nfs4_state *state, + int flags, + int error), + + TP_ARGS(ctx, state, flags, error), + + TP_STRUCT__entry( + __field(int, error) + __field(int, flags) + __field(fmode_t, fmode) + __field(dev_t, dev) + __field(u32, fhandle) + __field(u64, fileid) + __field(u64, dir) + __string(name, ctx->dentry->d_name.name) + ), + + TP_fast_assign( + struct inode *inode = NULL; + if (!IS_ERR(state)) + inode = state->inode; + __entry->error = error; + __entry->flags = flags; + __entry->dev = ctx->dentry->d_sb->s_dev; + if (inode != NULL) { + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); + } else { + __entry->fileid = 0; + __entry->fhandle = 0; + } + __entry->dir = NFS_FILEID(ctx->dentry->d_parent->d_inode); + __assign_str(name, ctx->dentry->d_name.name); + ), + + TP_printk("error=%d (%s), flags=%d (%s) mode=%s fileid=%lld, " + "fhandle=%0x08x name=%02x:%02x:%lld/%s", + __entry->error, + show_nfsv4_errors(__entry->error), + __entry->flags, + show_open_flags(__entry->flags), + show_fmode_flags(__entry->fmode), + (unsigned long long)__entry->fileid, + __entry->fhandle, + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->dir, + __get_str(name) + ) +); + +#define DEFINE_NFS4_OPEN_EVENT(name) \ +DEFINE_EVENT(nfs4_open_event, name, \ + TP_PROTO(const struct nfs_open_context *ctx, \ + const struct nfs4_state *state, \ + int flags, \ + int error), \ + TP_ARGS(ctx, state, flags, error)) +DEFINE_NFS4_OPEN_EVENT(nfs4_open_reclaim); +DEFINE_NFS4_OPEN_EVENT(nfs4_open_expired); +DEFINE_NFS4_OPEN_EVENT(nfs4_open_file); + +TRACE_EVENT(nfs4_close, + TP_PROTO(const struct nfs4_state *state, + fmode_t fmode, + int error), + + TP_ARGS(state, fmode, error), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(u32, fhandle) + __field(u64, fileid) + __field(fmode_t, fmode) + __field(int, error) + ), + + TP_fast_assign( + struct inode *inode = state->inode; + + __entry->dev = inode->i_sb->s_dev; + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); + __entry->fmode = fmode; + __entry->error = error; + ), + + TP_printk("error=%d (%s) mode=%s fileid=%02x:%02x:%lld, " + "fhandle=%0x08x", + __entry->error, + show_nfsv4_errors(__entry->error), + show_fmode_flags(__entry->fmode), + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->fileid, + __entry->fhandle + ) +); + #endif /* _TRACE_NFS4_H */ #undef TRACE_INCLUDE_PATH -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 04/10] NFSv4: Add tracepoints for debugging file locking 2013-08-13 18:35 ` [PATCH 03/10] NFSv4: Add tracepoints for debugging file open Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 05/10] NFSv4: Add tracepoints for debugging lookup/create operations Trond Myklebust 0 siblings, 1 reply; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Set up basic tracepoints for debugging NFSv4 file lock/unlock Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/nfs4proc.c | 9 +++++-- fs/nfs/nfs4trace.h | 77 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 84 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 213c519..3be9bb3 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -4963,8 +4963,9 @@ static int nfs4_proc_getlk(struct nfs4_state *state, int cmd, struct file_lock * int err; do { - err = nfs4_handle_exception(NFS_SERVER(state->inode), - _nfs4_proc_getlk(state, cmd, request), + err = _nfs4_proc_getlk(state, cmd, request); + trace_nfs4_get_lock(request, state, cmd, err); + err = nfs4_handle_exception(NFS_SERVER(state->inode), err, &exception); } while (exception.retry); return err; @@ -5162,6 +5163,7 @@ static int nfs4_proc_unlck(struct nfs4_state *state, int cmd, struct file_lock * rpc_put_task(task); out: request->fl_flags = fl_flags; + trace_nfs4_unlock(request, state, F_SETLK, status); return status; } @@ -5385,6 +5387,7 @@ static int nfs4_lock_reclaim(struct nfs4_state *state, struct file_lock *request if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) return 0; err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_RECLAIM); + trace_nfs4_lock_reclaim(request, state, F_SETLK, err); if (err != -NFS4ERR_DELAY) break; nfs4_handle_exception(server, err, &exception); @@ -5407,6 +5410,7 @@ static int nfs4_lock_expired(struct nfs4_state *state, struct file_lock *request if (test_bit(NFS_DELEGATED_STATE, &state->flags) != 0) return 0; err = _nfs4_do_setlk(state, F_SETLK, request, NFS_LOCK_EXPIRED); + trace_nfs4_lock_expired(request, state, F_SETLK, err); switch (err) { default: goto out; @@ -5529,6 +5533,7 @@ static int nfs4_proc_setlk(struct nfs4_state *state, int cmd, struct file_lock * do { err = _nfs4_proc_setlk(state, cmd, request); + trace_nfs4_set_lock(request, state, cmd, err); if (err == -NFS4ERR_DENIED) err = -EAGAIN; err = nfs4_handle_exception(NFS_SERVER(state->inode), diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 251806f..45972f2 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -308,6 +308,83 @@ TRACE_EVENT(nfs4_close, ) ); +#define show_lock_cmd(type) \ + __print_symbolic((int)type, \ + { F_GETLK, "GETLK" }, \ + { F_SETLK, "SETLK" }, \ + { F_SETLKW, "SETLKW" }) +#define show_lock_type(type) \ + __print_symbolic((int)type, \ + { F_RDLCK, "RDLCK" }, \ + { F_WRLCK, "WRLCK" }, \ + { F_UNLCK, "UNLCK" }) + +DECLARE_EVENT_CLASS(nfs4_lock_event, + TP_PROTO(const struct file_lock *request, + const struct nfs4_state *state, + int cmd, + int error), + + TP_ARGS(request, state, cmd, error), + + TP_STRUCT__entry( + __field(int, error) + __field(int, cmd) + __field(char, type) + __field(loff_t, start) + __field(loff_t, end) + __field(dev_t, dev) + __field(u32, fhandle) + __field(u64, fileid) + __field(u64, dir) + __string(name, request->fl_file->f_path.dentry->d_name.name) + ), + + TP_fast_assign( + struct dentry *dentry = request->fl_file->f_path.dentry; + struct inode *inode = state->inode; + + __entry->error = error; + __entry->cmd = cmd; + __entry->type = request->fl_type; + __entry->start = request->fl_start; + __entry->end = request->fl_end; + __entry->dev = inode->i_sb->s_dev; + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); + __entry->dir = NFS_FILEID(dentry->d_parent->d_inode); + __assign_str(name, dentry->d_name.name); + ), + + TP_printk("error=%d (%s), cmd=%s:%s range=%lld:%lld " + "fileid=%lld, fhandle=%0x08x name=%02x:%02x:%lld/%s", + __entry->error, + show_nfsv4_errors(__entry->error), + show_lock_cmd(__entry->cmd), + show_lock_type(__entry->type), + (unsigned long long)__entry->start, + (unsigned long long)__entry->end, + (unsigned long long)__entry->fileid, + __entry->fhandle, + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->dir, + __get_str(name) + ) +); + +#define DEFINE_NFS4_LOCK_EVENT(name) \ +DEFINE_EVENT(nfs4_lock_event, name, \ + TP_PROTO(const struct file_lock *request,\ + const struct nfs4_state *state, \ + int cmd, \ + int error), \ + TP_ARGS(request, state, cmd, error)) +DEFINE_NFS4_LOCK_EVENT(nfs4_get_lock); +DEFINE_NFS4_LOCK_EVENT(nfs4_set_lock); +DEFINE_NFS4_LOCK_EVENT(nfs4_lock_reclaim); +DEFINE_NFS4_LOCK_EVENT(nfs4_lock_expired); +DEFINE_NFS4_LOCK_EVENT(nfs4_unlock); + #endif /* _TRACE_NFS4_H */ #undef TRACE_INCLUDE_PATH -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 05/10] NFSv4: Add tracepoints for debugging lookup/create operations 2013-08-13 18:35 ` [PATCH 04/10] NFSv4: Add tracepoints for debugging file locking Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 06/10] NFSv4: Add tracepoints for debugging inode manipulations Trond Myklebust 0 siblings, 1 reply; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Set up basic tracepoints for debugging NFSv4 lookup, unlink/remove, symlink, mkdir, mknod, fs_locations and secinfo. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/nfs4proc.c | 37 +++++++++++++++++++++++-------------- fs/nfs/nfs4trace.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 14 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 3be9bb3..3f639c8 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -3026,6 +3026,7 @@ static int nfs4_proc_lookup_common(struct rpc_clnt **clnt, struct inode *dir, int err; do { err = _nfs4_proc_lookup(client, dir, name, fhandle, fattr, label); + trace_nfs4_lookup(dir, name, err); switch (err) { case -NFS4ERR_BADNAME: err = -ENOENT; @@ -3261,8 +3262,9 @@ static int nfs4_proc_remove(struct inode *dir, struct qstr *name) struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(dir), - _nfs4_proc_remove(dir, name), + err = _nfs4_proc_remove(dir, name); + trace_nfs4_remove(dir, name, err); + err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception); } while (exception.retry); return err; @@ -3291,10 +3293,12 @@ static void nfs4_proc_unlink_rpc_prepare(struct rpc_task *task, struct nfs_unlin static int nfs4_proc_unlink_done(struct rpc_task *task, struct inode *dir) { - struct nfs_removeres *res = task->tk_msg.rpc_resp; + struct nfs_unlinkdata *data = task->tk_calldata; + struct nfs_removeres *res = &data->res; if (!nfs4_sequence_done(task, &res->seq_res)) return 0; + trace_nfs4_remove_async(dir, &data->args.name, task->tk_status); if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN) return 0; update_changeattr(dir, &res->cinfo); @@ -3533,9 +3537,9 @@ static int nfs4_proc_symlink(struct inode *dir, struct dentry *dentry, label = nfs4_label_init_security(dir, dentry, sattr, &l); do { - err = nfs4_handle_exception(NFS_SERVER(dir), - _nfs4_proc_symlink(dir, dentry, page, - len, sattr, label), + err = _nfs4_proc_symlink(dir, dentry, page, len, sattr, label); + trace_nfs4_symlink(dir, &dentry->d_name, err); + err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception); } while (exception.retry); @@ -3572,8 +3576,9 @@ static int nfs4_proc_mkdir(struct inode *dir, struct dentry *dentry, sattr->ia_mode &= ~current_umask(); do { - err = nfs4_handle_exception(NFS_SERVER(dir), - _nfs4_proc_mkdir(dir, dentry, sattr, label), + err = _nfs4_proc_mkdir(dir, dentry, sattr, label); + trace_nfs4_mkdir(dir, &dentry->d_name, err); + err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception); } while (exception.retry); nfs4_label_release_security(label); @@ -3680,8 +3685,9 @@ static int nfs4_proc_mknod(struct inode *dir, struct dentry *dentry, sattr->ia_mode &= ~current_umask(); do { - err = nfs4_handle_exception(NFS_SERVER(dir), - _nfs4_proc_mknod(dir, dentry, sattr, label, rdev), + err = _nfs4_proc_mknod(dir, dentry, sattr, label, rdev); + trace_nfs4_mknod(dir, &dentry->d_name, err); + err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception); } while (exception.retry); @@ -5800,8 +5806,10 @@ int nfs4_proc_fs_locations(struct rpc_clnt *client, struct inode *dir, struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(dir), - _nfs4_proc_fs_locations(client, dir, name, fs_locations, page), + err = _nfs4_proc_fs_locations(client, dir, name, + fs_locations, page); + trace_nfs4_get_fs_locations(dir, name, err); + err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception); } while (exception.retry); return err; @@ -5835,8 +5843,9 @@ int nfs4_proc_secinfo(struct inode *dir, const struct qstr *name, struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(dir), - _nfs4_proc_secinfo(dir, name, flavors), + err = _nfs4_proc_secinfo(dir, name, flavors); + trace_nfs4_secinfo(dir, name, err); + err = nfs4_handle_exception(NFS_SERVER(dir), err, &exception); } while (exception.retry); return err; diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 45972f2..3e68a75 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -385,6 +385,52 @@ DEFINE_NFS4_LOCK_EVENT(nfs4_lock_reclaim); DEFINE_NFS4_LOCK_EVENT(nfs4_lock_expired); DEFINE_NFS4_LOCK_EVENT(nfs4_unlock); +DECLARE_EVENT_CLASS(nfs4_lookup_event, + TP_PROTO(const struct inode *dir, + const struct qstr *name, + int error), + + TP_ARGS(dir, name, error), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(int, error) + __field(u64, dir) + __string(name, name->name) + ), + + TP_fast_assign( + __entry->dev = dir->i_sb->s_dev; + __entry->dir = NFS_FILEID(dir); + __entry->error = error; + __assign_str(name, name->name); + ), + + TP_printk("error=%d (%s), name=%02x:%02x:%lld/%s", + __entry->error, + show_nfsv4_errors(__entry->error), + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->dir, + __get_str(name) + ) +); + +#define DEFINE_NFS4_LOOKUP_EVENT(name) \ +DEFINE_EVENT(nfs4_lookup_event, name, \ + TP_PROTO(const struct inode *dir, \ + const struct qstr *name, \ + int error), \ + TP_ARGS(dir, name, error)) + +DEFINE_NFS4_LOOKUP_EVENT(nfs4_lookup); +DEFINE_NFS4_LOOKUP_EVENT(nfs4_symlink); +DEFINE_NFS4_LOOKUP_EVENT(nfs4_mkdir); +DEFINE_NFS4_LOOKUP_EVENT(nfs4_mknod); +DEFINE_NFS4_LOOKUP_EVENT(nfs4_remove); +DEFINE_NFS4_LOOKUP_EVENT(nfs4_remove_async); +DEFINE_NFS4_LOOKUP_EVENT(nfs4_get_fs_locations); +DEFINE_NFS4_LOOKUP_EVENT(nfs4_secinfo); + #endif /* _TRACE_NFS4_H */ #undef TRACE_INCLUDE_PATH -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 06/10] NFSv4: Add tracepoints for debugging inode manipulations 2013-08-13 18:35 ` [PATCH 05/10] NFSv4: Add tracepoints for debugging lookup/create operations Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 07/10] NFSv4: Add tracepoints for debugging rename Trond Myklebust 0 siblings, 1 reply; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Set up basic tracepoints for debugging NFSv4 setattr, access, readlink, readdir, get_acl set_acl get_security_label, and set_security_label. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/nfs4proc.c | 36 ++++++++++++++++++++++-------------- fs/nfs/nfs4trace.h | 46 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 68 insertions(+), 14 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index 3f639c8..be75a11 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2315,6 +2315,7 @@ static int nfs4_do_setattr(struct inode *inode, struct rpc_cred *cred, int err; do { err = _nfs4_do_setattr(inode, cred, fattr, sattr, state, ilabel, olabel); + trace_nfs4_setattr(inode, err); switch (err) { case -NFS4ERR_OPENMODE: if (!(sattr->ia_valid & ATTR_SIZE)) { @@ -3143,8 +3144,9 @@ static int nfs4_proc_access(struct inode *inode, struct nfs_access_entry *entry) struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(inode), - _nfs4_proc_access(inode, entry), + err = _nfs4_proc_access(inode, entry); + trace_nfs4_access(inode, err); + err = nfs4_handle_exception(NFS_SERVER(inode), err, &exception); } while (exception.retry); return err; @@ -3197,8 +3199,9 @@ static int nfs4_proc_readlink(struct inode *inode, struct page *page, struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(inode), - _nfs4_proc_readlink(inode, page, pgbase, pglen), + err = _nfs4_proc_readlink(inode, page, pgbase, pglen); + trace_nfs4_readlink(inode, err); + err = nfs4_handle_exception(NFS_SERVER(inode), err, &exception); } while (exception.retry); return err; @@ -3631,9 +3634,10 @@ static int nfs4_proc_readdir(struct dentry *dentry, struct rpc_cred *cred, struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode), - _nfs4_proc_readdir(dentry, cred, cookie, - pages, count, plus), + err = _nfs4_proc_readdir(dentry, cred, cookie, + pages, count, plus); + trace_nfs4_readdir(dentry->d_inode, err); + err = nfs4_handle_exception(NFS_SERVER(dentry->d_inode), err, &exception); } while (exception.retry); return err; @@ -4333,6 +4337,7 @@ static ssize_t nfs4_get_acl_uncached(struct inode *inode, void *buf, size_t bufl ssize_t ret; do { ret = __nfs4_get_acl_uncached(inode, buf, buflen); + trace_nfs4_get_acl(inode, ret); if (ret >= 0) break; ret = nfs4_handle_exception(NFS_SERVER(inode), ret, &exception); @@ -4412,8 +4417,9 @@ static int nfs4_proc_set_acl(struct inode *inode, const void *buf, size_t buflen struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(inode), - __nfs4_proc_set_acl(inode, buf, buflen), + err = __nfs4_proc_set_acl(inode, buf, buflen); + trace_nfs4_set_acl(inode, err); + err = nfs4_handle_exception(NFS_SERVER(inode), err, &exception); } while (exception.retry); return err; @@ -4466,8 +4472,9 @@ static int nfs4_get_security_label(struct inode *inode, void *buf, return -EOPNOTSUPP; do { - err = nfs4_handle_exception(NFS_SERVER(inode), - _nfs4_get_security_label(inode, buf, buflen), + err = _nfs4_get_security_label(inode, buf, buflen); + trace_nfs4_get_security_label(inode, err); + err = nfs4_handle_exception(NFS_SERVER(inode), err, &exception); } while (exception.retry); return err; @@ -4519,9 +4526,10 @@ static int nfs4_do_set_security_label(struct inode *inode, int err; do { - err = nfs4_handle_exception(NFS_SERVER(inode), - _nfs4_do_set_security_label(inode, ilabel, - fattr, olabel), + err = _nfs4_do_set_security_label(inode, ilabel, + fattr, olabel); + trace_nfs4_set_security_label(inode, err); + err = nfs4_handle_exception(NFS_SERVER(inode), err, &exception); } while (exception.retry); return err; diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 3e68a75..f32cd614 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -431,6 +431,52 @@ DEFINE_NFS4_LOOKUP_EVENT(nfs4_remove_async); DEFINE_NFS4_LOOKUP_EVENT(nfs4_get_fs_locations); DEFINE_NFS4_LOOKUP_EVENT(nfs4_secinfo); +DECLARE_EVENT_CLASS(nfs4_inode_event, + TP_PROTO(const struct inode *inode, + int error), + + TP_ARGS(inode, error), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(u32, fhandle) + __field(u64, fileid) + __field(int, error) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); + __entry->error = error; + ), + + TP_printk("error=%d (%s) fileid=%02x:%02x:%lld, fhandle=%0x08x", + __entry->error, + show_nfsv4_errors(__entry->error), + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->fileid, + __entry->fhandle + ) +); + +#define DEFINE_NFS4_INODE_EVENT(name) \ +DEFINE_EVENT(nfs4_inode_event, name, \ + TP_PROTO(const struct inode *inode, \ + int error), \ + TP_ARGS(inode, error)) + +DEFINE_NFS4_INODE_EVENT(nfs4_setattr); +DEFINE_NFS4_INODE_EVENT(nfs4_access); +DEFINE_NFS4_INODE_EVENT(nfs4_readlink); +DEFINE_NFS4_INODE_EVENT(nfs4_readdir); +DEFINE_NFS4_INODE_EVENT(nfs4_get_acl); +DEFINE_NFS4_INODE_EVENT(nfs4_set_acl); +#ifdef CONFIG_NFS_V4_SECURITY_LABEL +DEFINE_NFS4_INODE_EVENT(nfs4_get_security_label); +DEFINE_NFS4_INODE_EVENT(nfs4_set_security_label); +#endif /* CONFIG_NFS_V4_SECURITY_LABEL */ + #endif /* _TRACE_NFS4_H */ #undef TRACE_INCLUDE_PATH -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 07/10] NFSv4: Add tracepoints for debugging rename 2013-08-13 18:35 ` [PATCH 06/10] NFSv4: Add tracepoints for debugging inode manipulations Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 08/10] NFSv4: Add tracepoints for debugging delegations Trond Myklebust 0 siblings, 1 reply; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Add tracepoints to debug both synchronous and asynchronous renames. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/nfs4proc.c | 13 +++++++++---- fs/nfs/nfs4trace.h | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 59 insertions(+), 4 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index be75a11..e3d69b3 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -3330,10 +3330,14 @@ static void nfs4_proc_rename_rpc_prepare(struct rpc_task *task, struct nfs_renam static int nfs4_proc_rename_done(struct rpc_task *task, struct inode *old_dir, struct inode *new_dir) { - struct nfs_renameres *res = task->tk_msg.rpc_resp; + struct nfs_renamedata *data = task->tk_calldata; + struct nfs_renameres *res = &data->res; if (!nfs4_sequence_done(task, &res->seq_res)) return 0; + trace_nfs4_rename_async(old_dir, data->args.old_name, + new_dir, data->args.new_name, + task->tk_status); if (nfs4_async_handle_error(task, res->server, NULL) == -EAGAIN) return 0; @@ -3376,9 +3380,10 @@ static int nfs4_proc_rename(struct inode *old_dir, struct qstr *old_name, struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(NFS_SERVER(old_dir), - _nfs4_proc_rename(old_dir, old_name, - new_dir, new_name), + err = _nfs4_proc_rename(old_dir, old_name, + new_dir, new_name); + trace_nfs4_rename(old_dir, old_name, new_dir, new_name, err); + err = nfs4_handle_exception(NFS_SERVER(old_dir), err, &exception); } while (exception.retry); return err; diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index f32cd614..638fc7a 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -431,6 +431,56 @@ DEFINE_NFS4_LOOKUP_EVENT(nfs4_remove_async); DEFINE_NFS4_LOOKUP_EVENT(nfs4_get_fs_locations); DEFINE_NFS4_LOOKUP_EVENT(nfs4_secinfo); +DECLARE_EVENT_CLASS(nfs4_rename_event, + TP_PROTO(const struct inode *olddir, + const struct qstr *oldname, + const struct inode *newdir, + const struct qstr *newname, + int error), + + TP_ARGS(olddir, oldname, newdir, newname, error), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(int, error) + __field(u64, olddir) + __string(oldname, oldname->name) + __field(u64, newdir) + __string(newname, newname->name) + ), + + TP_fast_assign( + __entry->dev = olddir->i_sb->s_dev; + __entry->olddir = NFS_FILEID(olddir); + __entry->newdir = NFS_FILEID(newdir); + __entry->error = error; + __assign_str(oldname, oldname->name); + __assign_str(newname, newname->name); + ), + + TP_printk("error=%d (%s), oldname=%02x:%02x:%lld/%s, " + "newname=%02x:%02x:%lld/%s", + __entry->error, + show_nfsv4_errors(__entry->error), + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->olddir, + __get_str(oldname), + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->newdir, + __get_str(newname) + ) +); +#define DEFINE_NFS4_RENAME_EVENT(name) \ + DEFINE_EVENT(nfs4_rename_event, name, \ + TP_PROTO(const struct inode *olddir, \ + const struct qstr *oldname, \ + const struct inode *newdir, \ + const struct qstr *newname, \ + int error), \ + TP_ARGS(olddir, oldname, newdir, newname, error)) +DEFINE_NFS4_RENAME_EVENT(nfs4_rename); +DEFINE_NFS4_RENAME_EVENT(nfs4_rename_async); + DECLARE_EVENT_CLASS(nfs4_inode_event, TP_PROTO(const struct inode *inode, int error), -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 08/10] NFSv4: Add tracepoints for debugging delegations 2013-08-13 18:35 ` [PATCH 07/10] NFSv4: Add tracepoints for debugging rename Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 09/10] NFSv4: Add tracepoints for debugging the idmapper Trond Myklebust 0 siblings, 1 reply; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Set up tracepoints to track when delegations are set, reclaimed, returned by the client, or recalled by the server. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/callback_proc.c | 2 ++ fs/nfs/delegation.c | 3 +++ fs/nfs/nfs4proc.c | 1 + fs/nfs/nfs4trace.h | 37 +++++++++++++++++++++++++++++++++++++ 4 files changed, 43 insertions(+) diff --git a/fs/nfs/callback_proc.c b/fs/nfs/callback_proc.c index e6ebc4c..88d6d2f 100644 --- a/fs/nfs/callback_proc.c +++ b/fs/nfs/callback_proc.c @@ -15,6 +15,7 @@ #include "internal.h" #include "pnfs.h" #include "nfs4session.h" +#include "nfs4trace.h" #ifdef NFS_DEBUG #define NFSDBG_FACILITY NFSDBG_CALLBACK @@ -93,6 +94,7 @@ __be32 nfs4_callback_recall(struct cb_recallargs *args, void *dummy, default: res = htonl(NFS4ERR_RESOURCE); } + trace_nfs4_recall_delegation(inode, ntohl(res)); iput(inode); out: dprintk("%s: exit with status = %d\n", __func__, ntohl(res)); diff --git a/fs/nfs/delegation.c b/fs/nfs/delegation.c index 7ec4814..ef792f2 100644 --- a/fs/nfs/delegation.c +++ b/fs/nfs/delegation.c @@ -20,6 +20,7 @@ #include "nfs4_fs.h" #include "delegation.h" #include "internal.h" +#include "nfs4trace.h" static void nfs_free_delegation(struct nfs_delegation *delegation) { @@ -160,6 +161,7 @@ void nfs_inode_reclaim_delegation(struct inode *inode, struct rpc_cred *cred, spin_unlock(&delegation->lock); put_rpccred(oldcred); rcu_read_unlock(); + trace_nfs4_reclaim_delegation(inode, res->delegation_type); } else { /* We appear to have raced with a delegation return. */ spin_unlock(&delegation->lock); @@ -344,6 +346,7 @@ int nfs_inode_set_delegation(struct inode *inode, struct rpc_cred *cred, struct spin_lock(&inode->i_lock); nfsi->cache_validity |= NFS_INO_REVAL_FORCED; spin_unlock(&inode->i_lock); + trace_nfs4_set_delegation(inode, res->delegation_type); out: spin_unlock(&clp->cl_lock); diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index e3d69b3..ce6ef6a 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -4908,6 +4908,7 @@ int nfs4_proc_delegreturn(struct inode *inode, struct rpc_cred *cred, const nfs4 int err; do { err = _nfs4_proc_delegreturn(inode, cred, stateid, issync); + trace_nfs4_delegreturn(inode, err); switch (err) { case -NFS4ERR_STALE_STATEID: case -NFS4ERR_EXPIRED: diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 638fc7a..91321c5 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -385,6 +385,41 @@ DEFINE_NFS4_LOCK_EVENT(nfs4_lock_reclaim); DEFINE_NFS4_LOCK_EVENT(nfs4_lock_expired); DEFINE_NFS4_LOCK_EVENT(nfs4_unlock); +DECLARE_EVENT_CLASS(nfs4_set_delegation_event, + TP_PROTO(const struct inode *inode, + fmode_t fmode), + + TP_ARGS(inode, fmode), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(u32, fhandle) + __field(u64, fileid) + __field(fmode_t, fmode) + ), + + TP_fast_assign( + __entry->dev = inode->i_sb->s_dev; + __entry->fileid = NFS_FILEID(inode); + __entry->fhandle = nfs_fhandle_hash(NFS_FH(inode)); + __entry->fmode = fmode; + ), + + TP_printk("mode=%s fileid=%02x:%02x:%lld, fhandle=%0x08x", + show_fmode_flags(__entry->fmode), + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->fileid, + __entry->fhandle + ) +); +#define DEFINE_NFS4_SET_DELEGATION_EVENT(name) \ +DEFINE_EVENT(nfs4_set_delegation_event, name, \ + TP_PROTO(const struct inode *inode, \ + fmode_t fmode), \ + TP_ARGS(inode, fmode)) +DEFINE_NFS4_SET_DELEGATION_EVENT(nfs4_set_delegation); +DEFINE_NFS4_SET_DELEGATION_EVENT(nfs4_reclaim_delegation); + DECLARE_EVENT_CLASS(nfs4_lookup_event, TP_PROTO(const struct inode *dir, const struct qstr *name, @@ -526,6 +561,8 @@ DEFINE_NFS4_INODE_EVENT(nfs4_set_acl); DEFINE_NFS4_INODE_EVENT(nfs4_get_security_label); DEFINE_NFS4_INODE_EVENT(nfs4_set_security_label); #endif /* CONFIG_NFS_V4_SECURITY_LABEL */ +DEFINE_NFS4_INODE_EVENT(nfs4_recall_delegation); +DEFINE_NFS4_INODE_EVENT(nfs4_delegreturn); #endif /* _TRACE_NFS4_H */ -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 09/10] NFSv4: Add tracepoints for debugging the idmapper 2013-08-13 18:35 ` [PATCH 08/10] NFSv4: Add tracepoints for debugging delegations Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 2013-08-13 18:35 ` [PATCH 10/10] NFSv4: Add tracepoints for debugging getattr Trond Myklebust 0 siblings, 1 reply; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Add tracepoints to help debug uid/gid mappings to username/group. Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/idmap.c | 5 +++++ fs/nfs/nfs4trace.h | 41 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 46 insertions(+) diff --git a/fs/nfs/idmap.c b/fs/nfs/idmap.c index c2c4163..f16a872 100644 --- a/fs/nfs/idmap.c +++ b/fs/nfs/idmap.c @@ -49,6 +49,7 @@ #include "internal.h" #include "netns.h" +#include "nfs4trace.h" #define NFS_UINT_MAXLEN 11 @@ -849,6 +850,7 @@ int nfs_map_name_to_uid(const struct nfs_server *server, const char *name, size_ if (!uid_valid(*uid)) ret = -ERANGE; } + trace_nfs4_map_name_to_uid(name, namelen, id, ret); return ret; } @@ -865,6 +867,7 @@ int nfs_map_group_to_gid(const struct nfs_server *server, const char *name, size if (!gid_valid(*gid)) ret = -ERANGE; } + trace_nfs4_map_group_to_gid(name, namelen, id, ret); return ret; } @@ -879,6 +882,7 @@ int nfs_map_uid_to_name(const struct nfs_server *server, kuid_t uid, char *buf, ret = nfs_idmap_lookup_name(id, "user", buf, buflen, idmap); if (ret < 0) ret = nfs_map_numeric_to_string(id, buf, buflen); + trace_nfs4_map_uid_to_name(buf, ret, id, ret); return ret; } int nfs_map_gid_to_group(const struct nfs_server *server, kgid_t gid, char *buf, size_t buflen) @@ -892,5 +896,6 @@ int nfs_map_gid_to_group(const struct nfs_server *server, kgid_t gid, char *buf, ret = nfs_idmap_lookup_name(id, "group", buf, buflen, idmap); if (ret < 0) ret = nfs_map_numeric_to_string(id, buf, buflen); + trace_nfs4_map_gid_to_group(buf, ret, id, ret); return ret; } diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 91321c5..11b2b98 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -564,6 +564,47 @@ DEFINE_NFS4_INODE_EVENT(nfs4_set_security_label); DEFINE_NFS4_INODE_EVENT(nfs4_recall_delegation); DEFINE_NFS4_INODE_EVENT(nfs4_delegreturn); +DECLARE_EVENT_CLASS(nfs4_idmap_event, + TP_PROTO(const char *name, + int len, + u32 id, + int error), + + TP_ARGS(name, len, id, error), + + TP_STRUCT__entry( + __field(int, error) + __field(u32, id) + __dynamic_array(char, name, len > 0 ? len + 1 : 1) + ), + + TP_fast_assign( + if (len < 0) + len = 0; + __entry->error = error < 0 ? error : 0; + __entry->id = id; + memcpy(__get_dynamic_array(name), name, len); + ((char *)__get_dynamic_array(name))[len] = 0; + ), + + TP_printk("error=%d, id=%u, name=%s", + __entry->error, + __entry->id, + __get_str(name) + ) +); +#define DEFINE_NFS4_IDMAP_EVENT(name) \ +DEFINE_EVENT(nfs4_idmap_event, name, \ + TP_PROTO(const char *name, \ + int len, \ + u32 id, \ + int error), \ + TP_ARGS(name, len, id, error)) +DEFINE_NFS4_IDMAP_EVENT(nfs4_map_name_to_uid); +DEFINE_NFS4_IDMAP_EVENT(nfs4_map_group_to_gid); +DEFINE_NFS4_IDMAP_EVENT(nfs4_map_uid_to_name); +DEFINE_NFS4_IDMAP_EVENT(nfs4_map_gid_to_group); + #endif /* _TRACE_NFS4_H */ #undef TRACE_INCLUDE_PATH -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* [PATCH 10/10] NFSv4: Add tracepoints for debugging getattr 2013-08-13 18:35 ` [PATCH 09/10] NFSv4: Add tracepoints for debugging the idmapper Trond Myklebust @ 2013-08-13 18:35 ` Trond Myklebust 0 siblings, 0 replies; 16+ messages in thread From: Trond Myklebust @ 2013-08-13 18:35 UTC (permalink / raw) To: linux-nfs Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> --- fs/nfs/nfs4proc.c | 7 ++++-- fs/nfs/nfs4trace.h | 64 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 69 insertions(+), 2 deletions(-) diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c index ce6ef6a..3330ac0 100644 --- a/fs/nfs/nfs4proc.c +++ b/fs/nfs/nfs4proc.c @@ -2697,6 +2697,7 @@ static int nfs4_lookup_root(struct nfs_server *server, struct nfs_fh *fhandle, int err; do { err = _nfs4_lookup_root(server, fhandle, info); + trace_nfs4_lookup_root(server, fhandle, info->fattr, err); switch (err) { case 0: case -NFS4ERR_WRONGSEC: @@ -2906,8 +2907,9 @@ static int nfs4_proc_getattr(struct nfs_server *server, struct nfs_fh *fhandle, struct nfs4_exception exception = { }; int err; do { - err = nfs4_handle_exception(server, - _nfs4_proc_getattr(server, fhandle, fattr, label), + err = _nfs4_proc_getattr(server, fhandle, fattr, label); + trace_nfs4_getattr(server, fhandle, fattr, err); + err = nfs4_handle_exception(server, err, &exception); } while (exception.retry); return err; @@ -3764,6 +3766,7 @@ static int nfs4_do_fsinfo(struct nfs_server *server, struct nfs_fh *fhandle, str do { err = _nfs4_do_fsinfo(server, fhandle, fsinfo); + trace_nfs4_fsinfo(server, fhandle, fsinfo->fattr, err); if (err == 0) { struct nfs_client *clp = server->nfs_client; diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h index 11b2b98..67a6bbb 100644 --- a/fs/nfs/nfs4trace.h +++ b/fs/nfs/nfs4trace.h @@ -168,6 +168,24 @@ { FMODE_WRITE, "WRITE" }, \ { FMODE_EXEC, "EXEC" }) +#define show_nfs_fattr_flags(valid) \ + __print_flags((unsigned long)valid, "|", \ + { NFS_ATTR_FATTR_TYPE, "TYPE" }, \ + { NFS_ATTR_FATTR_MODE, "MODE" }, \ + { NFS_ATTR_FATTR_NLINK, "NLINK" }, \ + { NFS_ATTR_FATTR_OWNER, "OWNER" }, \ + { NFS_ATTR_FATTR_GROUP, "GROUP" }, \ + { NFS_ATTR_FATTR_RDEV, "RDEV" }, \ + { NFS_ATTR_FATTR_SIZE, "SIZE" }, \ + { NFS_ATTR_FATTR_FSID, "FSID" }, \ + { NFS_ATTR_FATTR_FILEID, "FILEID" }, \ + { NFS_ATTR_FATTR_ATIME, "ATIME" }, \ + { NFS_ATTR_FATTR_MTIME, "MTIME" }, \ + { NFS_ATTR_FATTR_CTIME, "CTIME" }, \ + { NFS_ATTR_FATTR_CHANGE, "CHANGE" }, \ + { NFS_ATTR_FATTR_OWNER_NAME, "OWNER_NAME" }, \ + { NFS_ATTR_FATTR_GROUP_NAME, "GROUP_NAME" }) + DECLARE_EVENT_CLASS(nfs4_clientid_event, TP_PROTO(const struct nfs_client *clp, int error), @@ -564,6 +582,52 @@ DEFINE_NFS4_INODE_EVENT(nfs4_set_security_label); DEFINE_NFS4_INODE_EVENT(nfs4_recall_delegation); DEFINE_NFS4_INODE_EVENT(nfs4_delegreturn); +DECLARE_EVENT_CLASS(nfs4_getattr_event, + TP_PROTO(const struct nfs_server *server, + const struct nfs_fh *fhandle, + const struct nfs_fattr *fattr, + int error), + + TP_ARGS(server, fhandle, fattr, error), + + TP_STRUCT__entry( + __field(dev_t, dev) + __field(u32, fhandle) + __field(u64, fileid) + __field(unsigned int, valid) + __field(int, error) + ), + + TP_fast_assign( + __entry->dev = server->s_dev; + __entry->valid = fattr->valid; + __entry->fhandle = nfs_fhandle_hash(fhandle); + __entry->fileid = (fattr->valid & NFS_ATTR_FATTR_FILEID) ? fattr->fileid : 0; + __entry->error = error; + ), + + TP_printk("error=%d (%s) fileid=%02x:%02x:%lld fhandle=%0x08x " + "valid=%s", + __entry->error, + show_nfsv4_errors(__entry->error), + MAJOR(__entry->dev), MINOR(__entry->dev), + (unsigned long long)__entry->fileid, + __entry->fhandle, + show_nfs_fattr_flags(__entry->valid) + ) +); + +#define DEFINE_NFS4_GETATTR_EVENT(name) \ +DEFINE_EVENT(nfs4_getattr_event, name, \ + TP_PROTO(const struct nfs_server *server, \ + const struct nfs_fh *fhandle, \ + const struct nfs_fattr *fattr, \ + int error), \ + TP_ARGS(server, fhandle, fattr, error)) +DEFINE_NFS4_GETATTR_EVENT(nfs4_getattr); +DEFINE_NFS4_GETATTR_EVENT(nfs4_lookup_root); +DEFINE_NFS4_GETATTR_EVENT(nfs4_fsinfo); + DECLARE_EVENT_CLASS(nfs4_idmap_event, TP_PROTO(const char *name, int len, -- 1.8.3.1 ^ permalink raw reply related [flat|nested] 16+ messages in thread
* Re: [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle 2013-08-13 18:35 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Trond Myklebust 2013-08-13 18:35 ` [PATCH 03/10] NFSv4: Add tracepoints for debugging file open Trond Myklebust @ 2013-08-13 19:52 ` Adamson, Dros 2013-08-13 21:01 ` Myklebust, Trond 1 sibling, 1 reply; 16+ messages in thread From: Adamson, Dros @ 2013-08-13 19:52 UTC (permalink / raw) To: Myklebust, Trond; +Cc: <linux-nfs@vger.kernel.org> I think I was the last one to touch this. On Aug 13, 2013, at 2:35 PM, Trond Myklebust <Trond.Myklebust@netapp.com> wrote: > We want to be able to display the crc32 hash of the filehandle in > tracepoints. > > Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> > --- > fs/nfs/inode.c | 3 +-- > fs/nfs/internal.h | 20 ++++++++++++++++++++ > 2 files changed, 21 insertions(+), 2 deletions(-) > > diff --git a/fs/nfs/inode.c b/fs/nfs/inode.c > index af6e806..9a98b04 100644 > --- a/fs/nfs/inode.c > +++ b/fs/nfs/inode.c > @@ -38,7 +38,6 @@ > #include <linux/slab.h> > #include <linux/compat.h> > #include <linux/freezer.h> > -#include <linux/crc32.h> > > #include <asm/uaccess.h> > > @@ -1190,7 +1189,7 @@ u32 _nfs_display_fhandle_hash(const struct nfs_fh *fh) > { > /* wireshark uses 32-bit AUTODIN crc and does a bitwise > * not on the result */ > - return ~crc32(0xFFFFFFFF, &fh->data[0], fh->size); > + return nfs_fhandle_hash(fh); > } > > /* > diff --git a/fs/nfs/internal.h b/fs/nfs/internal.h > index 9b694f1..50f7068 100644 > --- a/fs/nfs/internal.h > +++ b/fs/nfs/internal.h > @@ -5,6 +5,7 @@ > #include "nfs4_fs.h" > #include <linux/mount.h> > #include <linux/security.h> > +#include <linux/crc32.h> > > #define NFS_MS_MASK (MS_RDONLY|MS_NOSUID|MS_NODEV|MS_NOEXEC|MS_SYNCHRONOUS) > > @@ -574,3 +575,22 @@ u64 nfs_timespec_to_change_attr(const struct timespec *ts) > { > return ((u64)ts->tv_sec << 30) + ts->tv_nsec; > } > + > +#ifdef CONFIG_CRC32 Good catch! > +/** > + * nfs_fhandle_hash - calculate the crc32 hash for the filehandle > + * @fh - pointer to filehandle > + * > + * returns a crc32 hash for the filehandle that is compatible with > + * the one displayed by "wireshark". > + */ > +static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh) > +{ > + return ~crc32_le(0xFFFFFFFF, &fh->data[0], fh->size); Why the change to crc32_le? Is that what wireshark does? I don't remember exactly what I found when I looked at how wireshark made FH hashes. -dros > +} > +#else > +static inline u32 nfs_fhandle_hash(const struct nfs_fh *fh) > +{ > + return 0; > +} > +#endif > -- > 1.8.3.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle 2013-08-13 19:52 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Adamson, Dros @ 2013-08-13 21:01 ` Myklebust, Trond 0 siblings, 0 replies; 16+ messages in thread From: Myklebust, Trond @ 2013-08-13 21:01 UTC (permalink / raw) To: Adamson, Dros; +Cc: <linux-nfs@vger.kernel.org> T24gVHVlLCAyMDEzLTA4LTEzIGF0IDE5OjUyICswMDAwLCBBZGFtc29uLCBEcm9zIHdyb3RlOg0K PiBJIHRoaW5rIEkgd2FzIHRoZSBsYXN0IG9uZSB0byB0b3VjaCB0aGlzLg0KPiANCj4gT24gQXVn IDEzLCAyMDEzLCBhdCAyOjM1IFBNLCBUcm9uZCBNeWtsZWJ1c3QgPFRyb25kLk15a2xlYnVzdEBu ZXRhcHAuY29tPiB3cm90ZToNCj4gDQo+ID4gV2Ugd2FudCB0byBiZSBhYmxlIHRvIGRpc3BsYXkg dGhlIGNyYzMyIGhhc2ggb2YgdGhlIGZpbGVoYW5kbGUgaW4NCj4gPiB0cmFjZXBvaW50cy4NCj4g PiANCj4gPiBTaWduZWQtb2ZmLWJ5OiBUcm9uZCBNeWtsZWJ1c3QgPFRyb25kLk15a2xlYnVzdEBu ZXRhcHAuY29tPg0KPiA+IC0tLQ0KPiA+IGZzL25mcy9pbm9kZS5jICAgIHwgIDMgKy0tDQo+ID4g ZnMvbmZzL2ludGVybmFsLmggfCAyMCArKysrKysrKysrKysrKysrKysrKw0KPiA+IDIgZmlsZXMg Y2hhbmdlZCwgMjEgaW5zZXJ0aW9ucygrKSwgMiBkZWxldGlvbnMoLSkNCj4gPiANCj4gPiBkaWZm IC0tZ2l0IGEvZnMvbmZzL2lub2RlLmMgYi9mcy9uZnMvaW5vZGUuYw0KPiA+IGluZGV4IGFmNmU4 MDYuLjlhOThiMDQgMTAwNjQ0DQo+ID4gLS0tIGEvZnMvbmZzL2lub2RlLmMNCj4gPiArKysgYi9m cy9uZnMvaW5vZGUuYw0KPiA+IEBAIC0zOCw3ICszOCw2IEBADQo+ID4gI2luY2x1ZGUgPGxpbnV4 L3NsYWIuaD4NCj4gPiAjaW5jbHVkZSA8bGludXgvY29tcGF0Lmg+DQo+ID4gI2luY2x1ZGUgPGxp bnV4L2ZyZWV6ZXIuaD4NCj4gPiAtI2luY2x1ZGUgPGxpbnV4L2NyYzMyLmg+DQo+ID4gDQo+ID4g I2luY2x1ZGUgPGFzbS91YWNjZXNzLmg+DQo+ID4gDQo+ID4gQEAgLTExOTAsNyArMTE4OSw3IEBA IHUzMiBfbmZzX2Rpc3BsYXlfZmhhbmRsZV9oYXNoKGNvbnN0IHN0cnVjdCBuZnNfZmggKmZoKQ0K PiA+IHsNCj4gPiAJLyogd2lyZXNoYXJrIHVzZXMgMzItYml0IEFVVE9ESU4gY3JjIGFuZCBkb2Vz IGEgYml0d2lzZQ0KPiA+IAkgKiBub3Qgb24gdGhlIHJlc3VsdCAqLw0KPiA+IC0JcmV0dXJuIH5j cmMzMigweEZGRkZGRkZGLCAmZmgtPmRhdGFbMF0sIGZoLT5zaXplKTsNCj4gPiArCXJldHVybiBu ZnNfZmhhbmRsZV9oYXNoKGZoKTsNCj4gPiB9DQo+ID4gDQo+ID4gLyoNCj4gPiBkaWZmIC0tZ2l0 IGEvZnMvbmZzL2ludGVybmFsLmggYi9mcy9uZnMvaW50ZXJuYWwuaA0KPiA+IGluZGV4IDliNjk0 ZjEuLjUwZjcwNjggMTAwNjQ0DQo+ID4gLS0tIGEvZnMvbmZzL2ludGVybmFsLmgNCj4gPiArKysg Yi9mcy9uZnMvaW50ZXJuYWwuaA0KPiA+IEBAIC01LDYgKzUsNyBAQA0KPiA+ICNpbmNsdWRlICJu ZnM0X2ZzLmgiDQo+ID4gI2luY2x1ZGUgPGxpbnV4L21vdW50Lmg+DQo+ID4gI2luY2x1ZGUgPGxp bnV4L3NlY3VyaXR5Lmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9jcmMzMi5oPg0KPiA+IA0KPiA+ ICNkZWZpbmUgTkZTX01TX01BU0sgKE1TX1JET05MWXxNU19OT1NVSUR8TVNfTk9ERVZ8TVNfTk9F WEVDfE1TX1NZTkNIUk9OT1VTKQ0KPiA+IA0KPiA+IEBAIC01NzQsMyArNTc1LDIyIEBAIHU2NCBu ZnNfdGltZXNwZWNfdG9fY2hhbmdlX2F0dHIoY29uc3Qgc3RydWN0IHRpbWVzcGVjICp0cykNCj4g PiB7DQo+ID4gCXJldHVybiAoKHU2NCl0cy0+dHZfc2VjIDw8IDMwKSArIHRzLT50dl9uc2VjOw0K PiA+IH0NCj4gPiArDQo+ID4gKyNpZmRlZiBDT05GSUdfQ1JDMzINCj4gDQo+IEdvb2QgY2F0Y2gh DQo+IA0KPiA+ICsvKioNCj4gPiArICogbmZzX2ZoYW5kbGVfaGFzaCAtIGNhbGN1bGF0ZSB0aGUg Y3JjMzIgaGFzaCBmb3IgdGhlIGZpbGVoYW5kbGUNCj4gPiArICogQGZoIC0gcG9pbnRlciB0byBm aWxlaGFuZGxlDQo+ID4gKyAqDQo+ID4gKyAqIHJldHVybnMgYSBjcmMzMiBoYXNoIGZvciB0aGUg ZmlsZWhhbmRsZSB0aGF0IGlzIGNvbXBhdGlibGUgd2l0aA0KPiA+ICsgKiB0aGUgb25lIGRpc3Bs YXllZCBieSAid2lyZXNoYXJrIi4NCj4gPiArICovDQo+ID4gK3N0YXRpYyBpbmxpbmUgdTMyIG5m c19maGFuZGxlX2hhc2goY29uc3Qgc3RydWN0IG5mc19maCAqZmgpDQo+ID4gK3sNCj4gPiArCXJl dHVybiB+Y3JjMzJfbGUoMHhGRkZGRkZGRiwgJmZoLT5kYXRhWzBdLCBmaC0+c2l6ZSk7DQo+IA0K PiBXaHkgdGhlIGNoYW5nZSB0byBjcmMzMl9sZT8gSXMgdGhhdCB3aGF0IHdpcmVzaGFyayBkb2Vz PyBJIGRvbid0IHJlbWVtYmVyIGV4YWN0bHkgd2hhdCBJIGZvdW5kIHdoZW4gSSBsb29rZWQgYXQg aG93IHdpcmVzaGFyayBtYWRlIEZIIGhhc2hlcy4NCj4gDQo+IC1kcm9zDQoNCklmIHlvdSBsb29r IGluc2lkZSBpbmNsdWRlL2xpbnV4L2NyYzMyLmgsIHlvdSdsbCBzZWUgdGhhdCBjcmMzMiBpcyBq dXN0DQphIG1hY3JvIHRoYXQgZXhwYW5kcyB0byBhIGNhbGwgdG8gdGhlIGZ1bmN0aW9uIGNyYzMy X2xlKCkuIFNvIGFsbCBJJ3ZlDQpkb25lIGlzIHRvIGV4cGFuZCB0aGUgbWFjcm8uDQoNCkNoZWVy cw0KICBUcm9uZA0KDQotLSANClRyb25kIE15a2xlYnVzdA0KTGludXggTkZTIGNsaWVudCBtYWlu dGFpbmVyDQoNCk5ldEFwcA0KVHJvbmQuTXlrbGVidXN0QG5ldGFwcC5jb20NCnd3dy5uZXRhcHAu Y29tDQo= ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems 2013-08-13 18:35 [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems Trond Myklebust 2013-08-13 18:35 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Trond Myklebust @ 2013-08-13 20:57 ` Myklebust, Trond 2013-08-14 15:31 ` J. Bruce Fields 2 siblings, 0 replies; 16+ messages in thread From: Myklebust, Trond @ 2013-08-13 20:57 UTC (permalink / raw) To: linux-nfs@vger.kernel.org T24gVHVlLCAyMDEzLTA4LTEzIGF0IDE0OjM1IC0wNDAwLCBUcm9uZCBNeWtsZWJ1c3Qgd3JvdGU6 DQo+IFNldCB1cCBiYXNpYyB0cmFjZXBvaW50cyBmb3IgZGVidWdnaW5nIGNsaWVudCBpZCBjcmVh dGlvbi9kZXN0cnVjdGlvbg0KPiBhbmQgc2Vzc2lvbiBjcmVhdGlvbi9kZXN0cnVjdGlvbi4NCj4g DQo+IFNpZ25lZC1vZmYtYnk6IFRyb25kIE15a2xlYnVzdCA8VHJvbmQuTXlrbGVidXN0QG5ldGFw cC5jb20+DQo+IC0tLQ0KPiAgZnMvbmZzL01ha2VmaWxlICAgIHwgICAzICstDQo+ICBmcy9uZnMv bmZzNHByb2MuYyAgfCAgIDkgKysrDQo+ICBmcy9uZnMvbmZzNHRyYWNlLmMgfCAgMTAgKysrDQo+ ICBmcy9uZnMvbmZzNHRyYWNlLmggfCAyMDUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKysNCj4gIDQgZmlsZXMgY2hhbmdlZCwgMjI2IGluc2VydGlv bnMoKyksIDEgZGVsZXRpb24oLSkNCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcy9uZnMvbmZzNHRy YWNlLmMNCj4gIGNyZWF0ZSBtb2RlIDEwMDY0NCBmcy9uZnMvbmZzNHRyYWNlLmgNCj4gDQo+IGRp ZmYgLS1naXQgYS9mcy9uZnMvTWFrZWZpbGUgYi9mcy9uZnMvTWFrZWZpbGUNCj4gaW5kZXggZTBi YjA0OC4uNzFiYTRjMiAxMDA2NDQNCj4gLS0tIGEvZnMvbmZzL01ha2VmaWxlDQo+ICsrKyBiL2Zz L25mcy9NYWtlZmlsZQ0KPiBAQCAtMjEsNyArMjEsOCBAQCBuZnN2My0kKENPTkZJR19ORlNfVjNf QUNMKSArPSBuZnMzYWNsLm8NCj4gIG9iai0kKENPTkZJR19ORlNfVjQpICs9IG5mc3Y0Lm8NCj4g IG5mc3Y0LXkgOj0gbmZzNHByb2MubyBuZnM0eGRyLm8gbmZzNHN0YXRlLm8gbmZzNHJlbmV3ZC5v IG5mczRzdXBlci5vIG5mczRmaWxlLm8gXA0KPiAgCSAgZGVsZWdhdGlvbi5vIGlkbWFwLm8gY2Fs bGJhY2subyBjYWxsYmFja194ZHIubyBjYWxsYmFja19wcm9jLm8gXA0KPiAtCSAgbmZzNG5hbWVz cGFjZS5vIG5mczRnZXRyb290Lm8gbmZzNGNsaWVudC5vIGRuc19yZXNvbHZlLm8NCj4gKwkgIG5m czRuYW1lc3BhY2UubyBuZnM0Z2V0cm9vdC5vIG5mczRjbGllbnQubyBkbnNfcmVzb2x2ZS5vIFwN Cj4gKwkgIG5mczR0cmFjZS5jDQoNCkRvaCEgVGhlIGFib3ZlIHNob3VsZCBvZiBjb3Vyc2UgYmUg bmZzNHRyYWNlLm8uLi4NCi0tIA0KVHJvbmQgTXlrbGVidXN0DQpMaW51eCBORlMgY2xpZW50IG1h aW50YWluZXINCg0KTmV0QXBwDQpUcm9uZC5NeWtsZWJ1c3RAbmV0YXBwLmNvbQ0Kd3d3Lm5ldGFw cC5jb20NCg== ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems 2013-08-13 18:35 [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems Trond Myklebust 2013-08-13 18:35 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Trond Myklebust 2013-08-13 20:57 ` [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems Myklebust, Trond @ 2013-08-14 15:31 ` J. Bruce Fields 2013-08-14 15:57 ` Myklebust, Trond 2 siblings, 1 reply; 16+ messages in thread From: J. Bruce Fields @ 2013-08-14 15:31 UTC (permalink / raw) To: Trond Myklebust; +Cc: linux-nfs On Tue, Aug 13, 2013 at 02:35:43PM -0400, Trond Myklebust wrote: > Set up basic tracepoints for debugging client id creation/destruction > and session creation/destruction. Looks good to me. Dumb questions, just out of curiosity: - Some of these are followed by dprintk's with similar information. Is it worth keeping those, or could they be phased out at some point? - Some of them are paired with an rpc_call_sync. What do these get you that wouldn't get out of wireshark with a suitable filter? --b. > > Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> > --- > fs/nfs/Makefile | 3 +- > fs/nfs/nfs4proc.c | 9 +++ > fs/nfs/nfs4trace.c | 10 +++ > fs/nfs/nfs4trace.h | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++ > 4 files changed, 226 insertions(+), 1 deletion(-) > create mode 100644 fs/nfs/nfs4trace.c > create mode 100644 fs/nfs/nfs4trace.h > > diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile > index e0bb048..71ba4c2 100644 > --- a/fs/nfs/Makefile > +++ b/fs/nfs/Makefile > @@ -21,7 +21,8 @@ nfsv3-$(CONFIG_NFS_V3_ACL) += nfs3acl.o > obj-$(CONFIG_NFS_V4) += nfsv4.o > nfsv4-y := nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o nfs4super.o nfs4file.o \ > delegation.o idmap.o callback.o callback_xdr.o callback_proc.o \ > - nfs4namespace.o nfs4getroot.o nfs4client.o dns_resolve.o > + nfs4namespace.o nfs4getroot.o nfs4client.o dns_resolve.o \ > + nfs4trace.c > nfsv4-$(CONFIG_NFS_USE_LEGACY_DNS) += cache_lib.o > nfsv4-$(CONFIG_SYSCTL) += nfs4sysctl.o > nfsv4-$(CONFIG_NFS_V4_1) += nfs4session.o pnfs.o pnfs_dev.o > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c > index a187f4d..3a55f24 100644 > --- a/fs/nfs/nfs4proc.c > +++ b/fs/nfs/nfs4proc.c > @@ -66,6 +66,8 @@ > #include "nfs4session.h" > #include "fscache.h" > > +#include "nfs4trace.h" > + > #define NFSDBG_FACILITY NFSDBG_PROC > > #define NFS4_POLL_RETRY_MIN (HZ/10) > @@ -4730,6 +4732,7 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, > clp->cl_rpcclient->cl_auth->au_ops->au_name, > setclientid.sc_name_len, setclientid.sc_name); > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); > + trace_nfs4_setclientid(clp, status); > dprintk("NFS reply setclientid: %d\n", status); > return status; > } > @@ -4757,6 +4760,7 @@ int nfs4_proc_setclientid_confirm(struct nfs_client *clp, > clp->cl_rpcclient->cl_auth->au_ops->au_name, > clp->cl_clientid); > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); > + trace_nfs4_setclientid_confirm(clp, status); > dprintk("NFS reply setclientid_confirm: %d\n", status); > return status; > } > @@ -5887,6 +5891,7 @@ int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred > } > > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); > + trace_nfs4_bind_conn_to_session(clp, status); > if (status == 0) { > if (memcmp(res.session->sess_id.data, > clp->cl_session->sess_id.data, NFS4_MAX_SESSIONID_LEN)) { > @@ -5972,6 +5977,7 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred) > } > > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); > + trace_nfs4_exchange_id(clp, status); > if (status == 0) > status = nfs4_check_cl_exchange_flags(res.flags); > > @@ -6032,6 +6038,7 @@ static int _nfs4_proc_destroy_clientid(struct nfs_client *clp, > int status; > > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); > + trace_nfs4_destroy_clientid(clp, status); > if (status) > dprintk("NFS: Got error %d from the server %s on " > "DESTROY_CLIENTID.", status, clp->cl_hostname); > @@ -6295,6 +6302,7 @@ static int _nfs4_proc_create_session(struct nfs_client *clp, > args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN); > > status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); > + trace_nfs4_create_session(clp, status); > > if (!status) { > /* Verify the session's negotiated channel_attrs values */ > @@ -6358,6 +6366,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session, > return status; > > status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); > + trace_nfs4_destroy_session(session->clp, status); > > if (status) > dprintk("NFS: Got error %d from the server on DESTROY_SESSION. " > diff --git a/fs/nfs/nfs4trace.c b/fs/nfs/nfs4trace.c > new file mode 100644 > index 0000000..3f02183 > --- /dev/null > +++ b/fs/nfs/nfs4trace.c > @@ -0,0 +1,10 @@ > +/* > + * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com> > + */ > +#include <linux/nfs_fs.h> > +#include "nfs4_fs.h" > +#include "internal.h" > + > +#define CREATE_TRACE_POINTS > +#include "nfs4trace.h" > + > diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h > new file mode 100644 > index 0000000..451954f > --- /dev/null > +++ b/fs/nfs/nfs4trace.h > @@ -0,0 +1,205 @@ > +#undef TRACE_SYSTEM > +#define TRACE_SYSTEM nfs4 > + > +#if !defined(_TRACE_NFS4_H) || defined(TRACE_HEADER_MULTI_READ) > +#define _TRACE_NFS4_H > + > +#include <linux/tracepoint.h> > + > +#define show_nfsv4_errors(error) __print_symbolic(error, \ > + { NFS4_OK, "OK" }, \ > + /* Mapped by nfs4_stat_to_errno() */ \ > + { -EPERM, "EPERM" }, \ > + { -ENOENT, "ENOENT" }, \ > + { -EIO, "EIO" }, \ > + { -ENXIO, "ENXIO" }, \ > + { -EACCES, "EACCES" }, \ > + { -EEXIST, "EEXIST" }, \ > + { -EXDEV, "EXDEV" }, \ > + { -ENOTDIR, "ENOTDIR" }, \ > + { -EISDIR, "EISDIR" }, \ > + { -EFBIG, "EFBIG" }, \ > + { -ENOSPC, "ENOSPC" }, \ > + { -EROFS, "EROFS" }, \ > + { -EMLINK, "EMLINK" }, \ > + { -ENAMETOOLONG, "ENAMETOOLONG" }, \ > + { -ENOTEMPTY, "ENOTEMPTY" }, \ > + { -EDQUOT, "EDQUOT" }, \ > + { -ESTALE, "ESTALE" }, \ > + { -EBADHANDLE, "EBADHANDLE" }, \ > + { -EBADCOOKIE, "EBADCOOKIE" }, \ > + { -ENOTSUPP, "ENOTSUPP" }, \ > + { -ETOOSMALL, "ETOOSMALL" }, \ > + { -EREMOTEIO, "EREMOTEIO" }, \ > + { -EBADTYPE, "EBADTYPE" }, \ > + { -EAGAIN, "EAGAIN" }, \ > + { -ELOOP, "ELOOP" }, \ > + { -EOPNOTSUPP, "EOPNOTSUPP" }, \ > + { -EDEADLK, "EDEADLK" }, \ > + /* RPC errors */ \ > + { -ENOMEM, "ENOMEM" }, \ > + { -EKEYEXPIRED, "EKEYEXPIRED" }, \ > + { -ETIMEDOUT, "ETIMEDOUT" }, \ > + { -ERESTARTSYS, "ERESTARTSYS" }, \ > + { -ECONNREFUSED, "ECONNREFUSED" }, \ > + { -ECONNRESET, "ECONNRESET" }, \ > + { -ENETUNREACH, "ENETUNREACH" }, \ > + { -EHOSTUNREACH, "EHOSTUNREACH" }, \ > + { -EHOSTDOWN, "EHOSTDOWN" }, \ > + { -EPIPE, "EPIPE" }, \ > + { -EPFNOSUPPORT, "EPFNOSUPPORT" }, \ > + { -EPROTONOSUPPORT, "EPROTONOSUPPORT" }, \ > + /* NFSv4 native errors */ \ > + { -NFS4ERR_ACCESS, "ACCESS" }, \ > + { -NFS4ERR_ATTRNOTSUPP, "ATTRNOTSUPP" }, \ > + { -NFS4ERR_ADMIN_REVOKED, "ADMIN_REVOKED" }, \ > + { -NFS4ERR_BACK_CHAN_BUSY, "BACK_CHAN_BUSY" }, \ > + { -NFS4ERR_BADCHAR, "BADCHAR" }, \ > + { -NFS4ERR_BADHANDLE, "BADHANDLE" }, \ > + { -NFS4ERR_BADIOMODE, "BADIOMODE" }, \ > + { -NFS4ERR_BADLAYOUT, "BADLAYOUT" }, \ > + { -NFS4ERR_BADNAME, "BADNAME" }, \ > + { -NFS4ERR_BADOWNER, "BADOWNER" }, \ > + { -NFS4ERR_BADSESSION, "BADSESSION" }, \ > + { -NFS4ERR_BADSLOT, "BADSLOT" }, \ > + { -NFS4ERR_BADTYPE, "BADTYPE" }, \ > + { -NFS4ERR_BADXDR, "BADXDR" }, \ > + { -NFS4ERR_BAD_COOKIE, "BAD_COOKIE" }, \ > + { -NFS4ERR_BAD_HIGH_SLOT, "BAD_HIGH_SLOT" }, \ > + { -NFS4ERR_BAD_RANGE, "BAD_RANGE" }, \ > + { -NFS4ERR_BAD_SEQID, "BAD_SEQID" }, \ > + { -NFS4ERR_BAD_SESSION_DIGEST, "BAD_SESSION_DIGEST" }, \ > + { -NFS4ERR_BAD_STATEID, "BAD_STATEID" }, \ > + { -NFS4ERR_CB_PATH_DOWN, "CB_PATH_DOWN" }, \ > + { -NFS4ERR_CLID_INUSE, "CLID_INUSE" }, \ > + { -NFS4ERR_CLIENTID_BUSY, "CLIENTID_BUSY" }, \ > + { -NFS4ERR_COMPLETE_ALREADY, "COMPLETE_ALREADY" }, \ > + { -NFS4ERR_CONN_NOT_BOUND_TO_SESSION, \ > + "CONN_NOT_BOUND_TO_SESSION" }, \ > + { -NFS4ERR_DEADLOCK, "DEADLOCK" }, \ > + { -NFS4ERR_DEADSESSION, "DEAD_SESSION" }, \ > + { -NFS4ERR_DELAY, "DELAY" }, \ > + { -NFS4ERR_DELEG_ALREADY_WANTED, \ > + "DELEG_ALREADY_WANTED" }, \ > + { -NFS4ERR_DELEG_REVOKED, "DELEG_REVOKED" }, \ > + { -NFS4ERR_DENIED, "DENIED" }, \ > + { -NFS4ERR_DIRDELEG_UNAVAIL, "DIRDELEG_UNAVAIL" }, \ > + { -NFS4ERR_DQUOT, "DQUOT" }, \ > + { -NFS4ERR_ENCR_ALG_UNSUPP, "ENCR_ALG_UNSUPP" }, \ > + { -NFS4ERR_EXIST, "EXIST" }, \ > + { -NFS4ERR_EXPIRED, "EXPIRED" }, \ > + { -NFS4ERR_FBIG, "FBIG" }, \ > + { -NFS4ERR_FHEXPIRED, "FHEXPIRED" }, \ > + { -NFS4ERR_FILE_OPEN, "FILE_OPEN" }, \ > + { -NFS4ERR_GRACE, "GRACE" }, \ > + { -NFS4ERR_HASH_ALG_UNSUPP, "HASH_ALG_UNSUPP" }, \ > + { -NFS4ERR_INVAL, "INVAL" }, \ > + { -NFS4ERR_IO, "IO" }, \ > + { -NFS4ERR_ISDIR, "ISDIR" }, \ > + { -NFS4ERR_LAYOUTTRYLATER, "LAYOUTTRYLATER" }, \ > + { -NFS4ERR_LAYOUTUNAVAILABLE, "LAYOUTUNAVAILABLE" }, \ > + { -NFS4ERR_LEASE_MOVED, "LEASE_MOVED" }, \ > + { -NFS4ERR_LOCKED, "LOCKED" }, \ > + { -NFS4ERR_LOCKS_HELD, "LOCKS_HELD" }, \ > + { -NFS4ERR_LOCK_RANGE, "LOCK_RANGE" }, \ > + { -NFS4ERR_MINOR_VERS_MISMATCH, "MINOR_VERS_MISMATCH" }, \ > + { -NFS4ERR_MLINK, "MLINK" }, \ > + { -NFS4ERR_MOVED, "MOVED" }, \ > + { -NFS4ERR_NAMETOOLONG, "NAMETOOLONG" }, \ > + { -NFS4ERR_NOENT, "NOENT" }, \ > + { -NFS4ERR_NOFILEHANDLE, "NOFILEHANDLE" }, \ > + { -NFS4ERR_NOMATCHING_LAYOUT, "NOMATCHING_LAYOUT" }, \ > + { -NFS4ERR_NOSPC, "NOSPC" }, \ > + { -NFS4ERR_NOTDIR, "NOTDIR" }, \ > + { -NFS4ERR_NOTEMPTY, "NOTEMPTY" }, \ > + { -NFS4ERR_NOTSUPP, "NOTSUPP" }, \ > + { -NFS4ERR_NOT_ONLY_OP, "NOT_ONLY_OP" }, \ > + { -NFS4ERR_NOT_SAME, "NOT_SAME" }, \ > + { -NFS4ERR_NO_GRACE, "NO_GRACE" }, \ > + { -NFS4ERR_NXIO, "NXIO" }, \ > + { -NFS4ERR_OLD_STATEID, "OLD_STATEID" }, \ > + { -NFS4ERR_OPENMODE, "OPENMODE" }, \ > + { -NFS4ERR_OP_ILLEGAL, "OP_ILLEGAL" }, \ > + { -NFS4ERR_OP_NOT_IN_SESSION, "OP_NOT_IN_SESSION" }, \ > + { -NFS4ERR_PERM, "PERM" }, \ > + { -NFS4ERR_PNFS_IO_HOLE, "PNFS_IO_HOLE" }, \ > + { -NFS4ERR_PNFS_NO_LAYOUT, "PNFS_NO_LAYOUT" }, \ > + { -NFS4ERR_RECALLCONFLICT, "RECALLCONFLICT" }, \ > + { -NFS4ERR_RECLAIM_BAD, "RECLAIM_BAD" }, \ > + { -NFS4ERR_RECLAIM_CONFLICT, "RECLAIM_CONFLICT" }, \ > + { -NFS4ERR_REJECT_DELEG, "REJECT_DELEG" }, \ > + { -NFS4ERR_REP_TOO_BIG, "REP_TOO_BIG" }, \ > + { -NFS4ERR_REP_TOO_BIG_TO_CACHE, \ > + "REP_TOO_BIG_TO_CACHE" }, \ > + { -NFS4ERR_REQ_TOO_BIG, "REQ_TOO_BIG" }, \ > + { -NFS4ERR_RESTOREFH, "RESTOREFH" }, \ > + { -NFS4ERR_RETRY_UNCACHED_REP, "RETRY_UNCACHED_REP" }, \ > + { -NFS4ERR_RETURNCONFLICT, "RETURNCONFLICT" }, \ > + { -NFS4ERR_ROFS, "ROFS" }, \ > + { -NFS4ERR_SAME, "SAME" }, \ > + { -NFS4ERR_SHARE_DENIED, "SHARE_DENIED" }, \ > + { -NFS4ERR_SEQUENCE_POS, "SEQUENCE_POS" }, \ > + { -NFS4ERR_SEQ_FALSE_RETRY, "SEQ_FALSE_RETRY" }, \ > + { -NFS4ERR_SEQ_MISORDERED, "SEQ_MISORDERED" }, \ > + { -NFS4ERR_SERVERFAULT, "SERVERFAULT" }, \ > + { -NFS4ERR_STALE, "STALE" }, \ > + { -NFS4ERR_STALE_CLIENTID, "STALE_CLIENTID" }, \ > + { -NFS4ERR_STALE_STATEID, "STALE_STATEID" }, \ > + { -NFS4ERR_SYMLINK, "SYMLINK" }, \ > + { -NFS4ERR_TOOSMALL, "TOOSMALL" }, \ > + { -NFS4ERR_TOO_MANY_OPS, "TOO_MANY_OPS" }, \ > + { -NFS4ERR_UNKNOWN_LAYOUTTYPE, "UNKNOWN_LAYOUTTYPE" }, \ > + { -NFS4ERR_UNSAFE_COMPOUND, "UNSAFE_COMPOUND" }, \ > + { -NFS4ERR_WRONGSEC, "WRONGSEC" }, \ > + { -NFS4ERR_WRONG_CRED, "WRONG_CRED" }, \ > + { -NFS4ERR_WRONG_TYPE, "WRONG_TYPE" }, \ > + { -NFS4ERR_XDEV, "XDEV" }) > + > +DECLARE_EVENT_CLASS(nfs4_clientid_event, > + TP_PROTO(const struct nfs_client *clp, > + int error), > + > + TP_ARGS(clp, error), > + > + TP_STRUCT__entry( > + __string(dstaddr, > + rpc_peeraddr2str(clp->cl_rpcclient, > + RPC_DISPLAY_ADDR)) > + __field(int, error) > + ), > + > + TP_fast_assign( > + __entry->error = error; > + __assign_str(dstaddr, > + rpc_peeraddr2str(clp->cl_rpcclient, > + RPC_DISPLAY_ADDR)); > + ), > + > + TP_printk("error=%d (%s), dstaddr=%s", > + __entry->error, > + show_nfsv4_errors(__entry->error), > + __get_str(dstaddr) > + ) > +); > +#define DEFINE_NFS4_CLIENTID_EVENT(name) \ > +DEFINE_EVENT(nfs4_clientid_event, name, \ > + TP_PROTO(const struct nfs_client *clp, \ > + int error), \ > + TP_ARGS(clp, error)) > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_setclientid); > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_setclientid_confirm); > +#ifdef CONFIG_NFS_V4_1 > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_exchange_id); > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_create_session); > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_destroy_session); > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_destroy_clientid); > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_bind_conn_to_session); > +#endif /* CONFIG_NFS_V4_1 */ > + > +#endif /* _TRACE_NFS4_H */ > + > +#undef TRACE_INCLUDE_PATH > +#define TRACE_INCLUDE_PATH . > +#define TRACE_INCLUDE_FILE nfs4trace > +/* This part must be outside protection */ > +#include <trace/define_trace.h> > -- > 1.8.3.1 > > -- > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in > the body of a message to majordomo@vger.kernel.org > More majordomo info at http://vger.kernel.org/majordomo-info.html ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems 2013-08-14 15:31 ` J. Bruce Fields @ 2013-08-14 15:57 ` Myklebust, Trond 2013-08-20 13:58 ` Andy Adamson 0 siblings, 1 reply; 16+ messages in thread From: Myklebust, Trond @ 2013-08-14 15:57 UTC (permalink / raw) To: J. Bruce Fields; +Cc: linux-nfs@vger.kernel.org T24gV2VkLCAyMDEzLTA4LTE0IGF0IDExOjMxIC0wNDAwLCBKLiBCcnVjZSBGaWVsZHMgd3JvdGU6 DQo+IE9uIFR1ZSwgQXVnIDEzLCAyMDEzIGF0IDAyOjM1OjQzUE0gLTA0MDAsIFRyb25kIE15a2xl YnVzdCB3cm90ZToNCj4gPiBTZXQgdXAgYmFzaWMgdHJhY2Vwb2ludHMgZm9yIGRlYnVnZ2luZyBj bGllbnQgaWQgY3JlYXRpb24vZGVzdHJ1Y3Rpb24NCj4gPiBhbmQgc2Vzc2lvbiBjcmVhdGlvbi9k ZXN0cnVjdGlvbi4NCj4gDQo+IExvb2tzIGdvb2QgdG8gbWUuIER1bWIgcXVlc3Rpb25zLCBqdXN0 IG91dCBvZiBjdXJpb3NpdHk6DQo+IA0KPiAJLSBTb21lIG9mIHRoZXNlIGFyZSBmb2xsb3dlZCBi eSBkcHJpbnRrJ3Mgd2l0aCBzaW1pbGFyDQo+IAkgIGluZm9ybWF0aW9uLiAgSXMgaXQgd29ydGgg a2VlcGluZyB0aG9zZSwgb3IgY291bGQgdGhleSBiZQ0KPiAJICBwaGFzZWQgb3V0IGF0IHNvbWUg cG9pbnQ/DQoNCkknZCBsaWtlIHRvIHBoYXNlIG91dCB0aGUgZHByaW50a3Mgb3ZlciB0aW1lLg0K DQo+IAktIFNvbWUgb2YgdGhlbSBhcmUgcGFpcmVkIHdpdGggYW4gcnBjX2NhbGxfc3luYy4gIFdo YXQgZG8gdGhlc2UNCj4gCSAgZ2V0IHlvdSB0aGF0IHdvdWxkbid0IGdldCBvdXQgb2Ygd2lyZXNo YXJrIHdpdGggYSBzdWl0YWJsZQ0KPiAJICBmaWx0ZXI/DQoNClRoZSB0cmFjZXBvaW50cyBnaXZl IHlvdSB0aGUgYWJpbGl0eSB0byBkbyBtb3JlIHNvcGhpc3RpY2F0ZWQgZHluYW1pYw0KdHJhY2lu ZyB1c2luZyBzeXN0ZW10YXAgb3IgbHR0bmcuDQoNClRoZSByaW5nYnVmZmVyIHVzZWQgYnkgZnRy YWNlIG1lYW5zIHRoYXQgdGhlIG92ZXJoZWFkIGlzIHJlbGF0aXZlbHkNCnNtYWxsOiB5b3UncmUg bm90IHNwYW1taW5nIHRoZSBzeXNsb2cgYWxsIHRoZSB0aW1lLiBGdXJ0aGVybW9yZSwgZnRyYWNl DQpkb2VzIHN1cHBvcnQgc29tZSBzaW1wbGUgZmlsdGVycy4gSSdtIHRoZXJlZm9yZSB0aGlua2lu ZyB0aGF0IHNvbWUNCnN5c2FkbWlucyBtaWdodCB3YW50IHRvIGNvbnNpZGVyIGVuYWJsaW5nIHNv bWUgb2YgdGhlc2UgdHJhY2Vwb2ludHMNCnBlcm1hbmVudGx5IG9uIHRoZWlyIHN5c3RlbXMgaW4g b3JkZXIgdG8gYmUgYWJsZSB0byBwb3N0LW1vcnRlbSBzdGF0ZQ0KcmVjb3ZlcnkgaXNzdWVzIGZv bGxvd2luZyBuZXR3b3JraW5nIG91dGFnZXMgYW5kL29yIHNlcnZlciByZWJvb3RzLg0KDQpDaGVl cnMNCiAgVHJvbmQNCg0KPiAtLWIuDQo+IA0KPiA+IA0KPiA+IFNpZ25lZC1vZmYtYnk6IFRyb25k IE15a2xlYnVzdCA8VHJvbmQuTXlrbGVidXN0QG5ldGFwcC5jb20+DQo+ID4gLS0tDQo+ID4gIGZz L25mcy9NYWtlZmlsZSAgICB8ICAgMyArLQ0KPiA+ICBmcy9uZnMvbmZzNHByb2MuYyAgfCAgIDkg KysrDQo+ID4gIGZzL25mcy9uZnM0dHJhY2UuYyB8ICAxMCArKysNCj4gPiAgZnMvbmZzL25mczR0 cmFjZS5oIHwgMjA1ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrDQo+ID4gIDQgZmlsZXMgY2hhbmdlZCwgMjI2IGluc2VydGlvbnMoKyksIDEgZGVs ZXRpb24oLSkNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGZzL25mcy9uZnM0dHJhY2UuYw0KPiA+ ICBjcmVhdGUgbW9kZSAxMDA2NDQgZnMvbmZzL25mczR0cmFjZS5oDQo+ID4gDQo+ID4gZGlmZiAt LWdpdCBhL2ZzL25mcy9NYWtlZmlsZSBiL2ZzL25mcy9NYWtlZmlsZQ0KPiA+IGluZGV4IGUwYmIw NDguLjcxYmE0YzIgMTAwNjQ0DQo+ID4gLS0tIGEvZnMvbmZzL01ha2VmaWxlDQo+ID4gKysrIGIv ZnMvbmZzL01ha2VmaWxlDQo+ID4gQEAgLTIxLDcgKzIxLDggQEAgbmZzdjMtJChDT05GSUdfTkZT X1YzX0FDTCkgKz0gbmZzM2FjbC5vDQo+ID4gIG9iai0kKENPTkZJR19ORlNfVjQpICs9IG5mc3Y0 Lm8NCj4gPiAgbmZzdjQteSA6PSBuZnM0cHJvYy5vIG5mczR4ZHIubyBuZnM0c3RhdGUubyBuZnM0 cmVuZXdkLm8gbmZzNHN1cGVyLm8gbmZzNGZpbGUubyBcDQo+ID4gIAkgIGRlbGVnYXRpb24ubyBp ZG1hcC5vIGNhbGxiYWNrLm8gY2FsbGJhY2tfeGRyLm8gY2FsbGJhY2tfcHJvYy5vIFwNCj4gPiAt CSAgbmZzNG5hbWVzcGFjZS5vIG5mczRnZXRyb290Lm8gbmZzNGNsaWVudC5vIGRuc19yZXNvbHZl Lm8NCj4gPiArCSAgbmZzNG5hbWVzcGFjZS5vIG5mczRnZXRyb290Lm8gbmZzNGNsaWVudC5vIGRu c19yZXNvbHZlLm8gXA0KPiA+ICsJICBuZnM0dHJhY2UuYw0KPiA+ICBuZnN2NC0kKENPTkZJR19O RlNfVVNFX0xFR0FDWV9ETlMpICs9IGNhY2hlX2xpYi5vDQo+ID4gIG5mc3Y0LSQoQ09ORklHX1NZ U0NUTCkJKz0gbmZzNHN5c2N0bC5vDQo+ID4gIG5mc3Y0LSQoQ09ORklHX05GU19WNF8xKQkrPSBu ZnM0c2Vzc2lvbi5vIHBuZnMubyBwbmZzX2Rldi5vDQo+ID4gZGlmZiAtLWdpdCBhL2ZzL25mcy9u ZnM0cHJvYy5jIGIvZnMvbmZzL25mczRwcm9jLmMNCj4gPiBpbmRleCBhMTg3ZjRkLi4zYTU1ZjI0 IDEwMDY0NA0KPiA+IC0tLSBhL2ZzL25mcy9uZnM0cHJvYy5jDQo+ID4gKysrIGIvZnMvbmZzL25m czRwcm9jLmMNCj4gPiBAQCAtNjYsNiArNjYsOCBAQA0KPiA+ICAjaW5jbHVkZSAibmZzNHNlc3Np b24uaCINCj4gPiAgI2luY2x1ZGUgImZzY2FjaGUuaCINCj4gPiAgDQo+ID4gKyNpbmNsdWRlICJu ZnM0dHJhY2UuaCINCj4gPiArDQo+ID4gICNkZWZpbmUgTkZTREJHX0ZBQ0lMSVRZCQlORlNEQkdf UFJPQw0KPiA+ICANCj4gPiAgI2RlZmluZSBORlM0X1BPTExfUkVUUllfTUlOCShIWi8xMCkNCj4g PiBAQCAtNDczMCw2ICs0NzMyLDcgQEAgaW50IG5mczRfcHJvY19zZXRjbGllbnRpZChzdHJ1Y3Qg bmZzX2NsaWVudCAqY2xwLCB1MzIgcHJvZ3JhbSwNCj4gPiAgCQljbHAtPmNsX3JwY2NsaWVudC0+ Y2xfYXV0aC0+YXVfb3BzLT5hdV9uYW1lLA0KPiA+ICAJCXNldGNsaWVudGlkLnNjX25hbWVfbGVu LCBzZXRjbGllbnRpZC5zY19uYW1lKTsNCj4gPiAgCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoY2xw LT5jbF9ycGNjbGllbnQsICZtc2csIFJQQ19UQVNLX1RJTUVPVVQpOw0KPiA+ICsJdHJhY2VfbmZz NF9zZXRjbGllbnRpZChjbHAsIHN0YXR1cyk7DQo+ID4gIAlkcHJpbnRrKCJORlMgcmVwbHkgc2V0 Y2xpZW50aWQ6ICVkXG4iLCBzdGF0dXMpOw0KPiA+ICAJcmV0dXJuIHN0YXR1czsNCj4gPiAgfQ0K PiA+IEBAIC00NzU3LDYgKzQ3NjAsNyBAQCBpbnQgbmZzNF9wcm9jX3NldGNsaWVudGlkX2NvbmZp cm0oc3RydWN0IG5mc19jbGllbnQgKmNscCwNCj4gPiAgCQljbHAtPmNsX3JwY2NsaWVudC0+Y2xf YXV0aC0+YXVfb3BzLT5hdV9uYW1lLA0KPiA+ICAJCWNscC0+Y2xfY2xpZW50aWQpOw0KPiA+ICAJ c3RhdHVzID0gcnBjX2NhbGxfc3luYyhjbHAtPmNsX3JwY2NsaWVudCwgJm1zZywgUlBDX1RBU0tf VElNRU9VVCk7DQo+ID4gKwl0cmFjZV9uZnM0X3NldGNsaWVudGlkX2NvbmZpcm0oY2xwLCBzdGF0 dXMpOw0KPiA+ICAJZHByaW50aygiTkZTIHJlcGx5IHNldGNsaWVudGlkX2NvbmZpcm06ICVkXG4i LCBzdGF0dXMpOw0KPiA+ICAJcmV0dXJuIHN0YXR1czsNCj4gPiAgfQ0KPiA+IEBAIC01ODg3LDYg KzU4OTEsNyBAQCBpbnQgbmZzNF9wcm9jX2JpbmRfY29ubl90b19zZXNzaW9uKHN0cnVjdCBuZnNf Y2xpZW50ICpjbHAsIHN0cnVjdCBycGNfY3JlZCAqY3JlZA0KPiA+ICAJfQ0KPiA+ICANCj4gPiAg CXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoY2xwLT5jbF9ycGNjbGllbnQsICZtc2csIFJQQ19UQVNL X1RJTUVPVVQpOw0KPiA+ICsJdHJhY2VfbmZzNF9iaW5kX2Nvbm5fdG9fc2Vzc2lvbihjbHAsIHN0 YXR1cyk7DQo+ID4gIAlpZiAoc3RhdHVzID09IDApIHsNCj4gPiAgCQlpZiAobWVtY21wKHJlcy5z ZXNzaW9uLT5zZXNzX2lkLmRhdGEsDQo+ID4gIAkJICAgIGNscC0+Y2xfc2Vzc2lvbi0+c2Vzc19p ZC5kYXRhLCBORlM0X01BWF9TRVNTSU9OSURfTEVOKSkgew0KPiA+IEBAIC01OTcyLDYgKzU5Nzcs NyBAQCBpbnQgbmZzNF9wcm9jX2V4Y2hhbmdlX2lkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsIHN0 cnVjdCBycGNfY3JlZCAqY3JlZCkNCj4gPiAgCX0NCj4gPiAgDQo+ID4gIAlzdGF0dXMgPSBycGNf Y2FsbF9zeW5jKGNscC0+Y2xfcnBjY2xpZW50LCAmbXNnLCBSUENfVEFTS19USU1FT1VUKTsNCj4g PiArCXRyYWNlX25mczRfZXhjaGFuZ2VfaWQoY2xwLCBzdGF0dXMpOw0KPiA+ICAJaWYgKHN0YXR1 cyA9PSAwKQ0KPiA+ICAJCXN0YXR1cyA9IG5mczRfY2hlY2tfY2xfZXhjaGFuZ2VfZmxhZ3MocmVz LmZsYWdzKTsNCj4gPiAgDQo+ID4gQEAgLTYwMzIsNiArNjAzOCw3IEBAIHN0YXRpYyBpbnQgX25m czRfcHJvY19kZXN0cm95X2NsaWVudGlkKHN0cnVjdCBuZnNfY2xpZW50ICpjbHAsDQo+ID4gIAlp bnQgc3RhdHVzOw0KPiA+ICANCj4gPiAgCXN0YXR1cyA9IHJwY19jYWxsX3N5bmMoY2xwLT5jbF9y cGNjbGllbnQsICZtc2csIFJQQ19UQVNLX1RJTUVPVVQpOw0KPiA+ICsJdHJhY2VfbmZzNF9kZXN0 cm95X2NsaWVudGlkKGNscCwgc3RhdHVzKTsNCj4gPiAgCWlmIChzdGF0dXMpDQo+ID4gIAkJZHBy aW50aygiTkZTOiBHb3QgZXJyb3IgJWQgZnJvbSB0aGUgc2VydmVyICVzIG9uICINCj4gPiAgCQkJ IkRFU1RST1lfQ0xJRU5USUQuIiwgc3RhdHVzLCBjbHAtPmNsX2hvc3RuYW1lKTsNCj4gPiBAQCAt NjI5NSw2ICs2MzAyLDcgQEAgc3RhdGljIGludCBfbmZzNF9wcm9jX2NyZWF0ZV9zZXNzaW9uKHN0 cnVjdCBuZnNfY2xpZW50ICpjbHAsDQo+ID4gIAlhcmdzLmZsYWdzID0gKFNFU1NJT040X1BFUlNJ U1QgfCBTRVNTSU9ONF9CQUNLX0NIQU4pOw0KPiA+ICANCj4gPiAgCXN0YXR1cyA9IHJwY19jYWxs X3N5bmMoc2Vzc2lvbi0+Y2xwLT5jbF9ycGNjbGllbnQsICZtc2csIFJQQ19UQVNLX1RJTUVPVVQp Ow0KPiA+ICsJdHJhY2VfbmZzNF9jcmVhdGVfc2Vzc2lvbihjbHAsIHN0YXR1cyk7DQo+ID4gIA0K PiA+ICAJaWYgKCFzdGF0dXMpIHsNCj4gPiAgCQkvKiBWZXJpZnkgdGhlIHNlc3Npb24ncyBuZWdv dGlhdGVkIGNoYW5uZWxfYXR0cnMgdmFsdWVzICovDQo+ID4gQEAgLTYzNTgsNiArNjM2Niw3IEBA IGludCBuZnM0X3Byb2NfZGVzdHJveV9zZXNzaW9uKHN0cnVjdCBuZnM0X3Nlc3Npb24gKnNlc3Np b24sDQo+ID4gIAkJcmV0dXJuIHN0YXR1czsNCj4gPiAgDQo+ID4gIAlzdGF0dXMgPSBycGNfY2Fs bF9zeW5jKHNlc3Npb24tPmNscC0+Y2xfcnBjY2xpZW50LCAmbXNnLCBSUENfVEFTS19USU1FT1VU KTsNCj4gPiArCXRyYWNlX25mczRfZGVzdHJveV9zZXNzaW9uKHNlc3Npb24tPmNscCwgc3RhdHVz KTsNCj4gPiAgDQo+ID4gIAlpZiAoc3RhdHVzKQ0KPiA+ICAJCWRwcmludGsoIk5GUzogR290IGVy cm9yICVkIGZyb20gdGhlIHNlcnZlciBvbiBERVNUUk9ZX1NFU1NJT04uICINCj4gPiBkaWZmIC0t Z2l0IGEvZnMvbmZzL25mczR0cmFjZS5jIGIvZnMvbmZzL25mczR0cmFjZS5jDQo+ID4gbmV3IGZp bGUgbW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi4zZjAyMTgzDQo+ID4gLS0tIC9kZXYv bnVsbA0KPiA+ICsrKyBiL2ZzL25mcy9uZnM0dHJhY2UuYw0KPiA+IEBAIC0wLDAgKzEsMTAgQEAN Cj4gPiArLyoNCj4gPiArICogQ29weXJpZ2h0IChjKSAyMDEzIFRyb25kIE15a2xlYnVzdCA8VHJv bmQuTXlrbGVidXN0QG5ldGFwcC5jb20+DQo+ID4gKyAqLw0KPiA+ICsjaW5jbHVkZSA8bGludXgv bmZzX2ZzLmg+DQo+ID4gKyNpbmNsdWRlICJuZnM0X2ZzLmgiDQo+ID4gKyNpbmNsdWRlICJpbnRl cm5hbC5oIg0KPiA+ICsNCj4gPiArI2RlZmluZSBDUkVBVEVfVFJBQ0VfUE9JTlRTDQo+ID4gKyNp bmNsdWRlICJuZnM0dHJhY2UuaCINCj4gPiArDQo+ID4gZGlmZiAtLWdpdCBhL2ZzL25mcy9uZnM0 dHJhY2UuaCBiL2ZzL25mcy9uZnM0dHJhY2UuaA0KPiA+IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ ID4gaW5kZXggMDAwMDAwMC4uNDUxOTU0Zg0KPiA+IC0tLSAvZGV2L251bGwNCj4gPiArKysgYi9m cy9uZnMvbmZzNHRyYWNlLmgNCj4gPiBAQCAtMCwwICsxLDIwNSBAQA0KPiA+ICsjdW5kZWYgVFJB Q0VfU1lTVEVNDQo+ID4gKyNkZWZpbmUgVFJBQ0VfU1lTVEVNIG5mczQNCj4gPiArDQo+ID4gKyNp ZiAhZGVmaW5lZChfVFJBQ0VfTkZTNF9IKSB8fCBkZWZpbmVkKFRSQUNFX0hFQURFUl9NVUxUSV9S RUFEKQ0KPiA+ICsjZGVmaW5lIF9UUkFDRV9ORlM0X0gNCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxs aW51eC90cmFjZXBvaW50Lmg+DQo+ID4gKw0KPiA+ICsjZGVmaW5lIHNob3dfbmZzdjRfZXJyb3Jz KGVycm9yKSBfX3ByaW50X3N5bWJvbGljKGVycm9yLAkJXA0KPiA+ICsJCXsgTkZTNF9PSywJCQki T0siIH0sCQkJXA0KPiA+ICsJCS8qIE1hcHBlZCBieSBuZnM0X3N0YXRfdG9fZXJybm8oKSAqLwkJ CVwNCj4gPiArCQl7IC1FUEVSTSwJCQkiRVBFUk0iIH0sCQlcDQo+ID4gKwkJeyAtRU5PRU5ULAkJ CSJFTk9FTlQiIH0sCQlcDQo+ID4gKwkJeyAtRUlPLAkJCQkiRUlPIiB9LAkJXA0KPiA+ICsJCXsg LUVOWElPLAkJCSJFTlhJTyIgfSwJCVwNCj4gPiArCQl7IC1FQUNDRVMsCQkJIkVBQ0NFUyIgfSwJ CVwNCj4gPiArCQl7IC1FRVhJU1QsCQkJIkVFWElTVCIgfSwJCVwNCj4gPiArCQl7IC1FWERFViwJ CQkiRVhERVYiIH0sCQlcDQo+ID4gKwkJeyAtRU5PVERJUiwJCQkiRU5PVERJUiIgfSwJCVwNCj4g PiArCQl7IC1FSVNESVIsCQkJIkVJU0RJUiIgfSwJCVwNCj4gPiArCQl7IC1FRkJJRywJCQkiRUZC SUciIH0sCQlcDQo+ID4gKwkJeyAtRU5PU1BDLAkJCSJFTk9TUEMiIH0sCQlcDQo+ID4gKwkJeyAt RVJPRlMsCQkJIkVST0ZTIiB9LAkJXA0KPiA+ICsJCXsgLUVNTElOSywJCQkiRU1MSU5LIiB9LAkJ XA0KPiA+ICsJCXsgLUVOQU1FVE9PTE9ORywJCSJFTkFNRVRPT0xPTkciIH0sCVwNCj4gPiArCQl7 IC1FTk9URU1QVFksCQkJIkVOT1RFTVBUWSIgfSwJCVwNCj4gPiArCQl7IC1FRFFVT1QsCQkJIkVE UVVPVCIgfSwJCVwNCj4gPiArCQl7IC1FU1RBTEUsCQkJIkVTVEFMRSIgfSwJCVwNCj4gPiArCQl7 IC1FQkFESEFORExFLAkJCSJFQkFESEFORExFIiB9LAkJXA0KPiA+ICsJCXsgLUVCQURDT09LSUUs CQkJIkVCQURDT09LSUUiIH0sCQlcDQo+ID4gKwkJeyAtRU5PVFNVUFAsCQkJIkVOT1RTVVBQIiB9 LAkJXA0KPiA+ICsJCXsgLUVUT09TTUFMTCwJCQkiRVRPT1NNQUxMIiB9LAkJXA0KPiA+ICsJCXsg LUVSRU1PVEVJTywJCQkiRVJFTU9URUlPIiB9LAkJXA0KPiA+ICsJCXsgLUVCQURUWVBFLAkJCSJF QkFEVFlQRSIgfSwJCVwNCj4gPiArCQl7IC1FQUdBSU4sCQkJIkVBR0FJTiIgfSwJCVwNCj4gPiAr CQl7IC1FTE9PUCwJCQkiRUxPT1AiIH0sCQlcDQo+ID4gKwkJeyAtRU9QTk9UU1VQUCwJCQkiRU9Q Tk9UU1VQUCIgfSwJCVwNCj4gPiArCQl7IC1FREVBRExLLAkJCSJFREVBRExLIiB9LAkJXA0KPiA+ ICsJCS8qIFJQQyBlcnJvcnMgKi8JCQkJCVwNCj4gPiArCQl7IC1FTk9NRU0sCQkJIkVOT01FTSIg fSwJCVwNCj4gPiArCQl7IC1FS0VZRVhQSVJFRCwJCQkiRUtFWUVYUElSRUQiIH0sCVwNCj4gPiAr CQl7IC1FVElNRURPVVQsCQkJIkVUSU1FRE9VVCIgfSwJCVwNCj4gPiArCQl7IC1FUkVTVEFSVFNZ UywJCQkiRVJFU1RBUlRTWVMiIH0sCVwNCj4gPiArCQl7IC1FQ09OTlJFRlVTRUQsCQkiRUNPTk5S RUZVU0VEIiB9LAlcDQo+ID4gKwkJeyAtRUNPTk5SRVNFVCwJCQkiRUNPTk5SRVNFVCIgfSwJCVwN Cj4gPiArCQl7IC1FTkVUVU5SRUFDSCwJCQkiRU5FVFVOUkVBQ0giIH0sCVwNCj4gPiArCQl7IC1F SE9TVFVOUkVBQ0gsCQkiRUhPU1RVTlJFQUNIIiB9LAlcDQo+ID4gKwkJeyAtRUhPU1RET1dOLAkJ CSJFSE9TVERPV04iIH0sCQlcDQo+ID4gKwkJeyAtRVBJUEUsCQkJIkVQSVBFIiB9LAkJXA0KPiA+ ICsJCXsgLUVQRk5PU1VQUE9SVCwJCSJFUEZOT1NVUFBPUlQiIH0sCVwNCj4gPiArCQl7IC1FUFJP VE9OT1NVUFBPUlQsCQkiRVBST1RPTk9TVVBQT1JUIiB9LAlcDQo+ID4gKwkJLyogTkZTdjQgbmF0 aXZlIGVycm9ycyAqLwkJCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9BQ0NFU1MsCQkiQUNDRVNTIiB9 LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfQVRUUk5PVFNVUFAsCQkiQVRUUk5PVFNVUFAiIH0sCVwN Cj4gPiArCQl7IC1ORlM0RVJSX0FETUlOX1JFVk9LRUQsCSJBRE1JTl9SRVZPS0VEIiB9LAlcDQo+ ID4gKwkJeyAtTkZTNEVSUl9CQUNLX0NIQU5fQlVTWSwJIkJBQ0tfQ0hBTl9CVVNZIiB9LAlcDQo+ ID4gKwkJeyAtTkZTNEVSUl9CQURDSEFSLAkJIkJBRENIQVIiIH0sCQlcDQo+ID4gKwkJeyAtTkZT NEVSUl9CQURIQU5ETEUsCQkiQkFESEFORExFIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfQkFE SU9NT0RFLAkJIkJBRElPTU9ERSIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0JBRExBWU9VVCwJ CSJCQURMQVlPVVQiIH0sCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9CQUROQU1FLAkJIkJBRE5BTUUi IH0sCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9CQURPV05FUiwJCSJCQURPV05FUiIgfSwJCVwNCj4g PiArCQl7IC1ORlM0RVJSX0JBRFNFU1NJT04sCQkiQkFEU0VTU0lPTiIgfSwJCVwNCj4gPiArCQl7 IC1ORlM0RVJSX0JBRFNMT1QsCQkiQkFEU0xPVCIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0JB RFRZUEUsCQkiQkFEVFlQRSIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0JBRFhEUiwJCSJCQURY RFIiIH0sCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9CQURfQ09PS0lFLAkJIkJBRF9DT09LSUUiIH0s CQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9CQURfSElHSF9TTE9ULAkiQkFEX0hJR0hfU0xPVCIgfSwJ XA0KPiA+ICsJCXsgLU5GUzRFUlJfQkFEX1JBTkdFLAkJIkJBRF9SQU5HRSIgfSwJCVwNCj4gPiAr CQl7IC1ORlM0RVJSX0JBRF9TRVFJRCwJCSJCQURfU0VRSUQiIH0sCQlcDQo+ID4gKwkJeyAtTkZT NEVSUl9CQURfU0VTU0lPTl9ESUdFU1QsCSJCQURfU0VTU0lPTl9ESUdFU1QiIH0sCVwNCj4gPiAr CQl7IC1ORlM0RVJSX0JBRF9TVEFURUlELAkJIkJBRF9TVEFURUlEIiB9LAlcDQo+ID4gKwkJeyAt TkZTNEVSUl9DQl9QQVRIX0RPV04sCSJDQl9QQVRIX0RPV04iIH0sCVwNCj4gPiArCQl7IC1ORlM0 RVJSX0NMSURfSU5VU0UsCQkiQ0xJRF9JTlVTRSIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0NM SUVOVElEX0JVU1ksCSJDTElFTlRJRF9CVVNZIiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9DT01Q TEVURV9BTFJFQURZLAkiQ09NUExFVEVfQUxSRUFEWSIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJf Q09OTl9OT1RfQk9VTkRfVE9fU0VTU0lPTiwJCQlcDQo+ID4gKwkJCQkJCSJDT05OX05PVF9CT1VO RF9UT19TRVNTSU9OIiB9LCBcDQo+ID4gKwkJeyAtTkZTNEVSUl9ERUFETE9DSywJCSJERUFETE9D SyIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0RFQURTRVNTSU9OLAkJIkRFQURfU0VTU0lPTiIg fSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfREVMQVksCQkiREVMQVkiIH0sCQlcDQo+ID4gKwkJeyAt TkZTNEVSUl9ERUxFR19BTFJFQURZX1dBTlRFRCwJCQlcDQo+ID4gKwkJCQkJCSJERUxFR19BTFJF QURZX1dBTlRFRCIgfSwgXA0KPiA+ICsJCXsgLU5GUzRFUlJfREVMRUdfUkVWT0tFRCwJIkRFTEVH X1JFVk9LRUQiIH0sCVwNCj4gPiArCQl7IC1ORlM0RVJSX0RFTklFRCwJCSJERU5JRUQiIH0sCQlc DQo+ID4gKwkJeyAtTkZTNEVSUl9ESVJERUxFR19VTkFWQUlMLAkiRElSREVMRUdfVU5BVkFJTCIg fSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfRFFVT1QsCQkiRFFVT1QiIH0sCQlcDQo+ID4gKwkJeyAt TkZTNEVSUl9FTkNSX0FMR19VTlNVUFAsCSJFTkNSX0FMR19VTlNVUFAiIH0sCVwNCj4gPiArCQl7 IC1ORlM0RVJSX0VYSVNULAkJIkVYSVNUIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfRVhQSVJF RCwJCSJFWFBJUkVEIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfRkJJRywJCSJGQklHIiB9LAkJ XA0KPiA+ICsJCXsgLU5GUzRFUlJfRkhFWFBJUkVELAkJIkZIRVhQSVJFRCIgfSwJCVwNCj4gPiAr CQl7IC1ORlM0RVJSX0ZJTEVfT1BFTiwJCSJGSUxFX09QRU4iIH0sCQlcDQo+ID4gKwkJeyAtTkZT NEVSUl9HUkFDRSwJCSJHUkFDRSIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0hBU0hfQUxHX1VO U1VQUCwJIkhBU0hfQUxHX1VOU1VQUCIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfSU5WQUwsCQki SU5WQUwiIH0sCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9JTywJCQkiSU8iIH0sCQkJXA0KPiA+ICsJ CXsgLU5GUzRFUlJfSVNESVIsCQkiSVNESVIiIH0sCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9MQVlP VVRUUllMQVRFUiwJIkxBWU9VVFRSWUxBVEVSIiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9MQVlP VVRVTkFWQUlMQUJMRSwJIkxBWU9VVFVOQVZBSUxBQkxFIiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVS Ul9MRUFTRV9NT1ZFRCwJCSJMRUFTRV9NT1ZFRCIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfTE9D S0VELAkJIkxPQ0tFRCIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0xPQ0tTX0hFTEQsCQkiTE9D S1NfSEVMRCIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX0xPQ0tfUkFOR0UsCQkiTE9DS19SQU5H RSIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX01JTk9SX1ZFUlNfTUlTTUFUQ0gsCSJNSU5PUl9W RVJTX01JU01BVENIIiB9LCBcDQo+ID4gKwkJeyAtTkZTNEVSUl9NTElOSywJCSJNTElOSyIgfSwJ CVwNCj4gPiArCQl7IC1ORlM0RVJSX01PVkVELAkJIk1PVkVEIiB9LAkJXA0KPiA+ICsJCXsgLU5G UzRFUlJfTkFNRVRPT0xPTkcsCQkiTkFNRVRPT0xPTkciIH0sCVwNCj4gPiArCQl7IC1ORlM0RVJS X05PRU5ULAkJIk5PRU5UIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfTk9GSUxFSEFORExFLAki Tk9GSUxFSEFORExFIiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9OT01BVENISU5HX0xBWU9VVCwJ Ik5PTUFUQ0hJTkdfTEFZT1VUIiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9OT1NQQywJCSJOT1NQ QyIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX05PVERJUiwJCSJOT1RESVIiIH0sCQlcDQo+ID4g KwkJeyAtTkZTNEVSUl9OT1RFTVBUWSwJCSJOT1RFTVBUWSIgfSwJCVwNCj4gPiArCQl7IC1ORlM0 RVJSX05PVFNVUFAsCQkiTk9UU1VQUCIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX05PVF9PTkxZ X09QLAkJIk5PVF9PTkxZX09QIiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9OT1RfU0FNRSwJCSJO T1RfU0FNRSIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX05PX0dSQUNFLAkJIk5PX0dSQUNFIiB9 LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfTlhJTywJCSJOWElPIiB9LAkJXA0KPiA+ICsJCXsgLU5G UzRFUlJfT0xEX1NUQVRFSUQsCQkiT0xEX1NUQVRFSUQiIH0sCVwNCj4gPiArCQl7IC1ORlM0RVJS X09QRU5NT0RFLAkJIk9QRU5NT0RFIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfT1BfSUxMRUdB TCwJCSJPUF9JTExFR0FMIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfT1BfTk9UX0lOX1NFU1NJ T04sCSJPUF9OT1RfSU5fU0VTU0lPTiIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfUEVSTSwJCSJQ RVJNIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfUE5GU19JT19IT0xFLAkiUE5GU19JT19IT0xF IiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9QTkZTX05PX0xBWU9VVCwJIlBORlNfTk9fTEFZT1VU IiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9SRUNBTExDT05GTElDVCwJIlJFQ0FMTENPTkZMSUNU IiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9SRUNMQUlNX0JBRCwJCSJSRUNMQUlNX0JBRCIgfSwJ XA0KPiA+ICsJCXsgLU5GUzRFUlJfUkVDTEFJTV9DT05GTElDVCwJIlJFQ0xBSU1fQ09ORkxJQ1Qi IH0sCVwNCj4gPiArCQl7IC1ORlM0RVJSX1JFSkVDVF9ERUxFRywJIlJFSkVDVF9ERUxFRyIgfSwJ XA0KPiA+ICsJCXsgLU5GUzRFUlJfUkVQX1RPT19CSUcsCQkiUkVQX1RPT19CSUciIH0sCVwNCj4g PiArCQl7IC1ORlM0RVJSX1JFUF9UT09fQklHX1RPX0NBQ0hFLAkJCVwNCj4gPiArCQkJCQkJIlJF UF9UT09fQklHX1RPX0NBQ0hFIiB9LCBcDQo+ID4gKwkJeyAtTkZTNEVSUl9SRVFfVE9PX0JJRywJ CSJSRVFfVE9PX0JJRyIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfUkVTVE9SRUZILAkJIlJFU1RP UkVGSCIgfSwJCVwNCj4gPiArCQl7IC1ORlM0RVJSX1JFVFJZX1VOQ0FDSEVEX1JFUCwJIlJFVFJZ X1VOQ0FDSEVEX1JFUCIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfUkVUVVJOQ09ORkxJQ1QsCSJS RVRVUk5DT05GTElDVCIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfUk9GUywJCSJST0ZTIiB9LAkJ XA0KPiA+ICsJCXsgLU5GUzRFUlJfU0FNRSwJCSJTQU1FIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRF UlJfU0hBUkVfREVOSUVELAkiU0hBUkVfREVOSUVEIiB9LAlcDQo+ID4gKwkJeyAtTkZTNEVSUl9T RVFVRU5DRV9QT1MsCSJTRVFVRU5DRV9QT1MiIH0sCVwNCj4gPiArCQl7IC1ORlM0RVJSX1NFUV9G QUxTRV9SRVRSWSwJIlNFUV9GQUxTRV9SRVRSWSIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfU0VR X01JU09SREVSRUQsCSJTRVFfTUlTT1JERVJFRCIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfU0VS VkVSRkFVTFQsCQkiU0VSVkVSRkFVTFQiIH0sCVwNCj4gPiArCQl7IC1ORlM0RVJSX1NUQUxFLAkJ IlNUQUxFIiB9LAkJXA0KPiA+ICsJCXsgLU5GUzRFUlJfU1RBTEVfQ0xJRU5USUQsCSJTVEFMRV9D TElFTlRJRCIgfSwJXA0KPiA+ICsJCXsgLU5GUzRFUlJfU1RBTEVfU1RBVEVJRCwJIlNUQUxFX1NU QVRFSUQiIH0sCVwNCj4gPiArCQl7IC1ORlM0RVJSX1NZTUxJTkssCQkiU1lNTElOSyIgfSwJCVwN Cj4gPiArCQl7IC1ORlM0RVJSX1RPT1NNQUxMLAkJIlRPT1NNQUxMIiB9LAkJXA0KPiA+ICsJCXsg LU5GUzRFUlJfVE9PX01BTllfT1BTLAkiVE9PX01BTllfT1BTIiB9LAlcDQo+ID4gKwkJeyAtTkZT NEVSUl9VTktOT1dOX0xBWU9VVFRZUEUsCSJVTktOT1dOX0xBWU9VVFRZUEUiIH0sCVwNCj4gPiAr CQl7IC1ORlM0RVJSX1VOU0FGRV9DT01QT1VORCwJIlVOU0FGRV9DT01QT1VORCIgfSwJXA0KPiA+ ICsJCXsgLU5GUzRFUlJfV1JPTkdTRUMsCQkiV1JPTkdTRUMiIH0sCQlcDQo+ID4gKwkJeyAtTkZT NEVSUl9XUk9OR19DUkVELAkJIldST05HX0NSRUQiIH0sCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9X Uk9OR19UWVBFLAkJIldST05HX1RZUEUiIH0sCQlcDQo+ID4gKwkJeyAtTkZTNEVSUl9YREVWLAkJ IlhERVYiIH0pDQo+ID4gKw0KPiA+ICtERUNMQVJFX0VWRU5UX0NMQVNTKG5mczRfY2xpZW50aWRf ZXZlbnQsDQo+ID4gKwkJVFBfUFJPVE8oY29uc3Qgc3RydWN0IG5mc19jbGllbnQgKmNscCwNCj4g PiArCQkJaW50IGVycm9yKSwNCj4gPiArDQo+ID4gKwkJVFBfQVJHUyhjbHAsIGVycm9yKSwNCj4g PiArDQo+ID4gKwkJVFBfU1RSVUNUX19lbnRyeSgNCj4gPiArCQkJX19zdHJpbmcoZHN0YWRkciwN Cj4gPiArCQkJCXJwY19wZWVyYWRkcjJzdHIoY2xwLT5jbF9ycGNjbGllbnQsDQo+ID4gKwkJCQkJ UlBDX0RJU1BMQVlfQUREUikpDQo+ID4gKwkJCV9fZmllbGQoaW50LCBlcnJvcikNCj4gPiArCQkp LA0KPiA+ICsNCj4gPiArCQlUUF9mYXN0X2Fzc2lnbigNCj4gPiArCQkJX19lbnRyeS0+ZXJyb3Ig PSBlcnJvcjsNCj4gPiArCQkJX19hc3NpZ25fc3RyKGRzdGFkZHIsDQo+ID4gKwkJCQlycGNfcGVl cmFkZHIyc3RyKGNscC0+Y2xfcnBjY2xpZW50LA0KPiA+ICsJCQkJCQlSUENfRElTUExBWV9BRERS KSk7DQo+ID4gKwkJKSwNCj4gPiArDQo+ID4gKwkJVFBfcHJpbnRrKCJlcnJvcj0lZCAoJXMpLCBk c3RhZGRyPSVzIiwNCj4gPiArCQkJX19lbnRyeS0+ZXJyb3IsDQo+ID4gKwkJCXNob3dfbmZzdjRf ZXJyb3JzKF9fZW50cnktPmVycm9yKSwNCj4gPiArCQkJX19nZXRfc3RyKGRzdGFkZHIpDQo+ID4g KwkJKQ0KPiA+ICspOw0KPiA+ICsjZGVmaW5lIERFRklORV9ORlM0X0NMSUVOVElEX0VWRU5UKG5h bWUpCQlcDQo+ID4gK0RFRklORV9FVkVOVChuZnM0X2NsaWVudGlkX2V2ZW50LCBuYW1lLAkJCVwN Cj4gPiArCQlUUF9QUk9UTyhjb25zdCBzdHJ1Y3QgbmZzX2NsaWVudCAqY2xwLAlcDQo+ID4gKwkJ CWludCBlcnJvciksCQkJXA0KPiA+ICsJCVRQX0FSR1MoY2xwLCBlcnJvcikpDQo+ID4gK0RFRklO RV9ORlM0X0NMSUVOVElEX0VWRU5UKG5mczRfc2V0Y2xpZW50aWQpOw0KPiA+ICtERUZJTkVfTkZT NF9DTElFTlRJRF9FVkVOVChuZnM0X3NldGNsaWVudGlkX2NvbmZpcm0pOw0KPiA+ICsjaWZkZWYg Q09ORklHX05GU19WNF8xDQo+ID4gK0RFRklORV9ORlM0X0NMSUVOVElEX0VWRU5UKG5mczRfZXhj aGFuZ2VfaWQpOw0KPiA+ICtERUZJTkVfTkZTNF9DTElFTlRJRF9FVkVOVChuZnM0X2NyZWF0ZV9z ZXNzaW9uKTsNCj4gPiArREVGSU5FX05GUzRfQ0xJRU5USURfRVZFTlQobmZzNF9kZXN0cm95X3Nl c3Npb24pOw0KPiA+ICtERUZJTkVfTkZTNF9DTElFTlRJRF9FVkVOVChuZnM0X2Rlc3Ryb3lfY2xp ZW50aWQpOw0KPiA+ICtERUZJTkVfTkZTNF9DTElFTlRJRF9FVkVOVChuZnM0X2JpbmRfY29ubl90 b19zZXNzaW9uKTsNCj4gPiArI2VuZGlmIC8qIENPTkZJR19ORlNfVjRfMSAqLw0KPiA+ICsNCj4g PiArI2VuZGlmIC8qIF9UUkFDRV9ORlM0X0ggKi8NCj4gPiArDQo+ID4gKyN1bmRlZiBUUkFDRV9J TkNMVURFX1BBVEgNCj4gPiArI2RlZmluZSBUUkFDRV9JTkNMVURFX1BBVEggLg0KPiA+ICsjZGVm aW5lIFRSQUNFX0lOQ0xVREVfRklMRSBuZnM0dHJhY2UNCj4gPiArLyogVGhpcyBwYXJ0IG11c3Qg YmUgb3V0c2lkZSBwcm90ZWN0aW9uICovDQo+ID4gKyNpbmNsdWRlIDx0cmFjZS9kZWZpbmVfdHJh Y2UuaD4NCj4gPiAtLSANCj4gPiAxLjguMy4xDQo+ID4gDQo+ID4gLS0NCj4gPiBUbyB1bnN1YnNj cmliZSBmcm9tIHRoaXMgbGlzdDogc2VuZCB0aGUgbGluZSAidW5zdWJzY3JpYmUgbGludXgtbmZz IiBpbg0KPiA+IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwu b3JnDQo+ID4gTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9t YWpvcmRvbW8taW5mby5odG1sDQo+IC0tDQo+IFRvIHVuc3Vic2NyaWJlIGZyb20gdGhpcyBsaXN0 OiBzZW5kIHRoZSBsaW5lICJ1bnN1YnNjcmliZSBsaW51eC1uZnMiIGluDQo+IHRoZSBib2R5IG9m IGEgbWVzc2FnZSB0byBtYWpvcmRvbW9Admdlci5rZXJuZWwub3JnDQo+IE1vcmUgbWFqb3Jkb21v IGluZm8gYXQgIGh0dHA6Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtbA0KDQot LSANClRyb25kIE15a2xlYnVzdA0KTGludXggTkZTIGNsaWVudCBtYWludGFpbmVyDQoNCk5ldEFw cA0KVHJvbmQuTXlrbGVidXN0QG5ldGFwcC5jb20NCnd3dy5uZXRhcHAuY29tDQo= ^ permalink raw reply [flat|nested] 16+ messages in thread
* Re: [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems 2013-08-14 15:57 ` Myklebust, Trond @ 2013-08-20 13:58 ` Andy Adamson 0 siblings, 0 replies; 16+ messages in thread From: Andy Adamson @ 2013-08-20 13:58 UTC (permalink / raw) To: Myklebust, Trond; +Cc: J. Bruce Fields, linux-nfs@vger.kernel.org Looks good to me as well. I like the division trace points and NFS operations. This should be very useful. I'm curious to see the performance hit. -->Andy On Wed, Aug 14, 2013 at 11:57 AM, Myklebust, Trond <Trond.Myklebust@netapp.com> wrote: > On Wed, 2013-08-14 at 11:31 -0400, J. Bruce Fields wrote: >> On Tue, Aug 13, 2013 at 02:35:43PM -0400, Trond Myklebust wrote: >> > Set up basic tracepoints for debugging client id creation/destruction >> > and session creation/destruction. >> >> Looks good to me. Dumb questions, just out of curiosity: >> >> - Some of these are followed by dprintk's with similar >> information. Is it worth keeping those, or could they be >> phased out at some point? > > I'd like to phase out the dprintks over time. > >> - Some of them are paired with an rpc_call_sync. What do these >> get you that wouldn't get out of wireshark with a suitable >> filter? > > The tracepoints give you the ability to do more sophisticated dynamic > tracing using systemtap or lttng. > > The ringbuffer used by ftrace means that the overhead is relatively > small: you're not spamming the syslog all the time. Furthermore, ftrace > does support some simple filters. I'm therefore thinking that some > sysadmins might want to consider enabling some of these tracepoints > permanently on their systems in order to be able to post-mortem state > recovery issues following networking outages and/or server reboots. > > Cheers > Trond > >> --b. >> >> > >> > Signed-off-by: Trond Myklebust <Trond.Myklebust@netapp.com> >> > --- >> > fs/nfs/Makefile | 3 +- >> > fs/nfs/nfs4proc.c | 9 +++ >> > fs/nfs/nfs4trace.c | 10 +++ >> > fs/nfs/nfs4trace.h | 205 +++++++++++++++++++++++++++++++++++++++++++++++++++++ >> > 4 files changed, 226 insertions(+), 1 deletion(-) >> > create mode 100644 fs/nfs/nfs4trace.c >> > create mode 100644 fs/nfs/nfs4trace.h >> > >> > diff --git a/fs/nfs/Makefile b/fs/nfs/Makefile >> > index e0bb048..71ba4c2 100644 >> > --- a/fs/nfs/Makefile >> > +++ b/fs/nfs/Makefile >> > @@ -21,7 +21,8 @@ nfsv3-$(CONFIG_NFS_V3_ACL) += nfs3acl.o >> > obj-$(CONFIG_NFS_V4) += nfsv4.o >> > nfsv4-y := nfs4proc.o nfs4xdr.o nfs4state.o nfs4renewd.o nfs4super.o nfs4file.o \ >> > delegation.o idmap.o callback.o callback_xdr.o callback_proc.o \ >> > - nfs4namespace.o nfs4getroot.o nfs4client.o dns_resolve.o >> > + nfs4namespace.o nfs4getroot.o nfs4client.o dns_resolve.o \ >> > + nfs4trace.c >> > nfsv4-$(CONFIG_NFS_USE_LEGACY_DNS) += cache_lib.o >> > nfsv4-$(CONFIG_SYSCTL) += nfs4sysctl.o >> > nfsv4-$(CONFIG_NFS_V4_1) += nfs4session.o pnfs.o pnfs_dev.o >> > diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c >> > index a187f4d..3a55f24 100644 >> > --- a/fs/nfs/nfs4proc.c >> > +++ b/fs/nfs/nfs4proc.c >> > @@ -66,6 +66,8 @@ >> > #include "nfs4session.h" >> > #include "fscache.h" >> > >> > +#include "nfs4trace.h" >> > + >> > #define NFSDBG_FACILITY NFSDBG_PROC >> > >> > #define NFS4_POLL_RETRY_MIN (HZ/10) >> > @@ -4730,6 +4732,7 @@ int nfs4_proc_setclientid(struct nfs_client *clp, u32 program, >> > clp->cl_rpcclient->cl_auth->au_ops->au_name, >> > setclientid.sc_name_len, setclientid.sc_name); >> > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); >> > + trace_nfs4_setclientid(clp, status); >> > dprintk("NFS reply setclientid: %d\n", status); >> > return status; >> > } >> > @@ -4757,6 +4760,7 @@ int nfs4_proc_setclientid_confirm(struct nfs_client *clp, >> > clp->cl_rpcclient->cl_auth->au_ops->au_name, >> > clp->cl_clientid); >> > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); >> > + trace_nfs4_setclientid_confirm(clp, status); >> > dprintk("NFS reply setclientid_confirm: %d\n", status); >> > return status; >> > } >> > @@ -5887,6 +5891,7 @@ int nfs4_proc_bind_conn_to_session(struct nfs_client *clp, struct rpc_cred *cred >> > } >> > >> > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); >> > + trace_nfs4_bind_conn_to_session(clp, status); >> > if (status == 0) { >> > if (memcmp(res.session->sess_id.data, >> > clp->cl_session->sess_id.data, NFS4_MAX_SESSIONID_LEN)) { >> > @@ -5972,6 +5977,7 @@ int nfs4_proc_exchange_id(struct nfs_client *clp, struct rpc_cred *cred) >> > } >> > >> > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); >> > + trace_nfs4_exchange_id(clp, status); >> > if (status == 0) >> > status = nfs4_check_cl_exchange_flags(res.flags); >> > >> > @@ -6032,6 +6038,7 @@ static int _nfs4_proc_destroy_clientid(struct nfs_client *clp, >> > int status; >> > >> > status = rpc_call_sync(clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); >> > + trace_nfs4_destroy_clientid(clp, status); >> > if (status) >> > dprintk("NFS: Got error %d from the server %s on " >> > "DESTROY_CLIENTID.", status, clp->cl_hostname); >> > @@ -6295,6 +6302,7 @@ static int _nfs4_proc_create_session(struct nfs_client *clp, >> > args.flags = (SESSION4_PERSIST | SESSION4_BACK_CHAN); >> > >> > status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); >> > + trace_nfs4_create_session(clp, status); >> > >> > if (!status) { >> > /* Verify the session's negotiated channel_attrs values */ >> > @@ -6358,6 +6366,7 @@ int nfs4_proc_destroy_session(struct nfs4_session *session, >> > return status; >> > >> > status = rpc_call_sync(session->clp->cl_rpcclient, &msg, RPC_TASK_TIMEOUT); >> > + trace_nfs4_destroy_session(session->clp, status); >> > >> > if (status) >> > dprintk("NFS: Got error %d from the server on DESTROY_SESSION. " >> > diff --git a/fs/nfs/nfs4trace.c b/fs/nfs/nfs4trace.c >> > new file mode 100644 >> > index 0000000..3f02183 >> > --- /dev/null >> > +++ b/fs/nfs/nfs4trace.c >> > @@ -0,0 +1,10 @@ >> > +/* >> > + * Copyright (c) 2013 Trond Myklebust <Trond.Myklebust@netapp.com> >> > + */ >> > +#include <linux/nfs_fs.h> >> > +#include "nfs4_fs.h" >> > +#include "internal.h" >> > + >> > +#define CREATE_TRACE_POINTS >> > +#include "nfs4trace.h" >> > + >> > diff --git a/fs/nfs/nfs4trace.h b/fs/nfs/nfs4trace.h >> > new file mode 100644 >> > index 0000000..451954f >> > --- /dev/null >> > +++ b/fs/nfs/nfs4trace.h >> > @@ -0,0 +1,205 @@ >> > +#undef TRACE_SYSTEM >> > +#define TRACE_SYSTEM nfs4 >> > + >> > +#if !defined(_TRACE_NFS4_H) || defined(TRACE_HEADER_MULTI_READ) >> > +#define _TRACE_NFS4_H >> > + >> > +#include <linux/tracepoint.h> >> > + >> > +#define show_nfsv4_errors(error) __print_symbolic(error, \ >> > + { NFS4_OK, "OK" }, \ >> > + /* Mapped by nfs4_stat_to_errno() */ \ >> > + { -EPERM, "EPERM" }, \ >> > + { -ENOENT, "ENOENT" }, \ >> > + { -EIO, "EIO" }, \ >> > + { -ENXIO, "ENXIO" }, \ >> > + { -EACCES, "EACCES" }, \ >> > + { -EEXIST, "EEXIST" }, \ >> > + { -EXDEV, "EXDEV" }, \ >> > + { -ENOTDIR, "ENOTDIR" }, \ >> > + { -EISDIR, "EISDIR" }, \ >> > + { -EFBIG, "EFBIG" }, \ >> > + { -ENOSPC, "ENOSPC" }, \ >> > + { -EROFS, "EROFS" }, \ >> > + { -EMLINK, "EMLINK" }, \ >> > + { -ENAMETOOLONG, "ENAMETOOLONG" }, \ >> > + { -ENOTEMPTY, "ENOTEMPTY" }, \ >> > + { -EDQUOT, "EDQUOT" }, \ >> > + { -ESTALE, "ESTALE" }, \ >> > + { -EBADHANDLE, "EBADHANDLE" }, \ >> > + { -EBADCOOKIE, "EBADCOOKIE" }, \ >> > + { -ENOTSUPP, "ENOTSUPP" }, \ >> > + { -ETOOSMALL, "ETOOSMALL" }, \ >> > + { -EREMOTEIO, "EREMOTEIO" }, \ >> > + { -EBADTYPE, "EBADTYPE" }, \ >> > + { -EAGAIN, "EAGAIN" }, \ >> > + { -ELOOP, "ELOOP" }, \ >> > + { -EOPNOTSUPP, "EOPNOTSUPP" }, \ >> > + { -EDEADLK, "EDEADLK" }, \ >> > + /* RPC errors */ \ >> > + { -ENOMEM, "ENOMEM" }, \ >> > + { -EKEYEXPIRED, "EKEYEXPIRED" }, \ >> > + { -ETIMEDOUT, "ETIMEDOUT" }, \ >> > + { -ERESTARTSYS, "ERESTARTSYS" }, \ >> > + { -ECONNREFUSED, "ECONNREFUSED" }, \ >> > + { -ECONNRESET, "ECONNRESET" }, \ >> > + { -ENETUNREACH, "ENETUNREACH" }, \ >> > + { -EHOSTUNREACH, "EHOSTUNREACH" }, \ >> > + { -EHOSTDOWN, "EHOSTDOWN" }, \ >> > + { -EPIPE, "EPIPE" }, \ >> > + { -EPFNOSUPPORT, "EPFNOSUPPORT" }, \ >> > + { -EPROTONOSUPPORT, "EPROTONOSUPPORT" }, \ >> > + /* NFSv4 native errors */ \ >> > + { -NFS4ERR_ACCESS, "ACCESS" }, \ >> > + { -NFS4ERR_ATTRNOTSUPP, "ATTRNOTSUPP" }, \ >> > + { -NFS4ERR_ADMIN_REVOKED, "ADMIN_REVOKED" }, \ >> > + { -NFS4ERR_BACK_CHAN_BUSY, "BACK_CHAN_BUSY" }, \ >> > + { -NFS4ERR_BADCHAR, "BADCHAR" }, \ >> > + { -NFS4ERR_BADHANDLE, "BADHANDLE" }, \ >> > + { -NFS4ERR_BADIOMODE, "BADIOMODE" }, \ >> > + { -NFS4ERR_BADLAYOUT, "BADLAYOUT" }, \ >> > + { -NFS4ERR_BADNAME, "BADNAME" }, \ >> > + { -NFS4ERR_BADOWNER, "BADOWNER" }, \ >> > + { -NFS4ERR_BADSESSION, "BADSESSION" }, \ >> > + { -NFS4ERR_BADSLOT, "BADSLOT" }, \ >> > + { -NFS4ERR_BADTYPE, "BADTYPE" }, \ >> > + { -NFS4ERR_BADXDR, "BADXDR" }, \ >> > + { -NFS4ERR_BAD_COOKIE, "BAD_COOKIE" }, \ >> > + { -NFS4ERR_BAD_HIGH_SLOT, "BAD_HIGH_SLOT" }, \ >> > + { -NFS4ERR_BAD_RANGE, "BAD_RANGE" }, \ >> > + { -NFS4ERR_BAD_SEQID, "BAD_SEQID" }, \ >> > + { -NFS4ERR_BAD_SESSION_DIGEST, "BAD_SESSION_DIGEST" }, \ >> > + { -NFS4ERR_BAD_STATEID, "BAD_STATEID" }, \ >> > + { -NFS4ERR_CB_PATH_DOWN, "CB_PATH_DOWN" }, \ >> > + { -NFS4ERR_CLID_INUSE, "CLID_INUSE" }, \ >> > + { -NFS4ERR_CLIENTID_BUSY, "CLIENTID_BUSY" }, \ >> > + { -NFS4ERR_COMPLETE_ALREADY, "COMPLETE_ALREADY" }, \ >> > + { -NFS4ERR_CONN_NOT_BOUND_TO_SESSION, \ >> > + "CONN_NOT_BOUND_TO_SESSION" }, \ >> > + { -NFS4ERR_DEADLOCK, "DEADLOCK" }, \ >> > + { -NFS4ERR_DEADSESSION, "DEAD_SESSION" }, \ >> > + { -NFS4ERR_DELAY, "DELAY" }, \ >> > + { -NFS4ERR_DELEG_ALREADY_WANTED, \ >> > + "DELEG_ALREADY_WANTED" }, \ >> > + { -NFS4ERR_DELEG_REVOKED, "DELEG_REVOKED" }, \ >> > + { -NFS4ERR_DENIED, "DENIED" }, \ >> > + { -NFS4ERR_DIRDELEG_UNAVAIL, "DIRDELEG_UNAVAIL" }, \ >> > + { -NFS4ERR_DQUOT, "DQUOT" }, \ >> > + { -NFS4ERR_ENCR_ALG_UNSUPP, "ENCR_ALG_UNSUPP" }, \ >> > + { -NFS4ERR_EXIST, "EXIST" }, \ >> > + { -NFS4ERR_EXPIRED, "EXPIRED" }, \ >> > + { -NFS4ERR_FBIG, "FBIG" }, \ >> > + { -NFS4ERR_FHEXPIRED, "FHEXPIRED" }, \ >> > + { -NFS4ERR_FILE_OPEN, "FILE_OPEN" }, \ >> > + { -NFS4ERR_GRACE, "GRACE" }, \ >> > + { -NFS4ERR_HASH_ALG_UNSUPP, "HASH_ALG_UNSUPP" }, \ >> > + { -NFS4ERR_INVAL, "INVAL" }, \ >> > + { -NFS4ERR_IO, "IO" }, \ >> > + { -NFS4ERR_ISDIR, "ISDIR" }, \ >> > + { -NFS4ERR_LAYOUTTRYLATER, "LAYOUTTRYLATER" }, \ >> > + { -NFS4ERR_LAYOUTUNAVAILABLE, "LAYOUTUNAVAILABLE" }, \ >> > + { -NFS4ERR_LEASE_MOVED, "LEASE_MOVED" }, \ >> > + { -NFS4ERR_LOCKED, "LOCKED" }, \ >> > + { -NFS4ERR_LOCKS_HELD, "LOCKS_HELD" }, \ >> > + { -NFS4ERR_LOCK_RANGE, "LOCK_RANGE" }, \ >> > + { -NFS4ERR_MINOR_VERS_MISMATCH, "MINOR_VERS_MISMATCH" }, \ >> > + { -NFS4ERR_MLINK, "MLINK" }, \ >> > + { -NFS4ERR_MOVED, "MOVED" }, \ >> > + { -NFS4ERR_NAMETOOLONG, "NAMETOOLONG" }, \ >> > + { -NFS4ERR_NOENT, "NOENT" }, \ >> > + { -NFS4ERR_NOFILEHANDLE, "NOFILEHANDLE" }, \ >> > + { -NFS4ERR_NOMATCHING_LAYOUT, "NOMATCHING_LAYOUT" }, \ >> > + { -NFS4ERR_NOSPC, "NOSPC" }, \ >> > + { -NFS4ERR_NOTDIR, "NOTDIR" }, \ >> > + { -NFS4ERR_NOTEMPTY, "NOTEMPTY" }, \ >> > + { -NFS4ERR_NOTSUPP, "NOTSUPP" }, \ >> > + { -NFS4ERR_NOT_ONLY_OP, "NOT_ONLY_OP" }, \ >> > + { -NFS4ERR_NOT_SAME, "NOT_SAME" }, \ >> > + { -NFS4ERR_NO_GRACE, "NO_GRACE" }, \ >> > + { -NFS4ERR_NXIO, "NXIO" }, \ >> > + { -NFS4ERR_OLD_STATEID, "OLD_STATEID" }, \ >> > + { -NFS4ERR_OPENMODE, "OPENMODE" }, \ >> > + { -NFS4ERR_OP_ILLEGAL, "OP_ILLEGAL" }, \ >> > + { -NFS4ERR_OP_NOT_IN_SESSION, "OP_NOT_IN_SESSION" }, \ >> > + { -NFS4ERR_PERM, "PERM" }, \ >> > + { -NFS4ERR_PNFS_IO_HOLE, "PNFS_IO_HOLE" }, \ >> > + { -NFS4ERR_PNFS_NO_LAYOUT, "PNFS_NO_LAYOUT" }, \ >> > + { -NFS4ERR_RECALLCONFLICT, "RECALLCONFLICT" }, \ >> > + { -NFS4ERR_RECLAIM_BAD, "RECLAIM_BAD" }, \ >> > + { -NFS4ERR_RECLAIM_CONFLICT, "RECLAIM_CONFLICT" }, \ >> > + { -NFS4ERR_REJECT_DELEG, "REJECT_DELEG" }, \ >> > + { -NFS4ERR_REP_TOO_BIG, "REP_TOO_BIG" }, \ >> > + { -NFS4ERR_REP_TOO_BIG_TO_CACHE, \ >> > + "REP_TOO_BIG_TO_CACHE" }, \ >> > + { -NFS4ERR_REQ_TOO_BIG, "REQ_TOO_BIG" }, \ >> > + { -NFS4ERR_RESTOREFH, "RESTOREFH" }, \ >> > + { -NFS4ERR_RETRY_UNCACHED_REP, "RETRY_UNCACHED_REP" }, \ >> > + { -NFS4ERR_RETURNCONFLICT, "RETURNCONFLICT" }, \ >> > + { -NFS4ERR_ROFS, "ROFS" }, \ >> > + { -NFS4ERR_SAME, "SAME" }, \ >> > + { -NFS4ERR_SHARE_DENIED, "SHARE_DENIED" }, \ >> > + { -NFS4ERR_SEQUENCE_POS, "SEQUENCE_POS" }, \ >> > + { -NFS4ERR_SEQ_FALSE_RETRY, "SEQ_FALSE_RETRY" }, \ >> > + { -NFS4ERR_SEQ_MISORDERED, "SEQ_MISORDERED" }, \ >> > + { -NFS4ERR_SERVERFAULT, "SERVERFAULT" }, \ >> > + { -NFS4ERR_STALE, "STALE" }, \ >> > + { -NFS4ERR_STALE_CLIENTID, "STALE_CLIENTID" }, \ >> > + { -NFS4ERR_STALE_STATEID, "STALE_STATEID" }, \ >> > + { -NFS4ERR_SYMLINK, "SYMLINK" }, \ >> > + { -NFS4ERR_TOOSMALL, "TOOSMALL" }, \ >> > + { -NFS4ERR_TOO_MANY_OPS, "TOO_MANY_OPS" }, \ >> > + { -NFS4ERR_UNKNOWN_LAYOUTTYPE, "UNKNOWN_LAYOUTTYPE" }, \ >> > + { -NFS4ERR_UNSAFE_COMPOUND, "UNSAFE_COMPOUND" }, \ >> > + { -NFS4ERR_WRONGSEC, "WRONGSEC" }, \ >> > + { -NFS4ERR_WRONG_CRED, "WRONG_CRED" }, \ >> > + { -NFS4ERR_WRONG_TYPE, "WRONG_TYPE" }, \ >> > + { -NFS4ERR_XDEV, "XDEV" }) >> > + >> > +DECLARE_EVENT_CLASS(nfs4_clientid_event, >> > + TP_PROTO(const struct nfs_client *clp, >> > + int error), >> > + >> > + TP_ARGS(clp, error), >> > + >> > + TP_STRUCT__entry( >> > + __string(dstaddr, >> > + rpc_peeraddr2str(clp->cl_rpcclient, >> > + RPC_DISPLAY_ADDR)) >> > + __field(int, error) >> > + ), >> > + >> > + TP_fast_assign( >> > + __entry->error = error; >> > + __assign_str(dstaddr, >> > + rpc_peeraddr2str(clp->cl_rpcclient, >> > + RPC_DISPLAY_ADDR)); >> > + ), >> > + >> > + TP_printk("error=%d (%s), dstaddr=%s", >> > + __entry->error, >> > + show_nfsv4_errors(__entry->error), >> > + __get_str(dstaddr) >> > + ) >> > +); >> > +#define DEFINE_NFS4_CLIENTID_EVENT(name) \ >> > +DEFINE_EVENT(nfs4_clientid_event, name, \ >> > + TP_PROTO(const struct nfs_client *clp, \ >> > + int error), \ >> > + TP_ARGS(clp, error)) >> > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_setclientid); >> > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_setclientid_confirm); >> > +#ifdef CONFIG_NFS_V4_1 >> > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_exchange_id); >> > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_create_session); >> > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_destroy_session); >> > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_destroy_clientid); >> > +DEFINE_NFS4_CLIENTID_EVENT(nfs4_bind_conn_to_session); >> > +#endif /* CONFIG_NFS_V4_1 */ >> > + >> > +#endif /* _TRACE_NFS4_H */ >> > + >> > +#undef TRACE_INCLUDE_PATH >> > +#define TRACE_INCLUDE_PATH . >> > +#define TRACE_INCLUDE_FILE nfs4trace >> > +/* This part must be outside protection */ >> > +#include <trace/define_trace.h> >> > -- >> > 1.8.3.1 >> > >> > -- >> > To unsubscribe from this list: send the line "unsubscribe linux-nfs" in >> > the body of a message to majordomo@vger.kernel.org >> > More majordomo info at http://vger.kernel.org/majordomo-info.html >> -- >> To unsubscribe from this list: send the line "unsubscribe linux-nfs" in >> the body of a message to majordomo@vger.kernel.org >> More majordomo info at http://vger.kernel.org/majordomo-info.html > > -- > Trond Myklebust > Linux NFS client maintainer > > NetApp > Trond.Myklebust@netapp.com > www.netapp.com ^ permalink raw reply [flat|nested] 16+ messages in thread
end of thread, other threads:[~2013-08-20 13:58 UTC | newest] Thread overview: 16+ messages (download: mbox.gz follow: Atom feed -- links below jump to the message on this page -- 2013-08-13 18:35 [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems Trond Myklebust 2013-08-13 18:35 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Trond Myklebust 2013-08-13 18:35 ` [PATCH 03/10] NFSv4: Add tracepoints for debugging file open Trond Myklebust 2013-08-13 18:35 ` [PATCH 04/10] NFSv4: Add tracepoints for debugging file locking Trond Myklebust 2013-08-13 18:35 ` [PATCH 05/10] NFSv4: Add tracepoints for debugging lookup/create operations Trond Myklebust 2013-08-13 18:35 ` [PATCH 06/10] NFSv4: Add tracepoints for debugging inode manipulations Trond Myklebust 2013-08-13 18:35 ` [PATCH 07/10] NFSv4: Add tracepoints for debugging rename Trond Myklebust 2013-08-13 18:35 ` [PATCH 08/10] NFSv4: Add tracepoints for debugging delegations Trond Myklebust 2013-08-13 18:35 ` [PATCH 09/10] NFSv4: Add tracepoints for debugging the idmapper Trond Myklebust 2013-08-13 18:35 ` [PATCH 10/10] NFSv4: Add tracepoints for debugging getattr Trond Myklebust 2013-08-13 19:52 ` [PATCH 02/10] NFS: refactor code for calculating the crc32 hash of a filehandle Adamson, Dros 2013-08-13 21:01 ` Myklebust, Trond 2013-08-13 20:57 ` [PATCH 01/10] NFSv4: Add tracepoints for debugging state management problems Myklebust, Trond 2013-08-14 15:31 ` J. Bruce Fields 2013-08-14 15:57 ` Myklebust, Trond 2013-08-20 13:58 ` Andy Adamson
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for NNTP newsgroup(s).