Fwd: [PATCH][V3] smb3: allow more detailed protocol info on open files for debugging

Steve French smfrench at gmail.com
Wed Oct 31 01:08:00 UTC 2018


---------- Forwarded message ---------
From: Steve French <smfrench at gmail.com>
Date: Tue, Oct 30, 2018 at 8:04 PM
Subject: [PATCH][V3] smb3: allow more detailed protocol info on open
files for debugging
To:


In order to debug complex problems it is often helpful to
have detailed information on the client and server view
of the open file information.  Add the ability for root to
view the list of smb3 open files and dump the persistent
handle and other info so that it can be more easily
correlated with server logs.

Sample output from "cat /proc/fs/cifs/open_files"

0x5 0x800000378 0x8000 1 7704 0 some-file 0x14
0xcb903c0c 0x84412e67 0x8000 1 7754 1001 rofile 0x1a6d
0xcb903c0c 0x9526b767 0x8000 1 7720 1000 file 0x1a5b
0xcb903c0c 0x9ce41a21 0x8000 1 7715 0 smallfile 0xd67

Signed-off-by: Steve French <stfrench at microsoft.com>
---
 fs/cifs/cifs_debug.c | 56 ++++++++++++++++++++++++++++++++++++++++++++
 fs/cifs/cifsglob.h   |  3 +++
 fs/cifs/smb2ops.c    |  4 ++++
 fs/cifs/smb2pdu.c    |  3 +++
 4 files changed, 66 insertions(+)

diff --git a/fs/cifs/cifs_debug.c b/fs/cifs/cifs_debug.c
index 3e812428ac8d..ba178b09de0b 100644
--- a/fs/cifs/cifs_debug.c
+++ b/fs/cifs/cifs_debug.c
@@ -145,6 +145,58 @@ cifs_dump_iface(struct seq_file *m, struct
cifs_server_iface *iface)
         seq_printf(m, "\t\tIPv6: %pI6\n", &ipv6->sin6_addr);
 }

