From: Darrick J. Wong Date: Tue, 13 Oct 2015 23:24:47 +0000 (+1100) Subject: xfs_db: enable blocktrash for checksummed filesystems X-Git-Tag: v4.3.0-rc1~54 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bdc2a208c8759529b84b34f82b1816e383cc9323;p=thirdparty%2Fxfsprogs-dev.git xfs_db: enable blocktrash for checksummed filesystems 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 Reviewed-by: Dave Chinner Signed-off-by: Dave Chinner --- diff --git a/db/check.c b/db/check.c index d28199dda..8f3b5b684 100644 --- a/db/check.c +++ b/db/check.c @@ -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;