static int cifs_shutdown(struct super_block *sb, unsigned long arg)
 {
        struct cifs_sb_info *sbi = CIFS_SB(sb);
+       struct tcon_link *tlink;
+       struct cifs_tcon *tcon;
        __u32 flags;
+       int rc;
 
        if (!capable(CAP_SYS_ADMIN))
                return -EPERM;
        if (get_user(flags, (__u32 __user *)arg))
                return -EFAULT;
 
-       if (flags > CIFS_GOING_FLAGS_NOLOGFLUSH)
-               return -EINVAL;
+       tlink = cifs_sb_tlink(sbi);
+       if (IS_ERR(tlink))
+               return PTR_ERR(tlink);
+       tcon = tlink_tcon(tlink);
+
+       trace_smb3_shutdown_enter(flags, tcon->tid);
+       if (flags > CIFS_GOING_FLAGS_NOLOGFLUSH) {
+               rc = -EINVAL;
+               goto shutdown_out_err;
+       }
 
        if (cifs_forced_shutdown(sbi))
-               return 0;
+               goto shutdown_good;
 
        cifs_dbg(VFS, "shut down requested (%d)", flags);
-/*     trace_cifs_shutdown(sb, flags);*/
 
        /*
         * see:
         */
        case CIFS_GOING_FLAGS_DEFAULT:
                cifs_dbg(FYI, "shutdown with default flag not supported\n");
-               return -EINVAL;
+               rc = -EINVAL;
+               goto shutdown_out_err;
        /*
         * FLAGS_LOGFLUSH is easy since it asks to write out metadata (not
         * data) but metadata writes are not cached on the client, so can treat
        case CIFS_GOING_FLAGS_LOGFLUSH:
        case CIFS_GOING_FLAGS_NOLOGFLUSH:
                sbi->mnt_cifs_flags |= CIFS_MOUNT_SHUTDOWN;
-               return 0;
+               goto shutdown_good;
        default:
-               return -EINVAL;
+               rc = -EINVAL;
+               goto shutdown_out_err;
        }
+
+shutdown_good:
+       trace_smb3_shutdown_done(flags, tcon->tid);
        return 0;
+shutdown_out_err:
+       trace_smb3_shutdown_err(rc, flags, tcon->tid);
+       return rc;
 }
 
 static int cifs_dump_full_key(struct cifs_tcon *tcon, struct smb3_full_key_debug_info __user *in)
 
                __entry->command = command;
        ),
        TP_printk("xid=%u fid=0x%llx ioctl cmd=0x%x",
-               __entry->xid, __entry->fid, __entry->command)
+                 __entry->xid, __entry->fid, __entry->command)
 )
 
 #define DEFINE_SMB3_IOCTL_EVENT(name)        \
 
 DEFINE_SMB3_IOCTL_EVENT(ioctl);
 
+DECLARE_EVENT_CLASS(smb3_shutdown_class,
+       TP_PROTO(__u32 flags,
+               __u32 tid),
+       TP_ARGS(flags, tid),
+       TP_STRUCT__entry(
+               __field(__u32, flags)
+               __field(__u32, tid)
+       ),
+       TP_fast_assign(
+               __entry->flags = flags;
+               __entry->tid = tid;
+       ),
+       TP_printk("flags=0x%x tid=0x%x",
+                 __entry->flags, __entry->tid)
+)
+
+#define DEFINE_SMB3_SHUTDOWN_EVENT(name)        \
+DEFINE_EVENT(smb3_shutdown_class, smb3_##name,  \
+       TP_PROTO(__u32 flags,                \
+               __u32 tid),                  \
+       TP_ARGS(flags, tid))
+
+DEFINE_SMB3_SHUTDOWN_EVENT(shutdown_enter);
+DEFINE_SMB3_SHUTDOWN_EVENT(shutdown_done);
 
+DECLARE_EVENT_CLASS(smb3_shutdown_err_class,
+       TP_PROTO(int rc,
+               __u32 flags,
+               __u32 tid),
+       TP_ARGS(rc, flags, tid),
+       TP_STRUCT__entry(
+               __field(int, rc)
+               __field(__u32, flags)
+               __field(__u32, tid)
+       ),
+       TP_fast_assign(
+               __entry->rc = rc;
+               __entry->flags = flags;
+               __entry->tid = tid;
+       ),
+       TP_printk("rc=%d flags=0x%x tid=0x%x",
+               __entry->rc, __entry->flags, __entry->tid)
+)
 
+#define DEFINE_SMB3_SHUTDOWN_ERR_EVENT(name)        \
+DEFINE_EVENT(smb3_shutdown_err_class, smb3_##name,  \
+       TP_PROTO(int rc,                     \
+               __u32 flags,                 \
+               __u32 tid),                  \
+       TP_ARGS(rc, flags, tid))
 
+DEFINE_SMB3_SHUTDOWN_ERR_EVENT(shutdown_err);
 
 DECLARE_EVENT_CLASS(smb3_credit_class,
        TP_PROTO(__u64  currmid,