+static int cifs_debug_files_proc_show(struct seq_file *m, void *v)
+{
+    struct list_head *stmp, *tmp, *tmp1, *tmp2;
+    struct TCP_Server_Info *server;
+    struct cifs_ses *ses;
+    struct cifs_tcon *tcon;
+    struct cifsFileInfo *cfile;
+
+    seq_puts(m, "# Version:1\n");
+    seq_puts(m, "# Format:\n");
+    seq_puts(m, "# <tree id> <persistent fid> <flags> <count> <pid> <uid>");
+#ifdef CONFIG_CIFS_DEBUG2
+    seq_printf(m, " <filename> <mid>\n");
+#else
+    seq_printf(m, " <filename>\n");
+#endif /* CIFS_DEBUG2 */
+    spin_lock(&cifs_tcp_ses_lock);
+    list_for_each(stmp, &cifs_tcp_ses_list) {
+        server = list_entry(stmp, struct TCP_Server_Info,
+                    tcp_ses_list);
+        list_for_each(tmp, &server->smb_ses_list) {
+            ses = list_entry(tmp, struct cifs_ses, smb_ses_list);
+            list_for_each(tmp1, &ses->tcon_list) {
+                tcon = list_entry(tmp1, struct cifs_tcon, tcon_list);
+                spin_lock(&tcon->open_file_lock);
+                list_for_each(tmp2, &tcon->openFileList) {
+                    cfile = list_entry(tmp2, struct cifsFileInfo,
+                             tlist);
+                    seq_printf(m,
+                        "0x%x 0x%llx 0x%x %d %d %d %s",
+                        tcon->tid,
+                        cfile->fid.persistent_fid,
+                        cfile->f_flags,
+                        cfile->count,
+                        cfile->pid,
+                        from_kuid(&init_user_ns, cfile->uid),
+                        cfile->dentry->d_name.name);
+#ifdef CONFIG_CIFS_DEBUG2
+                    seq_printf(m, " 0x%llx\n", cfile->fid.mid);
+#else
+                    seq_printf(m, "\n");
+#endif /* CIFS_DEBUG2 */
+                }
+                spin_unlock(&tcon->open_file_lock);
+            }
+        }
+    }
+    spin_unlock(&cifs_tcp_ses_lock);
+    seq_putc(m, '\n');
+    return 0;
+}
+
 static int cifs_debug_data_proc_show(struct seq_file *m, void *v)
 {
     struct list_head *tmp1, *tmp2, *tmp3;
@@ -565,6 +617,9 @@ cifs_proc_init(void)
     proc_create_single("DebugData", 0, proc_fs_cifs,
             cifs_debug_data_proc_show);

+    proc_create_single("open_files", 0400, proc_fs_cifs,
+            cifs_debug_files_proc_show);
+
     proc_create("Stats", 0644, proc_fs_cifs, &cifs_stats_proc_fops);
     proc_create("cifsFYI", 0644, proc_fs_cifs, &cifsFYI_proc_fops);
     proc_create("traceSMB", 0644, proc_fs_cifs, &traceSMB_proc_fops);
@@ -601,6 +656,7 @@ cifs_proc_clean(void)
         return;

     remove_proc_entry("DebugData", proc_fs_cifs);
+    remove_proc_entry("open_files", proc_fs_cifs);
     remove_proc_entry("cifsFYI", proc_fs_cifs);
     remove_proc_entry("traceSMB", proc_fs_cifs);
     remove_proc_entry("Stats", proc_fs_cifs);
diff --git a/fs/cifs/cifsglob.h b/fs/cifs/cifsglob.h
index ed1e0fcb69e3..d7c0443d47a4 100644
--- a/fs/cifs/cifsglob.h
+++ b/fs/cifs/cifsglob.h
@@ -1125,6 +1125,9 @@ struct cifs_fid {
     __u8 create_guid[16];
     struct cifs_pending_open *pending_open;
     unsigned int epoch;
+#ifdef CONFIG_CIFS_DEBUG2
+    __u64 mid;
+#endif /* CIFS_DEBUG2 */
     bool purge_cache;
 };

diff --git a/fs/cifs/smb2ops.c b/fs/cifs/smb2ops.c
index 59dc9ae0ecfd..31bb9927f58e 100644
--- a/fs/cifs/smb2ops.c
+++ b/fs/cifs/smb2ops.c
@@ -1079,6 +1079,9 @@ smb2_set_fid(struct cifsFileInfo *cfile, struct
cifs_fid *fid, __u32 oplock)

     cfile->fid.persistent_fid = fid->persistent_fid;
     cfile->fid.volatile_fid = fid->volatile_fid;
+#ifdef CONFIG_CIFS_DEBUG2
+    cfile->fid.mid = fid->mid;
+#endif /* CIFS_DEBUG2 */
     server->ops->set_oplock_level(cinode, oplock, fid->epoch,
                       &fid->purge_cache);
     cinode->can_cache_brlcks = CIFS_CACHE_WRITE(cinode);
diff --git a/fs/cifs/smb2pdu.c b/fs/cifs/smb2pdu.c
index a92d3840db9d..27f86537a5d1 100644
--- a/fs/cifs/smb2pdu.c
+++ b/fs/cifs/smb2pdu.c
@@ -2309,6 +2309,9 @@ SMB2_open(const unsigned int xid, struct
cifs_open_parms *oparms, __le16 *path,
     atomic_inc(&tcon->num_remote_opens);
     oparms->fid->persistent_fid = rsp->PersistentFileId;
     oparms->fid->volatile_fid = rsp->VolatileFileId;
+#ifdef CONFIG_CIFS_DEBUG2
+    oparms->fid->mid = le64_to_cpu(rsp->sync_hdr.MessageId);
+#endif /* CIFS_DEBUG2 */

     if (buf) {
         memcpy(buf, &rsp->CreationTime, 32);

--
Thanks,

Steve


-- 
Thanks,

Steve
-------------- next part --------------
A non-text attachment was scrubbed...
Name: 0001-smb3-allow-more-detailed-protocol-info-on-open-files.patch
Type: application/x-patch
Size: 5441 bytes
Desc: not available
URL: <http://lists.samba.org/pipermail/samba-technical/attachments/20181030/a2e12513/0001-smb3-allow-more-detailed-protocol-info-on-open-files.bin>


More information about the samba-technical mailing list