xfs: convert drop_writes to use the errortag mechanism
authorDarrick J. Wong <darrick.wong@oracle.com>
Wed, 21 Jun 2017 00:54:48 +0000 (17:54 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 28 Jun 2017 01:23:20 +0000 (18:23 -0700)
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>
fs/xfs/xfs_error.c
fs/xfs/xfs_error.h
fs/xfs/xfs_iomap.c
fs/xfs/xfs_mount.h
fs/xfs/xfs_sysfs.c

index e2278af6aed1e78a92933f47804603904638c0c2..a2f23d2bab1681d75b47e74c0af19e24fcf37a30 100644 (file)
@@ -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,
 };
 
index ae8935b90a93bebc697866c9f484d37640c8b6ef..e0e4cf776fac8677b728a90f3262753db7d5263f 100644 (file)
@@ -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);
index 304b79d681e41d6518a9a531c980b0beff2a53f8..86f1a9fa46d25969c3f4e66edeba89213b1b49f6 100644 (file)
@@ -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;
        }
index 931e9fc21a1cbcecd81f74f4d34807cd4cacef67..e0792d036be202d18bd479b5c6cfff904f996778 100644 (file)
@@ -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,
index ec6e0e2f95d66dff0d11eced92abf54a1880ff27..56610a97359311b2308059d04e057ddf702c6872 100644 (file)
@@ -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,
 };