Re: [PATCH][SMB3] Add various dynamic tracepoints for compounded operations

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Version 3 of the patch attached.   Sample output below:
(trace-cmd  record -e *query_info_co* -e smb3_hardlink* -e
smb3_rename* -e smb3_set_eof* -e smb3_set_info_co* -e smb3_mkdir* -e
smb3_delete* -e smb3_rmdir*)

           mkdir-17927 [003] .... 447434.636544:
smb3_query_info_compound_enter: xid=7 sid=0x7dc5fd6f tid=0xc7968732
path=\newdir
           mkdir-17927 [003] .... 447434.637240:
smb3_query_info_compound_err: xid=7 sid=0x7dc5fd6f tid=0xc7968732
rc=-2
           mkdir-17942 [000] .... 447446.807606:
smb3_query_info_compound_enter: xid=8 sid=0x7dc5fd6f tid=0xc7968732
path=\newdir
           mkdir-17942 [000] .... 447446.808233:
smb3_query_info_compound_err: xid=8 sid=0x7dc5fd6f tid=0xc7968732
rc=-2
           mkdir-17942 [000] .... 447446.808251: smb3_mkdir_enter:
xid=9 sid=0x7dc5fd6f tid=0xc7968732 path=\newdir
           mkdir-17942 [000] .... 447446.809161: smb3_mkdir_done:
xid=9 sid=0x7dc5fd6f tid=0xc7968732
           mkdir-17942 [000] .... 447446.809178:
smb3_query_info_compound_enter: xid=9 sid=0x7dc5fd6f tid=0xc7968732
path=\newdir
           mkdir-17942 [000] .... 447446.809979:
smb3_query_info_compound_done: xid=9 sid=0x7dc5fd6f tid=0xc7968732
           rmdir-17943 [001] .... 447451.374029:
smb3_query_info_compound_enter: xid=10 sid=0x7dc5fd6f tid=0xc7968732
path=\baddir
           rmdir-17943 [001] .... 447451.379621:
smb3_query_info_compound_err: xid=10 sid=0x7dc5fd6f tid=0xc7968732
rc=-2
           rmdir-17944 [001] .... 447456.088795:
smb3_query_info_compound_enter: xid=11 sid=0x7dc5fd6f tid=0xc7968732
path=\newdir
           rmdir-17944 [001] .... 447456.089615:
smb3_query_info_compound_done: xid=11 sid=0x7dc5fd6f tid=0xc7968732
           rmdir-17944 [001] .... 447456.089640: smb3_rmdir_enter:
xid=12 sid=0x7dc5fd6f tid=0xc7968732 path=\newdir
           rmdir-17944 [001] .... 447456.090651: smb3_rmdir_done:
xid=12 sid=0x7dc5fd6f tid=0xc7968732
           touch-17945 [006] .... 447460.575789:
smb3_set_info_compound_enter: xid=14 sid=0x7dc5fd6f tid=0xc7968732
path=\file
           touch-17945 [006] .... 447460.576571:
smb3_set_info_compound_done: xid=14 sid=0x7dc5fd6f tid=0xc7968732
              ln-17946 [001] .... 447468.254480:
smb3_query_info_compound_enter: xid=16 sid=0x7dc5fd6f tid=0xc7968732
path=\linkedfile
              ln-17946 [001] .... 447468.255082:
smb3_query_info_compound_err: xid=16 sid=0x7dc5fd6f tid=0xc7968732
rc=-2
              ln-17946 [001] .... 447468.255118:
smb3_query_info_compound_enter: xid=17 sid=0x7dc5fd6f tid=0xc7968732
path=\file
              ln-17946 [001] .... 447468.255715:
smb3_query_info_compound_done: xid=17 sid=0x7dc5fd6f tid=0xc7968732
              ln-17946 [001] .... 447468.255760:
smb3_query_info_compound_enter: xid=18 sid=0x7dc5fd6f tid=0xc7968732
path=\linkedfile
              ln-17946 [001] .... 447468.256254:
smb3_query_info_compound_err: xid=18 sid=0x7dc5fd6f tid=0xc7968732
rc=-2
              ln-17946 [001] .... 447468.256277: smb3_hardlink_enter:
