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

ronnie sahlberg ronniesahlberg at gmail.com
Wed Oct 31 01:27:22 UTC 2018


Reviewed-by: Ronnie Sahlberg <lsahlber at redhat.com>
On Wed, Oct 31, 2018 at 11:09 AM Steve French via samba-technical
<samba-technical at lists.samba.org> wrote:
>
> ---------- 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



More information about the samba-technical mailing list