xfs: add error injection for per-AG resv failure
authorGao Xiang <hsiangkao@redhat.com>
Wed, 24 Mar 2021 02:05:39 +0000 (19:05 -0700)
committerDarrick J. Wong <djwong@kernel.org>
Thu, 25 Mar 2021 23:47:53 +0000 (16:47 -0700)
per-AG resv failure after fixing up freespace is hard to test in an
effective way, so directly add an error injection path to observe
such error handling path works as expected.

Signed-off-by: Gao Xiang <hsiangkao@redhat.com>
Reviewed-by: Darrick J. Wong <djwong@kernel.org>
Signed-off-by: Darrick J. Wong <djwong@kernel.org>
fs/xfs/libxfs/xfs_ag_resv.c
fs/xfs/libxfs/xfs_errortag.h
fs/xfs/xfs_error.c

index fdfe6dc0d3079a7dcd4aa0d090e9a11677d0e3bf..6c5f8d10589c85ce72bda0703868705228e0c2a4 100644 (file)
@@ -211,7 +211,11 @@ __xfs_ag_resv_init(
                ASSERT(0);
                return -EINVAL;
        }
-       error = xfs_mod_fdblocks(mp, -(int64_t)hidden_space, true);
+
+       if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_AG_RESV_FAIL))
+               error = -ENOSPC;
+       else
+               error = xfs_mod_fdblocks(mp, -(int64_t)hidden_space, true);
        if (error) {
                trace_xfs_ag_resv_init_error(pag->pag_mount, pag->pag_agno,
                                error, _RET_IP_);
index 6ca9084b6934effa27a5ad1d7d7ccf42aad42193..a23a52e643ad19a5c665c004b8350385b67ce847 100644 (file)
@@ -58,7 +58,8 @@
 #define XFS_ERRTAG_BUF_IOERROR                         35
 #define XFS_ERRTAG_REDUCE_MAX_IEXTENTS                 36
 #define XFS_ERRTAG_BMAP_ALLOC_MINLEN_EXTENT            37
-#define XFS_ERRTAG_MAX                                 38
+#define XFS_ERRTAG_AG_RESV_FAIL                                38
+#define XFS_ERRTAG_MAX                                 39
 
 /*
  * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
 #define XFS_RANDOM_BUF_IOERROR                         XFS_RANDOM_DEFAULT
 #define XFS_RANDOM_REDUCE_MAX_IEXTENTS                 1
 #define XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT            1
+#define XFS_RANDOM_AG_RESV_FAIL                                1
 
 #endif /* __XFS_ERRORTAG_H_ */
index 4d6509a61d1126df328db427759d33114accc4ef..ce3bc1b291a1651c6a87fc9dd7f92da172d1ff82 100644 (file)
@@ -56,6 +56,7 @@ static unsigned int xfs_errortag_random_default[] = {
        XFS_RANDOM_BUF_IOERROR,
        XFS_RANDOM_REDUCE_MAX_IEXTENTS,
        XFS_RANDOM_BMAP_ALLOC_MINLEN_EXTENT,
+       XFS_RANDOM_AG_RESV_FAIL,
 };
 
 struct xfs_errortag_attr {
@@ -168,6 +169,7 @@ XFS_ERRORTAG_ATTR_RW(iunlink_fallback,      XFS_ERRTAG_IUNLINK_FALLBACK);
 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);
 
 static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(noerror),
@@ -208,6 +210,7 @@ static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(buf_ioerror),
        XFS_ERRORTAG_ATTR_LIST(reduce_max_iextents),
        XFS_ERRORTAG_ATTR_LIST(bmap_alloc_minlen_extent),
+       XFS_ERRORTAG_ATTR_LIST(ag_resv_fail),
        NULL,
 };