xid=19 sid=0x7dc5fd6f tid=0xc7968732 path=\file
              ln-17946 [001] .... 447468.256954: smb3_hardlink_done:
xid=19 sid=0x7dc5fd6f tid=0xc7968732
           gmain-2225  [004] .... 447468.257130:
smb3_query_info_compound_enter: xid=20 sid=0x7dc5fd6f tid=0xc7968732
path=\linkedfile
           gmain-2225  [005] .... 447468.257788:
smb3_query_info_compound_done: xid=20 sid=0x7dc5fd6f tid=0xc7968732

On Tue, Mar 12, 2019 at 4:51 PM Pavel Shilovsky <piastryyy@xxxxxxxxx> wrote:
>
> I actually like the idea proposed in the patch: this way we will be
> able to track logical operations better. In a case we need a deeper
> logging we already have mid traces which contains MID, TID, SID and
> CMD - everything you need to trace individual SMB packet regardless of
> whether it is a part of compounding chain or not.
>
> Now in order to match both logical operation and SMB packets traces we
> need something common - like XID. Currently we do not propagate XID
> down to the transport layer, let's do that - this way we can trace
> individual system call from the very beginning to the completeness on
> every layer inside cifs.ko.
>
> вт, 12 мар. 2019 г. в 00:19, Steve French <smfrench@xxxxxxxxx>:
> >
> > The general feeling I am getting from tracing the compounding is that
> > we have to have the more granular tracing available
> > (similar to this patch), and also (with followon patch) add noisier
> > optional trace points lower down (that are generic) that we turn on
> > less frequently (in particular when the filename is not good enough
> > and we must have the xid - even if it makes the trace very noisy)
> >
> >
> > On Tue, Mar 12, 2019 at 1:06 AM ronnie sahlberg
> > <ronniesahlberg@xxxxxxxxx> wrote:
> > >
> > > Hmm.
> > >
> > > I don't think this is the wrong layer to add the tracing.
> > > Instead of adding the tracing in say smb2_compound_op(), where we
> > > create the compound,
> > > I think it will be better to add the tracing down in the leaf
> > > functions, i.e. down in SMB2_open_init(), SMB2_query_info_init(), ...
> > >
> > > That way we know that we will always have tracing for all opens/closes/...
> > >
> > > But then what to do about the trace_smb3_..._err()/trace_smb3_..._done() calls ?
> > > These I think should be moved down and handled inside compound_send_recv().
> > > That way we can have one single place where we call the appropriate
> > > _err()/_done() functions
> > > and we know that we will catch every single completed function.
> > >
> > > I.e. just put it in a single place instead of in every single call-site.
> > > In compound_send_recv we can just loop over all the responses, cast it
> > > to a smb2_hdr structure, looka at both the command code as well as the
> > > status code and call the appropriate xys_err() or xyz_done() functions
> > > as needed.
> > >
> > > Let me show an example of what I mean for a open/query/close compound :
> > >
> > > trace_smb3_open_enter(xid=5, filename="foo", ...)   from SMB2_open_init()
> > > trace_smb3_query_info_enter(xid=5,... ) from SMB2_query_info_init()
> > > trace_smb3_close_enter(xid=5, ...) from SMB2_close_init()
> > > (maybe have additional tracing in compound_send_recv() that we are
> > > about to send xid=5 to the wire)
> > > trace_smb3_open_done(xid=5, ...) from compound_send_recv()
> > > trace_smb3_query_info_done(xid=5, ...) from compound_send_recv()
> > > trace_smb3_close_done(xid=5, ...) from compound_send_recv()
> > >
>
> As pointed above we already have a similar tracing inside
> compound_send_recv and other transport layer functions - command level
> tracing. The only problem is that we do not log failure cases when we
> didn't send the packet - we only log server responses in
> map_smb2_to_linux_error. This is another area of the tracing where a
> fix is needed.
>
> --
> Best regards,
> Pavel Shilovsky



-- 
Thanks,

