Home Home > GIT Browse > SLE12-SP4
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAnthony Iliopoulos <ailiopoulos@suse.com>2019-05-18 01:22:07 +0200
committerAnthony Iliopoulos <ailiopoulos@suse.com>2019-05-18 01:22:07 +0200
commit7756cd38e8b5ef9d9a328d39693f6c8bb7683cbb (patch)
tree4e3201c2e85c50d97cfd79b106f99271467ca563
parent4c318bed347f7f04a4c5afd1ae5562c13b2962ca (diff)
xfs: convert drop_writes to use the errortag mechanism
(bsc#1114427).
-rw-r--r--patches.fixes/xfs-convert-drop_writes-to-use-the-errortag-mechanis.patch194
-rw-r--r--series.conf1
2 files changed, 195 insertions, 0 deletions
diff --git a/patches.fixes/xfs-convert-drop_writes-to-use-the-errortag-mechanis.patch b/patches.fixes/xfs-convert-drop_writes-to-use-the-errortag-mechanis.patch
new file mode 100644
index 0000000000..6381bef09e
--- /dev/null
+++ b/patches.fixes/xfs-convert-drop_writes-to-use-the-errortag-mechanis.patch
@@ -0,0 +1,194 @@
+From f8c47250ba46eb221d1ac537266ac65bcf2866d5 Mon Sep 17 00:00:00 2001
+From: "Darrick J. Wong" <darrick.wong@oracle.com>
+Date: Tue, 20 Jun 2017 17:54:48 -0700
+Subject: [PATCH] xfs: convert drop_writes to use the errortag mechanism
+Git-commit: f8c47250ba46eb221d1ac537266ac65bcf2866d5
+Patch-mainline: v4.13-rc1
+References: bsc#1114427
+
+We now have enhanced error injection that can control the frequency
+with which errors happen, so convert drop_writes to use this.
+
+Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
+Reviewed-by: Brian Foster <bfoster@redhat.com>
+Reviewed-by: Carlos Maiolino <cmaiolino@redhat.com>
+Acked-by: Anthony Iliopoulos <ailiopoulos@suse.com>
+
+---
+ fs/xfs/xfs_error.c | 3 +++
+ fs/xfs/xfs_error.h | 12 +++++++++++-
+ fs/xfs/xfs_iomap.c | 2 +-
+ fs/xfs/xfs_mount.h | 24 ------------------------
+ fs/xfs/xfs_sysfs.c | 42 ------------------------------------------
+ 5 files changed, 15 insertions(+), 68 deletions(-)
+
+diff --git a/fs/xfs/xfs_error.c b/fs/xfs/xfs_error.c
+index e2278af6aed1..a2f23d2bab16 100644
+--- a/fs/xfs/xfs_error.c
++++ b/fs/xfs/xfs_error.c
+@@ -55,6 +55,7 @@ static unsigned int xfs_errortag_random_default[] = {
+ XFS_RANDOM_REFCOUNT_FINISH_ONE,
+ XFS_RANDOM_BMAP_FINISH_ONE,
+ XFS_RANDOM_AG_RESV_CRITICAL,
++ XFS_RANDOM_DROP_WRITES,
+ };
+
+ struct xfs_errortag_attr {
+@@ -157,6 +158,7 @@ XFS_ERRORTAG_ATTR_RW(refcount_continue_update, XFS_ERRTAG_REFCOUNT_CONTINUE_UPDA
+ XFS_ERRORTAG_ATTR_RW(refcount_finish_one, XFS_ERRTAG_REFCOUNT_FINISH_ONE);
+ 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);
+
+ static struct attribute *xfs_errortag_attrs[] = {
+ XFS_ERRORTAG_ATTR_LIST(noerror),
+@@ -187,6 +189,7 @@ static struct attribute *xfs_errortag_attrs[] = {
+ XFS_ERRORTAG_ATTR_LIST(refcount_finish_one),
+ XFS_ERRORTAG_ATTR_LIST(bmap_finish_one),
+ XFS_ERRORTAG_ATTR_LIST(ag_resv_critical),
++ XFS_ERRORTAG_ATTR_LIST(drop_writes),
+ NULL,
+ };
+
+diff --git a/fs/xfs/xfs_error.h b/fs/xfs/xfs_error.h
+index ae8935b90a93..e0e4cf776fac 100644
+--- a/fs/xfs/xfs_error.h
++++ b/fs/xfs/xfs_error.h
+@@ -96,7 +96,16 @@ extern void xfs_verifier_error(struct xfs_buf *bp);
+ #define XFS_ERRTAG_REFCOUNT_FINISH_ONE 25
+ #define XFS_ERRTAG_BMAP_FINISH_ONE 26
+ #define XFS_ERRTAG_AG_RESV_CRITICAL 27
+-#define XFS_ERRTAG_MAX 28
++/*
++ * DEBUG mode instrumentation to test and/or trigger delayed allocation
++ * block killing in the event of failed writes. When enabled, all
++ * buffered writes are silenty dropped and handled as if they failed.
++ * All delalloc blocks in the range of the write (including pre-existing
++ * delalloc blocks!) are tossed as part of the write failure error
++ * handling sequence.
++ */
++#define XFS_ERRTAG_DROP_WRITES 28
++#define XFS_ERRTAG_MAX 29
+
+ /*
+ * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
+@@ -129,6 +138,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp);
+ #define XFS_RANDOM_REFCOUNT_FINISH_ONE 1
+ #define XFS_RANDOM_BMAP_FINISH_ONE 1
+ #define XFS_RANDOM_AG_RESV_CRITICAL 4
++#define XFS_RANDOM_DROP_WRITES 1
+
+ #ifdef DEBUG
+ extern int xfs_errortag_init(struct xfs_mount *mp);
+diff --git a/fs/xfs/xfs_iomap.c b/fs/xfs/xfs_iomap.c
+index 304b79d681e4..86f1a9fa46d2 100644
+--- a/fs/xfs/xfs_iomap.c
++++ b/fs/xfs/xfs_iomap.c
+@@ -1097,7 +1097,7 @@ xfs_file_iomap_end_delalloc(
+ * Behave as if the write failed if drop writes is enabled. Set the NEW
+ * flag to force delalloc cleanup.
+ */
+- if (xfs_mp_drop_writes(mp)) {
++ if (XFS_TEST_ERROR(false, mp, XFS_ERRTAG_DROP_WRITES)) {
+ iomap->flags |= IOMAP_F_NEW;
+ written = 0;
+ }
+diff --git a/fs/xfs/xfs_mount.h b/fs/xfs/xfs_mount.h
+index 931e9fc21a1c..e0792d036be2 100644
+--- a/fs/xfs/xfs_mount.h
++++ b/fs/xfs/xfs_mount.h
+@@ -205,16 +205,6 @@ typedef struct xfs_mount {
+ */
+ unsigned int *m_errortag;
+ struct xfs_kobj m_errortag_kobj;
+-
+- /*
+- * DEBUG mode instrumentation to test and/or trigger delayed allocation
+- * block killing in the event of failed writes. When enabled, all
+- * buffered writes are silenty dropped and handled as if they failed.
+- * All delalloc blocks in the range of the write (including pre-existing
+- * delalloc blocks!) are tossed as part of the write failure error
+- * handling sequence.
+- */
+- bool m_drop_writes;
+ #endif
+ } xfs_mount_t;
+
+@@ -333,20 +323,6 @@ xfs_daddr_to_agbno(struct xfs_mount *mp, xfs_daddr_t d)
+ return (xfs_agblock_t) do_div(ld, mp->m_sb.sb_agblocks);
+ }
+
+-#ifdef DEBUG
+-static inline bool
+-xfs_mp_drop_writes(struct xfs_mount *mp)
+-{
+- return mp->m_drop_writes;
+-}
+-#else
+-static inline bool
+-xfs_mp_drop_writes(struct xfs_mount *mp)
+-{
+- return 0;
+-}
+-#endif
+-
+ /* per-AG block reservation data structures*/
+ enum xfs_ag_resv_type {
+ XFS_AG_RESV_NONE = 0,
+diff --git a/fs/xfs/xfs_sysfs.c b/fs/xfs/xfs_sysfs.c
+index ec6e0e2f95d6..56610a973593 100644
+--- a/fs/xfs/xfs_sysfs.c
++++ b/fs/xfs/xfs_sysfs.c
+@@ -90,49 +90,7 @@ to_mp(struct kobject *kobject)
+ return container_of(kobj, struct xfs_mount, m_kobj);
+ }
+
+-#ifdef DEBUG
+-
+-STATIC ssize_t
+-drop_writes_store(
+- struct kobject *kobject,
+- const char *buf,
+- size_t count)
+-{
+- struct xfs_mount *mp = to_mp(kobject);
+- int ret;
+- int val;
+-
+- ret = kstrtoint(buf, 0, &val);
+- if (ret)
+- return ret;
+-
+- if (val == 1)
+- mp->m_drop_writes = true;
+- else if (val == 0)
+- mp->m_drop_writes = false;
+- else
+- return -EINVAL;
+-
+- return count;
+-}
+-
+-STATIC ssize_t
+-drop_writes_show(
+- struct kobject *kobject,
+- char *buf)
+-{
+- struct xfs_mount *mp = to_mp(kobject);
+-
+- return snprintf(buf, PAGE_SIZE, "%d\n", mp->m_drop_writes ? 1 : 0);
+-}
+-XFS_SYSFS_ATTR_RW(drop_writes);
+-
+-#endif /* DEBUG */
+-
+ static struct attribute *xfs_mp_attrs[] = {
+-#ifdef DEBUG
+- ATTR_LIST(drop_writes),
+-#endif
+ NULL,
+ };
+
+--
+2.16.4
+
diff --git a/series.conf b/series.conf
index 94c5654964..d8e099dd7b 100644
--- a/series.conf
+++ b/series.conf
@@ -3568,6 +3568,7 @@
patches.fixes/xfs-make-errortag-a-per-mountpoint-structure.patch
patches.fixes/xfs-expose-errortag-knobs-via-sysfs.patch
patches.fixes/xfs-remove-unneeded-parameter-from-XFS_TEST_ERROR.patch
+ patches.fixes/xfs-convert-drop_writes-to-use-the-errortag-mechanis.patch
patches.fixes/xfs-rewrite-xfs_dq_get_next_id-using-xfs_iext_lookup.patch
patches.fixes/vfs-Add-page_cache_seek_hole_data-helper.patch
patches.fixes/vfs-Add-iomap_seek_hole-and-iomap_seek_data-helpers.patch