]> git.ipfire.org Git - thirdparty/xfsprogs-dev.git/commitdiff
xfs_db: enable blocktrash for checksummed filesystems
authorDarrick J. Wong <darrick.wong@oracle.com>
Tue, 13 Oct 2015 23:24:47 +0000 (10:24 +1100)
committerDave Chinner <david@fromorbit.com>
Tue, 13 Oct 2015 23:24:47 +0000 (10:24 +1100)
Disable the write verifiers when we're trashing a block.  With this
in place, create a xfs fuzzer script that formats, populates, corrupts,
tries to use, repairs, and tries again to use a crash test xfs image.
Hopefully this will shake out some v5 filesystem bugs.

This allow trashing of log blocks and symlinks, and require the
caller to explicitly ask for trashing of log blocks and super
blocks.  Allowing log blocks by default skews the trashing heavily
in favor of (probably unused) log blocks, which doesn't help us with
fuzzing.  Furthermore, trashing the superblock results in a time
consuming sector by sector superblock hunt.

Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
Reviewed-by: Dave Chinner <dchinner@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
db/check.c

index d28199ddaa2a57638ad7a6c8fa799b8107940ecf..8f3b5b684d4c00da4de0103fcce4d7e0690c8647 100644 (file)
@@ -944,6 +944,7 @@ blocktrash_b(
        int             mask;
        int             newbit;
        int             offset;
+       const struct xfs_buf_ops *stashed_ops;
        static char     *modestr[] = {
                N_("zeroed"), N_("set"), N_("flipped"), N_("randomized")
        };
@@ -952,8 +953,10 @@ blocktrash_b(
        offset = (int)(random() % (int)(mp->m_sb.sb_blocksize * NBBY));
        newbit = 0;
        push_cur();
-       set_cur(&typtab[DBM_UNKNOWN],
+       set_cur(NULL,
                XFS_AGB_TO_DADDR(mp, agno, agbno), blkbb, DB_RING_IGN, NULL);
+       stashed_ops = iocur_top->bp->b_ops;
+       iocur_top->bp->b_ops = NULL;
        if ((buf = iocur_top->data) == NULL) {
                dbprintf(_("can't read block %u/%u for trashing\n"), agno, agbno);
                pop_cur();
@@ -984,6 +987,7 @@ blocktrash_b(
                        buf[byte] &= ~mask;
        }
        write_cur();
+       iocur_top->bp->b_ops = stashed_ops;
        pop_cur();
        printf(_("blocktrash: %u/%u %s block %d bit%s starting %d:%d %s\n"),
                agno, agbno, typename[type], len, len == 1 ? "" : "s",
@@ -1040,9 +1044,11 @@ blocktrash_f(
                   (1 << DBM_BTINO) |
                   (1 << DBM_DIR) |
                   (1 << DBM_INODE) |
+                  (1 << DBM_LOG) |
                   (1 << DBM_QUOTA) |
                   (1 << DBM_RTBITMAP) |
                   (1 << DBM_RTSUM) |
+                  (1 << DBM_SYMLINK) |
                   (1 << DBM_SB);
        while ((c = getopt(argc, argv, "0123n:s:t:x:y:")) != EOF) {
                switch (c) {
@@ -1106,7 +1112,7 @@ blocktrash_f(
                return 0;
        }
        if (tmask == 0)
-               tmask = goodmask;
+               tmask = goodmask & ~((1 << DBM_LOG) | (1 << DBM_SB));
        lentab = xmalloc(sizeof(ltab_t));
        lentab->min = lentab->max = min;
        lentablen = 1;