xfs: replace log_badcrc_factor knob with error injection tag
authorBrian Foster <bfoster@redhat.com>
Tue, 27 Jun 2017 16:52:32 +0000 (09:52 -0700)
committerDarrick J. Wong <darrick.wong@oracle.com>
Wed, 28 Jun 2017 01:23:21 +0000 (18:23 -0700)
Now that error injection tags support dynamic frequency adjustment,
replace the debug mode sysfs knob that controls log record CRC error
injection with an error injection tag.

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>
fs/xfs/xfs_error.c
fs/xfs/xfs_error.h
fs/xfs/xfs_log.c
fs/xfs/xfs_sysfs.c

index a2f23d2bab1681d75b47e74c0af19e24fcf37a30..26c32bc5cd34f2ebb15fd06aeb730643ce579fc4 100644 (file)
@@ -56,6 +56,7 @@ static unsigned int xfs_errortag_random_default[] = {
        XFS_RANDOM_BMAP_FINISH_ONE,
        XFS_RANDOM_AG_RESV_CRITICAL,
        XFS_RANDOM_DROP_WRITES,
+       XFS_RANDOM_LOG_BAD_CRC,
 };
 
 struct xfs_errortag_attr {
@@ -159,6 +160,7 @@ 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);
+XFS_ERRORTAG_ATTR_RW(log_bad_crc,      XFS_ERRTAG_LOG_BAD_CRC);
 
 static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(noerror),
@@ -190,6 +192,7 @@ static struct attribute *xfs_errortag_attrs[] = {
        XFS_ERRORTAG_ATTR_LIST(bmap_finish_one),
        XFS_ERRORTAG_ATTR_LIST(ag_resv_critical),
        XFS_ERRORTAG_ATTR_LIST(drop_writes),
+       XFS_ERRORTAG_ATTR_LIST(log_bad_crc),
        NULL,
 };
 
index e0e4cf776fac8677b728a90f3262753db7d5263f..7577be5f09bc04fa6522baaccf8de6af879efd77 100644 (file)
@@ -105,7 +105,8 @@ extern void xfs_verifier_error(struct xfs_buf *bp);
  * handling sequence.
  */
 #define XFS_ERRTAG_DROP_WRITES                         28
-#define XFS_ERRTAG_MAX                                 29
+#define XFS_ERRTAG_LOG_BAD_CRC                         29
+#define XFS_ERRTAG_MAX                                 30
 
 /*
  * Random factors for above tags, 1 means always, 2 means 1/2 time, etc.
@@ -139,6 +140,7 @@ extern void xfs_verifier_error(struct xfs_buf *bp);
 #define XFS_RANDOM_BMAP_FINISH_ONE                     1
 #define XFS_RANDOM_AG_RESV_CRITICAL                    4
 #define XFS_RANDOM_DROP_WRITES                         1
+#define XFS_RANDOM_LOG_BAD_CRC                         1
 
 #ifdef DEBUG
 extern int xfs_errortag_init(struct xfs_mount *mp);
index 2d1112ee1f860aaa1f3130256d91a28ae7482964..31f11be42f01be96c30b5818d5581418c80a6aa4 100644 (file)
@@ -1841,7 +1841,6 @@ xlog_sync(
        /* calculcate the checksum */
        iclog->ic_header.h_crc = xlog_cksum(log, &iclog->ic_header,
                                            iclog->ic_datap, size);
-#ifdef DEBUG
        /*
         * Intentionally corrupt the log record CRC based on the error injection
         * frequency, if defined. This facilitates testing log recovery in the
@@ -1849,15 +1848,13 @@ xlog_sync(
         * write on I/O completion and shutdown the fs. The subsequent mount
         * detects the bad CRC and attempts to recover.
         */
-       if (log->l_badcrc_factor &&
-           (prandom_u32() % log->l_badcrc_factor == 0)) {
+       if (XFS_TEST_ERROR(false, log->l_mp, XFS_ERRTAG_LOG_BAD_CRC)) {
                iclog->ic_header.h_crc &= cpu_to_le32(0xAAAAAAAA);
                iclog->ic_state |= XLOG_STATE_IOABORT;
                xfs_warn(log->l_mp,
        "Intentionally corrupted log record at LSN 0x%llx. Shutdown imminent.",
                         be64_to_cpu(iclog->ic_header.h_lsn));
        }
-#endif
 
        bp->b_io_length = BTOBB(count);
        bp->b_fspriv = iclog;
index 56610a97359311b2308059d04e057ddf702c6872..8b2ccc234f36cd8929fe570cd5fb066f595e96a4 100644 (file)
@@ -305,47 +305,11 @@ write_grant_head_show(
 }
 XFS_SYSFS_ATTR_RO(write_grant_head);
 
-#ifdef DEBUG
-STATIC ssize_t
-log_badcrc_factor_store(
-       struct kobject  *kobject,
-       const char      *buf,
-       size_t          count)
-{
-       struct xlog     *log = to_xlog(kobject);
-       int             ret;
-       uint32_t        val;
-
-       ret = kstrtouint(buf, 0, &val);
-       if (ret)
-               return ret;
-
-       log->l_badcrc_factor = val;
-
-       return count;
-}
-
-STATIC ssize_t
-log_badcrc_factor_show(
-       struct kobject  *kobject,
-       char            *buf)
-{
-       struct xlog     *log = to_xlog(kobject);
-
-       return snprintf(buf, PAGE_SIZE, "%d\n", log->l_badcrc_factor);
-}
-
-XFS_SYSFS_ATTR_RW(log_badcrc_factor);
-#endif /* DEBUG */
-
 static struct attribute *xfs_log_attrs[] = {
        ATTR_LIST(log_head_lsn),
        ATTR_LIST(log_tail_lsn),
        ATTR_LIST(reserve_grant_head),
        ATTR_LIST(write_grant_head),
-#ifdef DEBUG
-       ATTR_LIST(log_badcrc_factor),
-#endif
        NULL,
 };