Commit 6629f87b authored by Steve French's avatar Steve French
Browse files

smb3: add four dynamic tracepoints for copy_file_range and reflink



Add more dynamic tracepoints to help debug copy_file_range (copychunk)
and clone_range ("duplicate extents").  These are tracepoints for
entering the function and completing without error. For example:

  "trace-cmd record -e smb3_copychunk_enter -e smb3_copychunk_done"

or

  "trace-cmd record -e smb3_clone_enter -e smb3_clone_done"

Here is sample output:

       TASK-PID     CPU#  |||||  TIMESTAMP  FUNCTION
         | |         |   |||||     |         |
       cp-5964    [005] .....  2176.168977: smb3_clone_enter:
         xid=17 sid=0xeb275be4 tid=0x7ffa7cdb source fid=0x1ed02e15
         source offset=0x0 target fid=0x1ed02e15 target offset=0x0
         len=0xa0000
       cp-5964    [005] .....  2176.170668: smb3_clone_done:
         xid=17 sid=0xeb275be4 tid=0x7ffa7cdb source fid=0x1ed02e15
         source offset=0x0 target fid=0x1ed02e15 target offset=0x0
         len=0xa0000

Reviewed-by: default avatarShyam Prasad N <sprasad@microsoft.com>
Signed-off-by: default avatarSteve French <stfrench@microsoft.com>
parent 5779d398
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -1812,6 +1812,10 @@ smb2_copychunk_range(const unsigned int xid,

	tcon = tlink_tcon(trgtfile->tlink);

	trace_smb3_copychunk_enter(xid, srcfile->fid.volatile_fid,
				   trgtfile->fid.volatile_fid, tcon->tid,
				   tcon->ses->Suid, src_off, dest_off, len);

	while (len > 0) {
		pcchunk->SourceOffset = cpu_to_le64(src_off);
		pcchunk->TargetOffset = cpu_to_le64(dest_off);
@@ -1863,6 +1867,9 @@ smb2_copychunk_range(const unsigned int xid,
				le32_to_cpu(retbuf->ChunksWritten),
				le32_to_cpu(retbuf->ChunkBytesWritten),
				bytes_written);
			trace_smb3_copychunk_done(xid, srcfile->fid.volatile_fid,
				trgtfile->fid.volatile_fid, tcon->tid,
				tcon->ses->Suid, src_off, dest_off, len);
		} else if (rc == -EINVAL) {
			if (ret_data_len != sizeof(struct copychunk_ioctl_rsp))
				goto cchunk_out;
@@ -2046,7 +2053,9 @@ smb2_duplicate_extents(const unsigned int xid,
	dup_ext_buf.ByteCount = cpu_to_le64(len);
	cifs_dbg(FYI, "Duplicate extents: src off %lld dst off %lld len %lld\n",
		src_off, dest_off, len);

	trace_smb3_clone_enter(xid, srcfile->fid.volatile_fid,
			       trgtfile->fid.volatile_fid, tcon->tid,
			       tcon->ses->Suid, src_off, dest_off, len);
	inode = d_inode(trgtfile->dentry);
	if (inode->i_size < dest_off + len) {
		rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false);
@@ -2080,6 +2089,10 @@ smb2_duplicate_extents(const unsigned int xid,
				     trgtfile->fid.volatile_fid,
				     tcon->tid, tcon->ses->Suid, src_off,
				     dest_off, len, rc);
	else
		trace_smb3_clone_done(xid, srcfile->fid.volatile_fid,
				      trgtfile->fid.volatile_fid, tcon->tid,
				      tcon->ses->Suid, src_off, dest_off, len);
	return rc;
}

+53 −0
Original line number Diff line number Diff line
@@ -264,6 +264,59 @@ DEFINE_EVENT(smb3_copy_range_err_class, smb3_##name, \
DEFINE_SMB3_COPY_RANGE_ERR_EVENT(clone_err);
/* TODO: Add SMB3_COPY_RANGE_ERR_EVENT(copychunk_err) */

DECLARE_EVENT_CLASS(smb3_copy_range_done_class,
	TP_PROTO(unsigned int xid,
		__u64	src_fid,
		__u64   target_fid,
		__u32	tid,
		__u64	sesid,
		__u64	src_offset,
		__u64   target_offset,
		__u32	len),
	TP_ARGS(xid, src_fid, target_fid, tid, sesid, src_offset, target_offset, len),
	TP_STRUCT__entry(
		__field(unsigned int, xid)
		__field(__u64, src_fid)
		__field(__u64, target_fid)
		__field(__u32, tid)
		__field(__u64, sesid)
		__field(__u64, src_offset)
		__field(__u64, target_offset)
		__field(__u32, len)
	),
	TP_fast_assign(
		__entry->xid = xid;
		__entry->src_fid = src_fid;
		__entry->target_fid = target_fid;
		__entry->tid = tid;
		__entry->sesid = sesid;
		__entry->src_offset = src_offset;
		__entry->target_offset = target_offset;
		__entry->len = len;
	),
	TP_printk("\txid=%u sid=0x%llx tid=0x%x source fid=0x%llx source offset=0x%llx target fid=0x%llx target offset=0x%llx len=0x%x",
		__entry->xid, __entry->sesid, __entry->tid, __entry->target_fid,
		__entry->src_offset, __entry->target_fid, __entry->target_offset, __entry->len)
)

#define DEFINE_SMB3_COPY_RANGE_DONE_EVENT(name)	\
DEFINE_EVENT(smb3_copy_range_done_class, smb3_##name, \
	TP_PROTO(unsigned int xid,		\
		__u64	src_fid,		\
		__u64   target_fid,		\
		__u32	tid,			\
		__u64	sesid,			\
		__u64	src_offset,		\
		__u64	target_offset,		\
		__u32	len),			\
	TP_ARGS(xid, src_fid, target_fid, tid, sesid, src_offset, target_offset, len))

DEFINE_SMB3_COPY_RANGE_DONE_EVENT(copychunk_enter);
DEFINE_SMB3_COPY_RANGE_DONE_EVENT(clone_enter);
DEFINE_SMB3_COPY_RANGE_DONE_EVENT(copychunk_done);
DEFINE_SMB3_COPY_RANGE_DONE_EVENT(clone_done);


/* For logging successful read or write */
DECLARE_EVENT_CLASS(smb3_rw_done_class,
	TP_PROTO(unsigned int rreq_debug_id,