[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