xfs: add leaf to node error tag
authorAllison Henderson <allison.henderson@oracle.com>
Wed, 11 May 2022 07:01:23 +0000 (17:01 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 11 May 2022 07:01:23 +0000 (17:01 +1000)
Add an error tag on xfs_attr3_leaf_to_node to test log attribute
recovery and replay.

Signed-off-by: Catherine Hoang <catherine.hoang@oracle.com>
Reviewed-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Reviewed-by: Chandan Babu R <chandan.babu@oracle.com>
Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_attr_leaf.c
fs/xfs/libxfs/xfs_errortag.h
fs/xfs/xfs_error.c

index 74b76b09509f0de062147f7e6373c6915cec014e..e90bfd9d7551909f8b613ebd790771ced4751a7f 100644 (file)
@@ -28,6 +28,7 @@
 #include "xfs_dir2.h"
 #include "xfs_log.h"
 #include "xfs_ag.h"
+#include "xfs_errortag.h"
 
 
 /*
@@ -1189,6 +1190,11 @@ xfs_attr3_leaf_to_node(
 
        trace_xfs_attr_leaf_to_node(args);
 
+       if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_ATTR_LEAF_TO_NODE)) {
+               error = -EIO;
+               goto out;
+       }
+
        error = xfs_da_grow_inode(args, &blkno);
        if (error)
                goto out;
index 6d06a502bbdfdfe1a1b6755917a5d503a5376376..5362908164b0b1262f31fd83c4dc0c2538363d60 100644 (file)
@@ -61,7 +61,8 @@
 #define XFS_ERRTAG_AG_RESV_FAIL                                38
 #define XFS_ERRTAG_LARP                                        39
 #define XFS_ERRTAG_DA_LEAF_SPLIT                       40
-#define XFS_ERRTAG_MAX                                 41
+#define XFS_ERRTAG_ATTR_LEAF_TO_NODE                   41
+#define XFS_ERRTAG_MAX                                 42
 
 /*
  * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
 #define XFS_RANDOM_AG_RESV_FAIL                                1
 #define XFS_RANDOM_LARP                                        1
 #define XFS_RANDOM_DA_LEAF_SPLIT                       1
+#define XFS_RANDOM_ATTR_LEAF_TO_NODE                   1
 
 #endif /* __XFS_ERRORTAG_H_ */
index 2aa5d4d2b30a648356af4b9ffafd8dac1e4be7d3..296faa41d81d51ee4d0ebdad3fefbf5d671f92ec 100644 (file)
@@ -59,6 +59,7 @@ static unsigned int xfs_errortag_random_default[] = {
        XFS_RANDOM_AG_RESV_FAIL,
        XFS_RANDOM_LARP,
        XFS_RANDOM_DA_LEAF_SPLIT,
+       XFS_RANDOM_ATTR_LEAF_TO_NODE,
 };
 
 struct xfs_errortag_attr {
@@ -174,6 +175,7 @@ XFS_ERRORTAG_ATTR_RW(bmap_alloc_minlen_extent,      XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTE
 XFS_ERRORTAG_ATTR_RW(ag_resv_fail, XFS_ERRTAG_AG_RESV_FAIL);
 XFS_ERRORTAG_ATTR_RW(larp,             XFS_ERRTAG_LARP);
 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);
 
 static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(noerror),
@@ -217,6 +219,7 @@ static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(ag_resv_fail),
        XFS_ERRORTAG_ATTR_LIST(larp),
        XFS_ERRORTAG_ATTR_LIST(da_leaf_split),
+       XFS_ERRORTAG_ATTR_LIST(attr_leaf_to_node),
        NULL,
 };
 ATTRIBUTE_GROUPS(xfs_errortag);