#define                XFS_PTAG_FSBLOCK_ZERO           0x00000080
 #define                XFS_PTAG_VERIFIER_ERROR         0x00000100
 
+#define XFS_PTAG_STRINGS \
+       { XFS_NO_PTAG,                  "none" }, \
+       { XFS_PTAG_IFLUSH,              "iflush" }, \
+       { XFS_PTAG_LOGRES,              "logres" }, \
+       { XFS_PTAG_AILDELETE,           "aildelete" }, \
+       { XFS_PTAG_ERROR_REPORT ,       "error_report" }, \
+       { XFS_PTAG_SHUTDOWN_CORRUPT,    "corrupt" }, \
+       { XFS_PTAG_SHUTDOWN_IOERROR,    "ioerror" }, \
+       { XFS_PTAG_SHUTDOWN_LOGERROR,   "logerror" }, \
+       { XFS_PTAG_FSBLOCK_ZERO,        "fsb_zero" }, \
+       { XFS_PTAG_VERIFIER_ERROR,      "verifier" }
+
 #endif /* __XFS_ERROR_H__ */
 
 #include "xfs_log.h"
 #include "xfs_ag.h"
 #include "xfs_ag_resv.h"
+#include "xfs_trace.h"
 
 /*
  * Write new AG headers to disk. Non-transactional, but need to be
                why = "Metadata I/O Error";
        }
 
+       trace_xfs_force_shutdown(mp, tag, flags, fname, lnnum);
+
        xfs_alert_tag(mp, tag,
 "%s (0x%x) detected at %pS (%s:%d).  Shutting down filesystem.",
                        why, flags, __return_address, fname, lnnum);
 
 #define SHUTDOWN_FORCE_UMOUNT  0x0004  /* shutdown from a forced unmount */
 #define SHUTDOWN_CORRUPT_INCORE        0x0008  /* corrupt in-memory data structures */
 
+#define XFS_SHUTDOWN_STRINGS \
+       { SHUTDOWN_META_IO_ERROR,       "metadata_io" }, \
+       { SHUTDOWN_LOG_IO_ERROR,        "log_io" }, \
+       { SHUTDOWN_FORCE_UMOUNT,        "force_umount" }, \
+       { SHUTDOWN_CORRUPT_INCORE,      "corruption" }
+
 /*
  * Flags for xfs_mountfs
  */
 
 #include "xfs_icache.h"
 #include "xfs_ag.h"
 #include "xfs_ag_resv.h"
+#include "xfs_error.h"
 
 /*
  * We include this last to have the helpers above available for the trace
 
 DEFINE_DAS_STATE_EVENT(xfs_attr_node_addname_return);
 DEFINE_DAS_STATE_EVENT(xfs_attr_remove_iter_return);
 DEFINE_DAS_STATE_EVENT(xfs_attr_rmtval_remove_return);
+
+TRACE_EVENT(xfs_force_shutdown,
+       TP_PROTO(struct xfs_mount *mp, int ptag, int flags, const char *fname,
+                int line_num),
+       TP_ARGS(mp, ptag, flags, fname, line_num),
+       TP_STRUCT__entry(
+               __field(dev_t, dev)
+               __field(int, ptag)
+               __field(int, flags)
+               __string(fname, fname)
+               __field(int, line_num)
+       ),
+       TP_fast_assign(
+               __entry->dev = mp->m_super->s_dev;
+               __entry->ptag = ptag;
+               __entry->flags = flags;
+               __assign_str(fname, fname);
+               __entry->line_num = line_num;
+       ),
+       TP_printk("dev %d:%d tag %s flags %s file %s line_num %d",
+                 MAJOR(__entry->dev), MINOR(__entry->dev),
+               __print_flags(__entry->ptag, "|", XFS_PTAG_STRINGS),
+               __print_flags(__entry->flags, "|", XFS_SHUTDOWN_STRINGS),
+               __get_str(fname),
+               __entry->line_num)
+);
+
 #endif /* _TRACE_XFS_H */
 
 #undef TRACE_INCLUDE_PATH