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: Shyam Prasad N <sprasad@microsoft.com>
Signed-off-by: Steve French <stfrench@microsoft.com>

+67 -1
+14 -1
fs/smb/client/smb2ops.c
··· 1812 1813 tcon = tlink_tcon(trgtfile->tlink); 1814 1815 while (len > 0) { 1816 pcchunk->SourceOffset = cpu_to_le64(src_off); 1817 pcchunk->TargetOffset = cpu_to_le64(dest_off); ··· 1867 le32_to_cpu(retbuf->ChunksWritten), 1868 le32_to_cpu(retbuf->ChunkBytesWritten), 1869 bytes_written); 1870 } else if (rc == -EINVAL) { 1871 if (ret_data_len != sizeof(struct copychunk_ioctl_rsp)) 1872 goto cchunk_out; ··· 2053 dup_ext_buf.ByteCount = cpu_to_le64(len); 2054 cifs_dbg(FYI, "Duplicate extents: src off %lld dst off %lld len %lld\n", 2055 src_off, dest_off, len); 2056 - 2057 inode = d_inode(trgtfile->dentry); 2058 if (inode->i_size < dest_off + len) { 2059 rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false); ··· 2089 trgtfile->fid.volatile_fid, 2090 tcon->tid, tcon->ses->Suid, src_off, 2091 dest_off, len, rc); 2092 return rc; 2093 } 2094
··· 1812 1813 tcon = tlink_tcon(trgtfile->tlink); 1814 1815 + trace_smb3_copychunk_enter(xid, srcfile->fid.volatile_fid, 1816 + trgtfile->fid.volatile_fid, tcon->tid, 1817 + tcon->ses->Suid, src_off, dest_off, len); 1818 + 1819 while (len > 0) { 1820 pcchunk->SourceOffset = cpu_to_le64(src_off); 1821 pcchunk->TargetOffset = cpu_to_le64(dest_off); ··· 1863 le32_to_cpu(retbuf->ChunksWritten), 1864 le32_to_cpu(retbuf->ChunkBytesWritten), 1865 bytes_written); 1866 + trace_smb3_copychunk_done(xid, srcfile->fid.volatile_fid, 1867 + trgtfile->fid.volatile_fid, tcon->tid, 1868 + tcon->ses->Suid, src_off, dest_off, len); 1869 } else if (rc == -EINVAL) { 1870 if (ret_data_len != sizeof(struct copychunk_ioctl_rsp)) 1871 goto cchunk_out; ··· 2046 dup_ext_buf.ByteCount = cpu_to_le64(len); 2047 cifs_dbg(FYI, "Duplicate extents: src off %lld dst off %lld len %lld\n", 2048 src_off, dest_off, len); 2049 + trace_smb3_clone_enter(xid, srcfile->fid.volatile_fid, 2050 + trgtfile->fid.volatile_fid, tcon->tid, 2051 + tcon->ses->Suid, src_off, dest_off, len); 2052 inode = d_inode(trgtfile->dentry); 2053 if (inode->i_size < dest_off + len) { 2054 rc = smb2_set_file_size(xid, tcon, trgtfile, dest_off + len, false); ··· 2080 trgtfile->fid.volatile_fid, 2081 tcon->tid, tcon->ses->Suid, src_off, 2082 dest_off, len, rc); 2083 + else 2084 + trace_smb3_clone_done(xid, srcfile->fid.volatile_fid, 2085 + trgtfile->fid.volatile_fid, tcon->tid, 2086 + tcon->ses->Suid, src_off, dest_off, len); 2087 return rc; 2088 } 2089
+53
fs/smb/client/trace.h
··· 264 DEFINE_SMB3_COPY_RANGE_ERR_EVENT(clone_err); 265 /* TODO: Add SMB3_COPY_RANGE_ERR_EVENT(copychunk_err) */ 266 267 /* For logging successful read or write */ 268 DECLARE_EVENT_CLASS(smb3_rw_done_class, 269 TP_PROTO(unsigned int rreq_debug_id,
··· 264 DEFINE_SMB3_COPY_RANGE_ERR_EVENT(clone_err); 265 /* TODO: Add SMB3_COPY_RANGE_ERR_EVENT(copychunk_err) */ 266 267 + DECLARE_EVENT_CLASS(smb3_copy_range_done_class, 268 + TP_PROTO(unsigned int xid, 269 + __u64 src_fid, 270 + __u64 target_fid, 271 + __u32 tid, 272 + __u64 sesid, 273 + __u64 src_offset, 274 + __u64 target_offset, 275 + __u32 len), 276 + TP_ARGS(xid, src_fid, target_fid, tid, sesid, src_offset, target_offset, len), 277 + TP_STRUCT__entry( 278 + __field(unsigned int, xid) 279 + __field(__u64, src_fid) 280 + __field(__u64, target_fid) 281 + __field(__u32, tid) 282 + __field(__u64, sesid) 283 + __field(__u64, src_offset) 284 + __field(__u64, target_offset) 285 + __field(__u32, len) 286 + ), 287 + TP_fast_assign( 288 + __entry->xid = xid; 289 + __entry->src_fid = src_fid; 290 + __entry->target_fid = target_fid; 291 + __entry->tid = tid; 292 + __entry->sesid = sesid; 293 + __entry->src_offset = src_offset; 294 + __entry->target_offset = target_offset; 295 + __entry->len = len; 296 + ), 297 + 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", 298 + __entry->xid, __entry->sesid, __entry->tid, __entry->target_fid, 299 + __entry->src_offset, __entry->target_fid, __entry->target_offset, __entry->len) 300 + ) 301 + 302 + #define DEFINE_SMB3_COPY_RANGE_DONE_EVENT(name) \ 303 + DEFINE_EVENT(smb3_copy_range_done_class, smb3_##name, \ 304 + TP_PROTO(unsigned int xid, \ 305 + __u64 src_fid, \ 306 + __u64 target_fid, \ 307 + __u32 tid, \ 308 + __u64 sesid, \ 309 + __u64 src_offset, \ 310 + __u64 target_offset, \ 311 + __u32 len), \ 312 + TP_ARGS(xid, src_fid, target_fid, tid, sesid, src_offset, target_offset, len)) 313 + 314 + DEFINE_SMB3_COPY_RANGE_DONE_EVENT(copychunk_enter); 315 + DEFINE_SMB3_COPY_RANGE_DONE_EVENT(clone_enter); 316 + DEFINE_SMB3_COPY_RANGE_DONE_EVENT(copychunk_done); 317 + DEFINE_SMB3_COPY_RANGE_DONE_EVENT(clone_done); 318 + 319 + 320 /* For logging successful read or write */ 321 DECLARE_EVENT_CLASS(smb3_rw_done_class, 322 TP_PROTO(unsigned int rreq_debug_id,