xfs: dump corrupt recovered log intent items to dmesg consistently
authorDarrick J. Wong <djwong@kernel.org>
Tue, 25 Oct 2022 22:07:14 +0000 (15:07 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 31 Oct 2022 15:58:20 +0000 (08:58 -0700)
If log recovery decides that an intent item is corrupt and wants to
abort the mount, capture a hexdump of the corrupt log item in the kernel
log for further analysis.  Some of the log item code already did this,
so we're fixing the rest to do it consistently.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
fs/xfs/xfs_attr_item.c
fs/xfs/xfs_bmap_item.c
fs/xfs/xfs_extfree_item.c
fs/xfs/xfs_refcount_item.c
fs/xfs/xfs_rmap_item.c

index ee8f678a10a175b4c25de66a268571ee6f40cc65..2788a6f2edcdb82b1765af1a7a939ac2420e8c71 100644 (file)
@@ -717,31 +717,37 @@ xlog_recover_attri_commit_pass2(
        /* Validate xfs_attri_log_format before the large memory allocation */
        len = sizeof(struct xfs_attri_log_format);
        if (item->ri_buf[0].i_len != len) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
        if (!xfs_attri_validate(mp, attri_formatp)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
        /* Validate the attr name */
        if (item->ri_buf[1].i_len !=
                        xlog_calc_iovec_len(attri_formatp->alfi_name_len)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
        if (!xfs_attr_namecheck(attr_name, attri_formatp->alfi_name_len)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[1].i_addr, item->ri_buf[1].i_len);
                return -EFSCORRUPTED;
        }
 
        /* Validate the attr value, if present */
        if (attri_formatp->alfi_value_len != 0) {
                if (item->ri_buf[2].i_len != xlog_calc_iovec_len(attri_formatp->alfi_value_len)) {
-                       XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
+                       XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                                       item->ri_buf[0].i_addr,
+                                       item->ri_buf[0].i_len);
                        return -EFSCORRUPTED;
                }
 
@@ -834,7 +840,8 @@ xlog_recover_attrd_commit_pass2(
 
        attrd_formatp = item->ri_buf[0].i_addr;
        if (item->ri_buf[0].i_len != sizeof(struct xfs_attrd_log_format)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
index a1da6205252ba966a98686e572c22497522495c5..41323da523d1a392c84f391aec41a83c4a659b68 100644 (file)
@@ -644,18 +644,21 @@ xlog_recover_bui_commit_pass2(
        bui_formatp = item->ri_buf[0].i_addr;
 
        if (item->ri_buf[0].i_len < xfs_bui_log_format_sizeof(0)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
        if (bui_formatp->bui_nextents != XFS_BUI_MAX_FAST_EXTENTS) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
        len = xfs_bui_log_format_sizeof(bui_formatp->bui_nextents);
        if (item->ri_buf[0].i_len != len) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
@@ -694,7 +697,8 @@ xlog_recover_bud_commit_pass2(
 
        bud_formatp = item->ri_buf[0].i_addr;
        if (item->ri_buf[0].i_len != sizeof(struct xfs_bud_log_format)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
index 18c2243513434bf5a8a6bf4193618c43178d1c9c..d5130d1fcfaeaf17a61531077512027dc64449ce 100644 (file)
@@ -216,7 +216,8 @@ xfs_efi_copy_format(xfs_log_iovec_t *buf, xfs_efi_log_format_t *dst_efi_fmt)
                }
                return 0;
        }
-       XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL);
+       XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, NULL, buf->i_addr,
+                       buf->i_len);
        return -EFSCORRUPTED;
 }
 
@@ -711,7 +712,8 @@ xlog_recover_efi_commit_pass2(
        efi_formatp = item->ri_buf[0].i_addr;
 
        if (item->ri_buf[0].i_len < xfs_efi_log_format_sizeof(0)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
index 24cf4c64ebaabcf40f8d13f2a9b32397b6e35635..858e3e9eb4a857eca3d06c307d18bee54f4acd68 100644 (file)
@@ -523,7 +523,9 @@ xfs_cui_item_recover(
                        type = refc_type;
                        break;
                default:
-                       XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, mp);
+                       XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                                       &cuip->cui_format,
+                                       sizeof(cuip->cui_format));
                        error = -EFSCORRUPTED;
                        goto abort_error;
                }
@@ -536,7 +538,8 @@ xfs_cui_item_recover(
                                &new_fsb, &new_len, &rcur);
                if (error == -EFSCORRUPTED)
                        XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
-                                       refc, sizeof(*refc));
+                                       &cuip->cui_format,
+                                       sizeof(cuip->cui_format));
                if (error)
                        goto abort_error;
 
@@ -658,13 +661,15 @@ xlog_recover_cui_commit_pass2(
        cui_formatp = item->ri_buf[0].i_addr;
 
        if (item->ri_buf[0].i_len < xfs_cui_log_format_sizeof(0)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
        len = xfs_cui_log_format_sizeof(cui_formatp->cui_nextents);
        if (item->ri_buf[0].i_len != len) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
@@ -703,7 +708,8 @@ xlog_recover_cud_commit_pass2(
 
        cud_formatp = item->ri_buf[0].i_addr;
        if (item->ri_buf[0].i_len != sizeof(struct xfs_cud_log_format)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, log->l_mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
index 5a360c384ea5c32cb92a913407d404213fdb27d7..534504ede1a338cc2bcf59418c292970979c98bc 100644 (file)
@@ -557,7 +557,9 @@ xfs_rui_item_recover(
                        type = XFS_RMAP_FREE;
                        break;
                default:
-                       XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, NULL);
+                       XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                                       &ruip->rui_format,
+                                       sizeof(ruip->rui_format));
                        error = -EFSCORRUPTED;
                        goto abort_error;
                }
@@ -663,13 +665,15 @@ xlog_recover_rui_commit_pass2(
        rui_formatp = item->ri_buf[0].i_addr;
 
        if (item->ri_buf[0].i_len < xfs_rui_log_format_sizeof(0)) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }
 
        len = xfs_rui_log_format_sizeof(rui_formatp->rui_nextents);
        if (item->ri_buf[0].i_len != len) {
-               XFS_ERROR_REPORT(__func__, XFS_ERRLEVEL_LOW, log->l_mp);
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                               item->ri_buf[0].i_addr, item->ri_buf[0].i_len);
                return -EFSCORRUPTED;
        }