Steve
From fe3cfc252be9857c160973e499c3bdd7428e3c96 Mon Sep 17 00:00:00 2001
From: Steve French <stfrench@xxxxxxxxxxxxx>
Date: Wed, 13 Mar 2019 00:02:47 -0500
Subject: [PATCH] smb3: Add dynamic trace points for various compounded  smb3
 ops

Adds trace points for enter and exit (done vs. error) for:

	compounded query and setinfo, hardlink, rename,
	mkdir, rmdir, set_eof, delete (unlink)

Signed-off-by: Steve French <stfrench@xxxxxxxxxxxxx>
---
 fs/cifs/smb2inode.c |  72 +++++++++++++++++++++++++--
 fs/cifs/trace.h     | 117 ++++++++++++++++++++++++++++++++++++++++++++
 2 files changed, 185 insertions(+), 4 deletions(-)

diff --git a/fs/cifs/smb2inode.c b/fs/cifs/smb2inode.c
index b6e07e2eed10..278405d26c47 100644
--- a/fs/cifs/smb2inode.c
+++ b/fs/cifs/smb2inode.c
@@ -37,6 +37,16 @@
 #include "smb2pdu.h"
 #include "smb2proto.h"
 
+static void
+free_set_inf_compound(struct smb_rqst *rqst)
+{
+	if (rqst[1].rq_iov)
+		SMB2_set_info_free(&rqst[1]);
+	if (rqst[2].rq_iov)
+		SMB2_close_free(&rqst[2]);
+}
+
+
 static int
 smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 		 struct cifs_sb_info *cifs_sb, const char *full_path,
@@ -112,14 +122,18 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 					  PATH_MAX * 2, 0, NULL);
 		smb2_set_next_command(tcon, &rqst[num_rqst]);
 		smb2_set_related(&rqst[num_rqst++]);
+		trace_smb3_query_info_compound_enter(xid, ses->Suid, tcon->tid,
+						     full_path);
 		break;
 	case SMB2_OP_DELETE:
+		trace_smb3_delete_enter(xid, ses->Suid, tcon->tid, full_path);
 		break;
 	case SMB2_OP_MKDIR:
 		/*
 		 * Directories are created through parameters in the
 		 * SMB2_open() call.
 		 */
+		trace_smb3_mkdir_enter(xid, ses->Suid, tcon->tid, full_path);
 		break;
 	case SMB2_OP_RMDIR:
 		memset(&si_iov, 0, sizeof(si_iov));
@@ -135,6 +149,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 					SMB2_O_INFO_FILE, 0, data, size);
 		smb2_set_next_command(tcon, &rqst[num_rqst]);
 		smb2_set_related(&rqst[num_rqst++]);
+		trace_smb3_rmdir_enter(xid, ses->Suid, tcon->tid, full_path);
 		break;
 	case SMB2_OP_SET_EOF:
 		memset(&si_iov, 0, sizeof(si_iov));
@@ -150,6 +165,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 					SMB2_O_INFO_FILE, 0, data, size);
 		smb2_set_next_command(tcon, &rqst[num_rqst]);
 		smb2_set_related(&rqst[num_rqst++]);
+		trace_smb3_set_eof_enter(xid, ses->Suid, tcon->tid, full_path);
 		break;
 	case SMB2_OP_SET_INFO:
 		memset(&si_iov, 0, sizeof(si_iov));
@@ -166,6 +182,8 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 					SMB2_O_INFO_FILE, 0, data, size);
 		smb2_set_next_command(tcon, &rqst[num_rqst]);
 		smb2_set_related(&rqst[num_rqst++]);
+		trace_smb3_set_info_compound_enter(xid, ses->Suid, tcon->tid,
+						   full_path);
 		break;
 	case SMB2_OP_RENAME:
 		memset(&si_iov, 0, sizeof(si_iov));
@@ -190,6 +208,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 					SMB2_O_INFO_FILE, 0, data, size);
 		smb2_set_next_command(tcon, &rqst[num_rqst]);
 		smb2_set_related(&rqst[num_rqst++]);
+		trace_smb3_rename_enter(xid, ses->Suid, tcon->tid, full_path);
 		break;
 	case SMB2_OP_HARDLINK:
 		memset(&si_iov, 0, sizeof(si_iov));
