xfs: dump log intent items that cannot be recovered due to corruption
authorDarrick J. Wong <djwong@kernel.org>
Fri, 6 Aug 2021 18:06:35 +0000 (11:06 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 9 Aug 2021 18:13:17 +0000 (11:13 -0700)
If we try to recover a log intent item and the operation fails due to
filesystem corruption, dump the contents of the item to the log for
further analysis.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Reviewed-by: Christoph Hellwig <hch@lst.de>
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 e3a6919..3d6f70d 100644 (file)
@@ -522,6 +522,9 @@ xfs_bui_item_recover(
        error = xfs_trans_log_finish_bmap_update(tp, budp, bui_type, ip,
                        whichfork, bmap->me_startoff, bmap->me_startblock,
                        &count, state);
+       if (error == -EFSCORRUPTED)
+               XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp, bmap,
+                               sizeof(*bmap));
        if (error)
                goto err_cancel;
 
index 2424230..3f8a071 100644 (file)
@@ -629,6 +629,9 @@ xfs_efi_item_recover(
                error = xfs_trans_free_extent(tp, efdp, extp->ext_start,
                                              extp->ext_len,
                                              &XFS_RMAP_OINFO_ANY_OWNER, false);
+               if (error == -EFSCORRUPTED)
+                       XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                                       extp, sizeof(*extp));
                if (error)
                        goto abort_error;
 
index 746f4ed..1636152 100644 (file)
@@ -522,6 +522,9 @@ xfs_cui_item_recover(
                        error = xfs_trans_log_finish_refcount_update(tp, cudp,
                                type, refc->pe_startblock, refc->pe_len,
                                &new_fsb, &new_len, &rcur);
+               if (error == -EFSCORRUPTED)
+                       XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                                       refc, sizeof(*refc));
                if (error)
                        goto abort_error;
 
index dc4f0c9..9b91a78 100644 (file)
@@ -578,6 +578,9 @@ xfs_rui_item_recover(
                                rmap->me_owner, whichfork,
                                rmap->me_startoff, rmap->me_startblock,
                                rmap->me_len, state, &rcur);
+               if (error == -EFSCORRUPTED)
+                       XFS_CORRUPTION_ERROR(__func__, XFS_ERRLEVEL_LOW, mp,
+                                       rmap, sizeof(*rmap));
                if (error)
                        goto abort_error;