Home Home > GIT Browse > SLE15
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Iliopoulos <ailiopoulos@suse.com>2019-05-18 01:25:07 +0200
committerAnthony Iliopoulos <ailiopoulos@suse.com>2019-05-18 01:25:07 +0200
commit50a1a918e945ed8d3ad5eefb53ffe6dcfeea467c (patch)
tree229d263267375198e4d899a9d8646f9f90ba250f
parent71829d5e5c30ac797b6f070a960029a637bbd4cd (diff)
xfs: add log item pinning error injection tag (bsc#1114427).
-rw-r--r--patches.fixes/xfs-add-log-item-pinning-error-injection-tag.patch120
-rw-r--r--series.conf1
2 files changed, 121 insertions, 0 deletions
diff --git a/patches.fixes/xfs-add-log-item-pinning-error-injection-tag.patch b/patches.fixes/xfs-add-log-item-pinning-error-injection-tag.patch
new file mode 100644
index 0000000000..47768954c7
--- /dev/null
+++ b/patches.fixes/xfs-add-log-item-pinning-error-injection-tag.patch
@@ -0,0 +1,120 @@
+From 7f4d01f36a3ac16f539f0fd3839de5d58fa4940f Mon Sep 17 00:00:00 2001
+From: Brian Foster <bfoster@redhat.com>
+Date: Tue, 8 Aug 2017 18:21:52 -0700
+Subject: [PATCH] xfs: add log item pinning error injection tag
+Git-commit: 7f4d01f36a3ac16f539f0fd3839de5d58fa4940f
+Patch-mainline: v4.14-rc1
+References: bsc#1114427
+
+Add an error injection tag to force log items in the AIL to the
+pinned state. This option can be used by test infrastructure to
+induce head behind tail conditions. Specifically, this is intended
+to be used by xfstests to reproduce log recovery problems after
+failed/corrupted log writes overwrite the last good tail LSN in the
+log.
+
+When enabled, AIL push attempts see log items in the AIL in the
+pinned state. This stalls metadata writeback and thus prevents the
+current tail of the log from moving forward. When disabled,
+subsequent AIL pushes observe the log items in their appropriate
+state and filesystem operation continues as normal.
+
+Signed-off-by: Brian Foster <bfoster@redhat.com>
+Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
+Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
+Acked-by: Anthony Iliopoulos <ailiopoulos@suse.com>
+
+---
+ fs/xfs/xfs_error.c | 3 +++
+ fs/xfs/xfs_error.h | 4 +++-
+ fs/xfs/xfs_trans_ail.c | 17 ++++++++++++++++-
+ 3 files changed, 22 insertions(+), 2 deletions(-)
+
+diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c
+index 2f4feb959bfb..bd786a9ac2c3 100644
+--- a/fs/xfs/xfs_error.c
++++ b/fs/xfs/xfs_error.c
+@@ -57,6 +57,7 @@ static unsigned int xfs_errortag_random_default[] = {
+ XFS_RANDOM_AG_RESV_CRITICAL,
+ XFS_RANDOM_DROP_WRITES,
+ XFS_RANDOM_LOG_BAD_CRC,
++ XFS_RANDOM_LOG_ITEM_PIN,
+ };
+
+ struct xfs_errortag_attr {
+@@ -161,6 +162,7 @@ XFS_ERRORTAG_ATTR_RW(bmap_finish_one, XFS_ERRTAG_BMAP_FINISH_ONE);
+ XFS_ERRORTAG_ATTR_RW(ag_resv_critical, XFS_ERRTAG_AG_RESV_CRITICAL);
+ XFS_ERRORTAG_ATTR_RW(drop_writes, XFS_ERRTAG_DROP_WRITES);
+ XFS_ERRORTAG_ATTR_RW(log_bad_crc, XFS_ERRTAG_LOG_BAD_CRC);
++XFS_ERRORTAG_ATTR_RW(log_item_pin, XFS_ERRTAG_LOG_ITEM_PIN);
+
+ static struct attribute *xfs_errortag_attrs[] = {
+ XFS_ERRORTAG_ATTR_LIST(noerror),
+@@ -193,6 +195,7 @@ static struct attribute *xfs_errortag_attrs[] = {
+ XFS_ERRORTAG_ATTR_LIST(ag_resv_critical),
+ XFS_ERRORTAG_ATTR_LIST(drop_writes),
+ XFS_ERRORTAG_ATTR_LIST(log_bad_crc),
++ XFS_ERRORTAG_ATTR_LIST(log_item_pin),
+ NULL,
+ };
+
+diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h
+index 7577be5f09bc..7c4bef3bddb7 100644
+--- a/fs/xfs/xfs_error.h
++++ b/fs/xfs/xfs_error.h
+@@ -106,7 +106,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp);
+ */
+ #define XFS_ERRTAG_DROP_WRITES 28
+ #define XFS_ERRTAG_LOG_BAD_CRC 29
+-#define XFS_ERRTAG_MAX 30
++#define XFS_ERRTAG_LOG_ITEM_PIN 30
++#define XFS_ERRTAG_MAX 31
+
+ /*
+ * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
+@@ -141,6 +142,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp);
+ #define XFS_RANDOM_AG_RESV_CRITICAL 4
+ #define XFS_RANDOM_DROP_WRITES 1
+ #define XFS_RANDOM_LOG_BAD_CRC 1
++#define XFS_RANDOM_LOG_ITEM_PIN 1
+
+ #ifdef DEBUG
+ extern int xfs_errortag_init(struct xfs_mount *mp);
+diff --git a/fs/xfs/xfs_trans_ail.c b/fs/xfs/xfs_trans_ail.c
+index 70f5ab017323..354368a906e5 100644
+--- a/fs/xfs/xfs_trans_ail.c
++++ b/fs/xfs/xfs_trans_ail.c
+@@ -325,6 +325,21 @@ xfs_ail_delete(
+ xfs_trans_ail_cursor_clear(ailp, lip);
+ }
+
++static inline uint
++xfsaild_push_item(
++ struct xfs_ail *ailp,
++ struct xfs_log_item *lip)
++{
++ /*
++ * If log item pinning is enabled, skip the push and track the item as
++ * pinned. This can help induce head-behind-tail conditions.
++ */
++ if (XFS_TEST_ERROR(false, ailp->xa_mount, XFS_ERRTAG_LOG_ITEM_PIN))
++ return XFS_ITEM_PINNED;
++
++ return lip->li_ops->iop_push(lip, &ailp->xa_buf_list);
++}
++
+ static long
+ xfsaild_push(
+ struct xfs_ail *ailp)
+@@ -382,7 +397,7 @@ xfsaild_push(
+ * rely on the AIL cursor implementation to be able to deal with
+ * the dropped lock.
+ */
+- lock_result = lip->li_ops->iop_push(lip, &ailp->xa_buf_list);
++ lock_result = xfsaild_push_item(ailp, lip);
+ switch (lock_result) {
+ case XFS_ITEM_SUCCESS:
+ XFS_STATS_INC(mp, xs_push_ail_success);
+--
+2.16.4
+
diff --git a/series.conf b/series.conf
index c972090291..c759bffc80 100644
--- a/series.conf
+++ b/series.conf
@@ -5554,6 +5554,7 @@
patches.fixes/xfs-fix-recovery-failure-when-log-record-header-wrap.patch
patches.fixes/xfs-always-verify-the-log-tail-during-recovery.patch
patches.fixes/xfs-fix-log-recovery-corruption-error-due-to-tail-ov.patch
+ patches.fixes/xfs-add-log-item-pinning-error-injection-tag.patch
patches.fixes/xfs-handle-EFSCORRUPTED-during-head-tail-verificatio.patch
patches.fixes/xfs-stop-searching-for-free-slots-in-an-inode-chunk-.patch
patches.fixes/xfs-evict-all-inodes-involved-with-log-redo-item.patch