xfs: Add log attribute error tag
authorAllison Henderson <allison.henderson@oracle.com>
Wed, 11 May 2022 07:01:22 +0000 (17:01 +1000)
committerDave Chinner <david@fromorbit.com>
Wed, 11 May 2022 07:01:22 +0000 (17:01 +1000)
This patch adds an error tag that we can use to test log attribute
recovery and replay

Signed-off-by: Allison Henderson <allison.henderson@oracle.com>
Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Chandan Babu R <chandanrlinux@gmail.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
fs/xfs/libxfs/xfs_errortag.h
fs/xfs/xfs_attr_item.c
fs/xfs/xfs_error.c

index a23a52e643ad19a5c665c004b8350385b67ce847..c15d2340220c19e5b107666c34a69a08006931e0 100644 (file)
@@ -59,7 +59,8 @@
 #define XFS_ERRTAG_REDUCE_MAX_IEXTENTS                 36
 #define XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT            37
 #define XFS_ERRTAG_AG_RESV_FAIL                                38
-#define XFS_ERRTAG_MAX                                 39
+#define XFS_ERRTAG_LARP                                        39
+#define XFS_ERRTAG_MAX                                 40
 
 /*
  * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
 #define XFS_RANDOM_REDUCE_MAX_IEXTENTS                 1
 #define XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT            1
 #define XFS_RANDOM_AG_RESV_FAIL                                1
+#define XFS_RANDOM_LARP                                        1
 
 #endif /* __XFS_ERRORTAG_H_ */
index 56bc231822b3fb3ee845fcd58da5c66e0655d395..6d1dcc88abfe1f0920b273bb2ca0a8c5767338e3 100644 (file)
@@ -24,6 +24,7 @@
 #include "xfs_trace.h"
 #include "xfs_inode.h"
 #include "xfs_trans_space.h"
+#include "xfs_errortag.h"
 #include "xfs_error.h"
 #include "xfs_log_priv.h"
 #include "xfs_log_recover.h"
@@ -310,6 +311,11 @@ xfs_xattri_finish_update(
                                             XFS_ATTR_OP_FLAGS_TYPE_MASK;
        int                             error;
 
+       if (XFS_TEST_ERROR(false, args->dp->i_mount, XFS_ERRTAG_LARP)) {
+               error = -EIO;
+               goto out;
+       }
+
        switch (op) {
        case XFS_ATTR_OP_FLAGS_SET:
                error = xfs_attr_set_iter(dac);
@@ -323,6 +329,7 @@ xfs_xattri_finish_update(
                break;
        }
 
+out:
        /*
         * Mark the transaction dirty, even on error. This ensures the
         * transaction is aborted, which:
index 749fd18c4f32673bed66bea05a13ef2cfdea58a6..666f4837b1e168a1c05e8cc023de1f7862075057 100644 (file)
@@ -57,6 +57,7 @@ static unsigned int xfs_errortag_random_default[] = {
        XFS_RANDOM_REDUCE_MAX_IEXTENTS,
        XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT,
        XFS_RANDOM_AG_RESV_FAIL,
+       XFS_RANDOM_LARP,
 };
 
 struct xfs_errortag_attr {
@@ -170,6 +171,7 @@ XFS_ERRORTAG_ATTR_RW(buf_ioerror,   XFS_ERRTAG_BUF_IOERROR);
 XFS_ERRORTAG_ATTR_RW(reduce_max_iextents,      XFS_ERRTAG_REDUCE_MAX_IEXTENTS);
 XFS_ERRORTAG_ATTR_RW(bmap_alloc_minlen_extent, XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT);
 XFS_ERRORTAG_ATTR_RW(ag_resv_fail, XFS_ERRTAG_AG_RESV_FAIL);
+XFS_ERRORTAG_ATTR_RW(larp,             XFS_ERRTAG_LARP);
 
 static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(noerror),
@@ -211,6 +213,7 @@ static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(reduce_max_iextents),
        XFS_ERRORTAG_ATTR_LIST(bmap_alloc_minlen_extent),
        XFS_ERRORTAG_ATTR_LIST(ag_resv_fail),
+       XFS_ERRORTAG_ATTR_LIST(larp),
        NULL,
 };
 ATTRIBUTE_GROUPS(xfs_errortag);