@@ -214,6 +233,7 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 					SMB2_O_INFO_FILE, 0, data, size);
 		smb2_set_next_command(tcon, &rqst[num_rqst]);
 		smb2_set_related(&rqst[num_rqst++]);
+		trace_smb3_hardlink_enter(xid, ses->Suid, tcon->tid, full_path);
 		break;
 	default:
 		cifs_dbg(VFS, "Invalid command\n");
@@ -252,21 +272,65 @@ smb2_compound_op(const unsigned int xid, struct cifs_tcon *tcon,
 			SMB2_query_info_free(&rqst[1]);
 		if (rqst[2].rq_iov)
 			SMB2_close_free(&rqst[2]);
+		if (rc)
+			trace_smb3_query_info_compound_err(xid,  ses->Suid,
+						tcon->tid, rc);
+		else
+			trace_smb3_query_info_compound_done(xid, ses->Suid,
+						tcon->tid);
 		break;
 	case SMB2_OP_DELETE:
+		if (rc)
+			trace_smb3_delete_err(xid,  ses->Suid, tcon->tid, rc);
+		else
+			trace_smb3_delete_done(xid, ses->Suid, tcon->tid);
+		if (rqst[1].rq_iov)
+			SMB2_close_free(&rqst[1]);
+		break;
 	case SMB2_OP_MKDIR:
+		if (rc)
+			trace_smb3_mkdir_err(xid,  ses->Suid, tcon->tid, rc);
+		else
+			trace_smb3_mkdir_done(xid, ses->Suid, tcon->tid);
 		if (rqst[1].rq_iov)
 			SMB2_close_free(&rqst[1]);
 		break;
 	case SMB2_OP_HARDLINK:
+		if (rc)
+			trace_smb3_hardlink_err(xid,  ses->Suid, tcon->tid, rc);
+		else
+			trace_smb3_hardlink_done(xid, ses->Suid, tcon->tid);
+		free_set_inf_compound(rqst);
+		break;
 	case SMB2_OP_RENAME:
+		if (rc)
+			trace_smb3_rename_err(xid,  ses->Suid, tcon->tid, rc);
+		else
+			trace_smb3_rename_done(xid, ses->Suid, tcon->tid);
+		free_set_inf_compound(rqst);
+		break;
 	case SMB2_OP_RMDIR:
+		if (rc)
+			trace_smb3_rmdir_err(xid,  ses->Suid, tcon->tid, rc);
+		else
+			trace_smb3_rmdir_done(xid, ses->Suid, tcon->tid);
+		free_set_inf_compound(rqst);
+		break;
 	case SMB2_OP_SET_EOF:
+		if (rc)
+			trace_smb3_set_eof_err(xid,  ses->Suid, tcon->tid, rc);
+		else
+			trace_smb3_set_eof_done(xid, ses->Suid, tcon->tid);
+		free_set_inf_compound(rqst);
+		break;
 	case SMB2_OP_SET_INFO:
-		if (rqst[1].rq_iov)
-			SMB2_set_info_free(&rqst[1]);
-		if (rqst[2].rq_iov)
-			SMB2_close_free(&rqst[2]);
+		if (rc)
+			trace_smb3_set_info_compound_err(xid,  ses->Suid,
+						tcon->tid, rc);
+		else
+			trace_smb3_set_info_compound_done(xid, ses->Suid,
+						tcon->tid);
+		free_set_inf_compound(rqst);
 		break;
 	}
 	free_rsp_buf(resp_buftype[0], rsp_iov[0].iov_base);
diff --git a/fs/cifs/trace.h b/fs/cifs/trace.h
index c78e96c4cc53..30bf51c7e8fe 100644
--- a/fs/cifs/trace.h
+++ b/fs/cifs/trace.h
@@ -242,6 +242,123 @@ DEFINE_SMB3_INF_ERR_EVENT(query_info_err);
 DEFINE_SMB3_INF_ERR_EVENT(set_info_err);
 DEFINE_SMB3_INF_ERR_EVENT(fsctl_err);
 
