On 07/17/2017 02:48 PM, Bill O'Donnell wrote: > On Mon, Jul 17, 2017 at 02:41:04PM -0500, Eric Sandeen wrote: >> >> >> On 07/17/2017 01:53 PM, Bill O'Donnell wrote: >>> xfs_db should take type size into account when setting type. >>> If type size isn't updated whenever type is set, a false crc >>> error can occur due to the stale size. This test checks for >>> that false crc error. >>> >>> Signed-off-by: Bill O'Donnell <billodo@xxxxxxxxxx> >>> --- >>> v2: Clarify commit message and test comments. Add a few more test cases. >>> v3: Add more test cases. Use _scratch_xfs_db instead of $XFS_DB_PROG to >>> accomodate fses with external logs. Remove superfluous daddr and type >>> commands. >>> >>> tests/xfs/424 | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ >>> tests/xfs/424.out | 1 + >>> tests/xfs/group | 1 + >>> 3 files changed, 95 insertions(+) >>> create mode 100755 tests/xfs/424 >>> create mode 100644 tests/xfs/424.out >>> >>> diff --git a/tests/xfs/424 b/tests/xfs/424 >>> new file mode 100755 >>> index 00000000..8415ecd1 >>> --- /dev/null >>> +++ b/tests/xfs/424 >>> @@ -0,0 +1,93 @@ >>> +#! /bin/bash >>> +# FS QA Test 424 >>> +# >>> +# xfs_db should take type size into account when setting type. >>> +# If type size isn't updated whenever type is set, a false crc >>> +# error can occur due to the stale size. This test checks for >>> +# that false crc error. >>> +# >>> +#----------------------------------------------------------------------- >>> +# Copyright (c) 2017 Red Hat, Inc. All Rights Reserved. >>> +# >>> +# This program is free software; you can redistribute it and/or >>> +# modify it under the terms of the GNU General Public License as >>> +# published by the Free Software Foundation. >>> +# >>> +# This program is distributed in the hope that it would be useful, >>> +# but WITHOUT ANY WARRANTY; without even the implied warranty of >>> +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the >>> +# GNU General Public License for more details. >>> +# >>> +# You should have received a copy of the GNU General Public License >>> +# along with this program; if not, write the Free Software Foundation, >>> +# Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA >>> +#----------------------------------------------------------------------- >>> +# >>> + >>> +seq=`basename $0` >>> +seqres=$RESULT_DIR/$seq >>> +echo "QA output created by $seq" >>> + >>> +here=`pwd` >>> +tmp=/tmp/$$ >>> +status=1 # failure is the default! >>> +trap "_cleanup; exit \$status" 0 1 2 3 15 >>> + >>> +_cleanup() >>> +{ >>> + cd / >>> + rm -f $tmp.* >>> +} >>> + >>> +_filter_dbval() >>> +{ >>> + awk '{ print $4 }' >>> +} >>> + >>> +# get standard environment, filters and checks >>> +. ./common/rc >>> +. ./common/filter >>> + >>> +# remove previous $seqres.full before test >>> +rm -f $seqres.full >>> + >>> +# Modify as appropriate >>> +_supported_os Linux >>> +_supported_fs xfs >>> +_require_scratch >>> + >>> +# real QA test starts here >>> +_scratch_unmount >> $seqres.full 2>&1 >>> + >>> +# for different sector sizes, ensure no CRC errors are falsely reported. >>> + >>> +# Supported types include: agf, agfl, agi, attr3, bmapbta, >>> +# bmapbtd, bnobt, cntbt, data, dir3, dqblk, inobt, inodata, >>> +# inode, log, rtbitmap, rtsummary, sb, symlink, text, finobt. >>> +# For various sector sizes, test some types that involve type size. >>> +for SECTOR_SIZE in 512 1024 2048 4096; do >>> + $MKFS_XFS_PROG -f -s size=$SECTOR_SIZE $SCRATCH_DEV > /dev/null >>> + >>> + for TYPE in agf agi agfl sb; do >>> + DADDR=`_scratch_xfs_db -c "$TYPE" -c "daddr" | _filter_dbval` >>> + _scratch_xfs_db -c "daddr $DADDR" -c "type $TYPE" >>> + done >>> + >>> + for TYPE in inodata data log text rtbitmap rtsummary; do >>> + DADDR=`_scratch_xfs_db -c "sb" -c "addr rootino" -c "daddr" | _filter_dbval` >>> + _scratch_xfs_db -c "daddr $DADDR" -c "type $TYPE" >>> + done >> >> Ok, I don't understand this part. For each of those types, you get the address of >> the root inode, then set it to the type - including types which are... not inodes? > > For this case, where addr set to rootino, the types included indeed work fine, but > "type inode" yields crc error(s). :/ My [PATCH] xfs_db: properly set inode type should fix that... but I got hung up on what to do if the current disk address isn't even an inode-aligned sector. I ... think we should let it proceed, it's a debug tool after all. Sorry, I forgot this wasn't in. > It might make more sense to just leave the inodata data log text rtbitmap rtsummary > types out of the test. Or just set them up properly: + DADDR=`_scratch_xfs_db -c "sb" -c "addr rbmino" -c "daddr" | _filter_dbval` + _scratch_xfs_db -c "daddr $DADDR" -c "type rtbitmap" + DADDR=`_scratch_xfs_db -c "sb" -c "addr rsumino" -c "daddr" | _filter_dbval` + _scratch_xfs_db -c "daddr $DADDR" -c "type rtsummary" + DADDR=`_scratch_xfs_db -c "sb" -c "addr logstart" -c "daddr" | _filter_dbval` + _scratch_xfs_db -c "daddr $DADDR" -c "type log" but i'm a little confused by some of these types. if you go to the sb and then to logstart, xfs_db does indeed set the 'log' type. but if you go to rbmino, it does /not/ set rtbitmap. Given that I don't know what these types are for, I guess it might be best to leave them out of the test for now. testing inode would be good though - i'll try to get that patch to a point where I can merge it for 4.12, yet. (and types data & text are trivial enough to do - not much to go wrong there, but may as well exercise them while we're at it) Might be worth it to add a comment about which ones don't get tested at this point. -Eric > > fs_db> sb > xfs_db> addr rootino > xfs_db> daddr > current daddr is 96 > xfs_db> type inode > Metadata corruption detected at xfs_inode block 0x60/0x200 > Metadata corruption detected at xfs_inode block 0x60/0x200 > > >> >> (sure, type text & type data can be anything, but the others are specific data >> types...) >> >>> + >>> + DADDR=`_scratch_xfs_db -c "agf" -c "addr bnoroot" -c "daddr" | _filter_dbval` >>> + _scratch_xfs_db -c "daddr $DADDR" -c "type bnobt" >>> + DADDR=`_scratch_xfs_db -c "agf" -c "addr cntroot" -c "daddr" | _filter_dbval` >>> + _scratch_xfs_db -c "daddr $DADDR" -c "type cntbt" >>> + DADDR=`_scratch_xfs_db -c "agi" -c "addr root" -c "daddr" | _filter_dbval` >>> + _scratch_xfs_db -c "daddr $DADDR" -c "type inobt" >>> + DADDR=`_scratch_xfs_db -c "agi" -c "addr free_root" -c "daddr" | _filter_dbval` >>> + _scratch_xfs_db -c "daddr $DADDR" -c "type finobt" >> >> to test the generic data & text types, you could just do: >> >> + _scratch_xfs_db -c "daddr $DADDR" -c "type text" >> + _scratch_xfs_db -c "daddr $DADDR" -c "type data" >> >> here. They don't hae CRCs anyway so if the test is truly to "test for crc errors" >> then maybe it's not needed, but it can't hurt to actually iterate through each type >> that's possible. >> >>> +done >>> + >>> +# success, all done >>> +status=0 >>> +exit >>> diff --git a/tests/xfs/424.out b/tests/xfs/424.out >>> new file mode 100644 >>> index 00000000..d879a949 >>> --- /dev/null >>> +++ b/tests/xfs/424.out >>> @@ -0,0 +1 @@ >>> +QA output created by 424 >>> diff --git a/tests/xfs/group b/tests/xfs/group >>> index ffdb0615..75c8280c 100644 >>> --- a/tests/xfs/group >>> +++ b/tests/xfs/group >>> @@ -421,3 +421,4 @@ >>> 421 auto quick clone dedupe >>> 422 dangerous_scrub dangerous_online_repair >>> 423 dangerous_scrub >>> +424 auto quick db >>> > -- To unsubscribe from this list: send the line "unsubscribe fstests" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html