xfs: add error injection to test file mapping exchange recovery
authorDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:54:19 +0000 (14:54 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Mon, 15 Apr 2024 21:54:19 +0000 (14:54 -0700)
Add an errortag so that we can test recovery of exchmaps log items.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Christoph Hellwig <hch@lst.de>
fs/xfs/libxfs/xfs_errortag.h
fs/xfs/libxfs/xfs_exchmaps.c
fs/xfs/xfs_error.c

index 01a9e86b303790f82d7fce5525ef40085a4b2bb2..7002d7676a7884dc185877b7fe7a293f9446a3f4 100644 (file)
@@ -63,7 +63,8 @@
 #define XFS_ERRTAG_ATTR_LEAF_TO_NODE                   41
 #define XFS_ERRTAG_WB_DELAY_MS                         42
 #define XFS_ERRTAG_WRITE_DELAY_MS                      43
-#define XFS_ERRTAG_MAX                                 44
+#define XFS_ERRTAG_EXCHMAPS_FINISH_ONE                 44
+#define XFS_ERRTAG_MAX                                 45
 
 /*
  * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
 #define XFS_RANDOM_ATTR_LEAF_TO_NODE                   1
 #define XFS_RANDOM_WB_DELAY_MS                         3000
 #define XFS_RANDOM_WRITE_DELAY_MS                      3000
+#define XFS_RANDOM_EXCHMAPS_FINISH_ONE                 1
 
 #endif /* __XFS_ERRORTAG_H_ */
index b8e9450cc175f0b858d567e5c35b36d8b2e65581..3b1f29e95fea677b0962ae0c69a31f4cefcd46c1 100644 (file)
@@ -437,6 +437,9 @@ xfs_exchmaps_finish_one(
                        return error;
        }
 
+       if (XFS_TEST_ERROR(false, tp->t_mountp, XFS_ERRTAG_EXCHMAPS_FINISH_ONE))
+               return -EIO;
+
        /* If we still have work to do, ask for a new transaction. */
        if (xmi_has_more_exchange_work(xmi) || xmi_has_postop_work(xmi)) {
                trace_xfs_exchmaps_defer(tp->t_mountp, xmi);
index 7ad0e92c6b5b877d4f139f9d25b704e958a21900..78cdc5064a8c47f22896557573941dc6af2f25c0 100644 (file)
@@ -62,6 +62,7 @@ static unsigned int xfs_errortag_random_default[] = {
        XFS_RANDOM_ATTR_LEAF_TO_NODE,
        XFS_RANDOM_WB_DELAY_MS,
        XFS_RANDOM_WRITE_DELAY_MS,
+       XFS_RANDOM_EXCHMAPS_FINISH_ONE,
 };
 
 struct xfs_errortag_attr {
@@ -179,6 +180,7 @@ XFS_ERRORTAG_ATTR_RW(da_leaf_split, XFS_ERRTAG_DA_LEAF_SPLIT);
 XFS_ERRORTAG_ATTR_RW(attr_leaf_to_node,        XFS_ERRTAG_ATTR_LEAF_TO_NODE);
 XFS_ERRORTAG_ATTR_RW(wb_delay_ms,      XFS_ERRTAG_WB_DELAY_MS);
 XFS_ERRORTAG_ATTR_RW(write_delay_ms,   XFS_ERRTAG_WRITE_DELAY_MS);
+XFS_ERRORTAG_ATTR_RW(exchmaps_finish_one, XFS_ERRTAG_EXCHMAPS_FINISH_ONE);
 
 static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(noerror),
@@ -224,6 +226,7 @@ static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(attr_leaf_to_node),
        XFS_ERRORTAG_ATTR_LIST(wb_delay_ms),
        XFS_ERRORTAG_ATTR_LIST(write_delay_ms),
+       XFS_ERRORTAG_ATTR_LIST(exchmaps_finish_one),
        NULL,
 };
 ATTRIBUTE_GROUPS(xfs_errortag);