+DECLARE_EVENT_CLASS(smb3_inf_compound_enter_class,
+	TP_PROTO(unsigned int xid,
+		__u32	tid,
+		__u64	sesid,
+		const char *full_path),
+	TP_ARGS(xid, tid, sesid, full_path),
+	TP_STRUCT__entry(
+		__field(unsigned int, xid)
+		__field(__u32, tid)
+		__field(__u64, sesid)
+		__string(path, full_path)
+	),
+	TP_fast_assign(
+		__entry->xid = xid;
+		__entry->tid = tid;
+		__entry->sesid = sesid;
+		__assign_str(path, full_path);
+	),
+	TP_printk("xid=%u sid=0x%llx tid=0x%x path=%s",
+		__entry->xid, __entry->sesid, __entry->tid,
+		__get_str(path))
+)
+
+#define DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(name)     \
+DEFINE_EVENT(smb3_inf_compound_enter_class, smb3_##name,    \
+	TP_PROTO(unsigned int xid,		\
+		__u32	tid,			\
+		__u64	sesid,			\
+		const char *full_path),		\
+	TP_ARGS(xid, tid, sesid, full_path))
+
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(query_info_compound_enter);
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(hardlink_enter);
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(rename_enter);
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(rmdir_enter);
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(set_eof_enter);
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(set_info_compound_enter);
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(delete_enter);
+DEFINE_SMB3_INF_COMPOUND_ENTER_EVENT(mkdir_enter);
+
+
+DECLARE_EVENT_CLASS(smb3_inf_compound_done_class,
+	TP_PROTO(unsigned int xid,
+		__u32	tid,
+		__u64	sesid),
+	TP_ARGS(xid, tid, sesid),
+	TP_STRUCT__entry(
+		__field(unsigned int, xid)
+		__field(__u32, tid)
+		__field(__u64, sesid)
+	),
+	TP_fast_assign(
+		__entry->xid = xid;
+		__entry->tid = tid;
+		__entry->sesid = sesid;
+	),
+	TP_printk("xid=%u sid=0x%llx tid=0x%x",
+		__entry->xid, __entry->sesid, __entry->tid)
+)
+
+#define DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(name)     \
+DEFINE_EVENT(smb3_inf_compound_done_class, smb3_##name,    \
+	TP_PROTO(unsigned int xid,		\
+		__u32	tid,			\
+		__u64	sesid),			\
+	TP_ARGS(xid, tid, sesid))
+
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(query_info_compound_done);
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(hardlink_done);
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(rename_done);
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(rmdir_done);
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(set_eof_done);
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(set_info_compound_done);
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(delete_done);
+DEFINE_SMB3_INF_COMPOUND_DONE_EVENT(mkdir_done);
+
+
+DECLARE_EVENT_CLASS(smb3_inf_compound_err_class,
+	TP_PROTO(unsigned int xid,
+		__u32	tid,
+		__u64	sesid,
+		int	rc),
+	TP_ARGS(xid, tid, sesid, rc),
+	TP_STRUCT__entry(
+		__field(unsigned int, xid)
+		__field(__u32, tid)
+		__field(__u64, sesid)
+		__field(int, rc)
+	),
+	TP_fast_assign(
+		__entry->xid = xid;
+		__entry->tid = tid;
+		__entry->sesid = sesid;
+		__entry->rc = rc;
+	),
+	TP_printk("xid=%u sid=0x%llx tid=0x%x rc=%d",
+		__entry->xid, __entry->sesid, __entry->tid,
+		__entry->rc)
+)
+
+#define DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(name)     \
+DEFINE_EVENT(smb3_inf_compound_err_class, smb3_##name,    \
+	TP_PROTO(unsigned int xid,		\
+		__u32	tid,			\
+		__u64	sesid,			\
+		int rc),			\
+	TP_ARGS(xid, tid, sesid, rc))
+
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(query_info_compound_err);
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(hardlink_err);
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(rename_err);
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(rmdir_err);
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(set_eof_err);
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(set_info_compound_err);
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(mkdir_err);
+DEFINE_SMB3_INF_COMPOUND_ERR_EVENT(delete_err);
+
 /*
  * For logging SMB3 Status code and Command for responses which return errors
  */
-- 
2.17.1


[Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux