On Wed, Mar 30, 2016 at 05:57:41PM +0800, Eryu Guan wrote:
> Commit 31f48569c353 ("xfs/030: fix output on newer filesystems") added
> more lines to .out file to match the output from XFS with reflink
> support, but it broke test on older XFS.
>
> Fix it by introducing new .out file 030.out.reflink.linux to match the
> reflink case, so old XFS still compares .out file against 030.out.linux.
>
> In order to do this, a new helper is introduced, _fs_has_reflink()
> accepts mount point as argument and returns if the underlying fs
> supports reflink or not.
>
> Signed-off-by: Eryu Guan <eguan@xxxxxxxxxx>
> ---
>
> I didn't test this patch on newer XFS, but it did pass for me on current
> 4.6-rc1 kernel.
>
> common/reflink | 18 +++
> tests/xfs/030 | 12 +-
> tests/xfs/030.cfg | 1 +
> tests/xfs/030.out.linux | 2 -
> tests/xfs/030.out.reflink.linux | 252
> ++++++++++++++++++++++++++++++++++++++++
> 5 files changed, 280 insertions(+), 5 deletions(-)
> create mode 100644 tests/xfs/030.out.reflink.linux
>
> diff --git a/common/reflink b/common/reflink
> index 4ec390d..bdfc01c 100644
> --- a/common/reflink
> +++ b/common/reflink
> @@ -156,6 +156,24 @@ _cp_reflink() {
> cp --reflink=always -p "$file1" "$file2"
> }
>
> +# given a mount point and test the underlying fs supports reflink or not
> +_fs_has_reflink()
> +{
> + if [ -z $1 ] || [ ! -d $1 ]; then
> + echo "Missing mount point argument for _fs_has_reflink()"
> + exit 1
> + fi
> + local src=$1/_fs_has_reflink_testfile
> + local tgt=$src.reflink
> + local ret=0
> +
> + echo "reflink test" > $src
> + _cp_reflink $src $tgt >/dev/null 2>&1
> + ret=$?
> + rm -f $src $tgt >/dev/null 2>&1
> + return $ret
> +}
Patch looks ok, though I wonder if _require_*_reflink ought to be
refactored to use this?
--D
> +
> # Reflink some file1 into file2
> _reflink() {
> file1="$1"
> diff --git a/tests/xfs/030 b/tests/xfs/030
> index 33c906c..d171a39 100755
> --- a/tests/xfs/030
> +++ b/tests/xfs/030
> @@ -44,9 +44,7 @@ trap "_cleanup; exit \$status" 0 1 2 3 15
> . ./common/rc
> . ./common/filter
> . ./common/repair
> -
> -# link correct .out file
> -_link_out_file
> +. ./common/reflink
>
> # nuke the superblock, AGI, AGF, AGFL; then try repair the damage
> #
> @@ -90,6 +88,14 @@ else
> _notrun "GQuota are enabled, test needs controlled sb recovery"
> src/feature -P $SCRATCH_DEV && \
> _notrun "PQuota are enabled, test needs controlled sb recovery"
> +
> + # link correct .out file
> + features=`_get_os_name`
> + if _fs_has_reflink $SCRATCH_MNT; then
> + features=$feature,reflink
> + fi
> + _link_out_file_named $seqfull.out "$features"
> +
> _scratch_unmount
> fi
> clear=""
> diff --git a/tests/xfs/030.cfg b/tests/xfs/030.cfg
> index 7ffdfc0..1eacdc1 100644
> --- a/tests/xfs/030.cfg
> +++ b/tests/xfs/030.cfg
> @@ -1,2 +1,3 @@
> irix: irix
> +linux,reflink: reflink.linux
> linux: linux
> diff --git a/tests/xfs/030.out.linux b/tests/xfs/030.out.linux
> index 14b9b35..cf3259f 100644
> --- a/tests/xfs/030.out.linux
> +++ b/tests/xfs/030.out.linux
> @@ -231,8 +231,6 @@ bad agbno AGBNO in agfl, agno 0
> bad agbno AGBNO in agfl, agno 0
> bad agbno AGBNO in agfl, agno 0
> bad agbno AGBNO in agfl, agno 0
> -bad agbno AGBNO in agfl, agno 0
> -bad agbno AGBNO in agfl, agno 0
> - found root inode chunk
> Phase 3 - for each AG...
> - scan and clear agi unlinked lists...
> diff --git a/tests/xfs/030.out.reflink.linux b/tests/xfs/030.out.reflink.linux
> new file mode 100644
> index 0000000..14b9b35
> --- /dev/null
> +++ b/tests/xfs/030.out.reflink.linux
> @@ -0,0 +1,252 @@
> +QA output created by 030
> +meta-data=DDEV isize=XXX agcount=N, agsize=XXX blks
> +data = bsize=XXX blocks=XXX, imaxpct=PCT
> + = sunit=XXX swidth=XXX, unwritten=X
> +naming =VERN bsize=XXX
> +log =LDEV bsize=XXX blocks=XXX
> +realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
> +Corrupting sb 0 - setting bits to 0
> +Wrote X.XXKb (value 0x0)
> +Phase 1 - find and verify superblock...
> +bad primary superblock - bad magic number !!!
> +
> +attempting to find secondary superblock...
> +found candidate secondary superblock...
> +verified secondary superblock...
> +writing modified primary superblock
> +sb root inode value INO inconsistent with calculated value INO
> +resetting superblock root inode pointer to INO
> +sb realtime bitmap inode INO inconsistent with calculated value INO
> +resetting superblock realtime bitmap ino pointer to INO
> +sb realtime summary inode INO inconsistent with calculated value INO
> +resetting superblock realtime summary ino pointer to INO
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> + - found root inode chunk
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +Note - stripe unit (0) and width (0) fields have been reset.
> +Please set with mount -o sunit=<value>,swidth=<value>
> +done
> +Corrupting agf 0 - setting bits to 0
> +Wrote X.XXKb (value 0x0)
> +Phase 1 - find and verify superblock...
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> +bad magic # 0x0 for agf 0
> +bad version # 0 for agf 0
> +bad length 0 for agf 0, should be LENGTH
> +reset bad agf for ag 0
> +bad agbno AGBNO for btbno root, agno 0
> +bad agbno AGBNO for btbcnt root, agno 0
> + - found root inode chunk
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +done
> +Corrupting agi 0 - setting bits to 0
> +Wrote X.XXKb (value 0x0)
> +Phase 1 - find and verify superblock...
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> +bad magic # 0x0 for agi 0
> +bad version # 0 for agi 0
> +bad length # 0 for agi 0, should be LENGTH
> +reset bad agi for ag 0
> +bad agbno AGBNO for inobt root, agno 0
> +root inode chunk not found
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +done
> +Corrupting agfl 0 - setting bits to 0
> +Wrote X.XXKb (value 0x0)
> +Phase 1 - find and verify superblock...
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> + - found root inode chunk
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +done
> +Corrupting sb 0 - setting bits to -1
> +Wrote X.XXKb (value 0xffffffff)
> +Phase 1 - find and verify superblock...
> +bad primary superblock - bad magic number !!!
> +
> +attempting to find secondary superblock...
> +found candidate secondary superblock...
> +verified secondary superblock...
> +writing modified primary superblock
> +sb root inode value INO inconsistent with calculated value INO
> +resetting superblock root inode pointer to INO
> +sb realtime bitmap inode INO inconsistent with calculated value INO
> +resetting superblock realtime bitmap ino pointer to INO
> +sb realtime summary inode INO inconsistent with calculated value INO
> +resetting superblock realtime summary ino pointer to INO
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> + - found root inode chunk
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +Note - stripe unit (0) and width (0) fields have been reset.
> +Please set with mount -o sunit=<value>,swidth=<value>
> +done
> +Corrupting agf 0 - setting bits to -1
> +Wrote X.XXKb (value 0xffffffff)
> +Phase 1 - find and verify superblock...
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> +bad magic # 0xffffffff for agf 0
> +bad version # -1 for agf 0
> +bad sequence # -1 for agf 0
> +bad length -1 for agf 0, should be LENGTH
> +flfirst -1 in agf 0 too large (max = MAX)
> +fllast -1 in agf 0 too large (max = MAX)
> +reset bad agf for ag 0
> +freeblk count 1 != flcount -1 in ag 0
> +bad agbno AGBNO for btbno root, agno 0
> +bad agbno AGBNO for btbcnt root, agno 0
> + - found root inode chunk
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +done
> +Corrupting agi 0 - setting bits to -1
> +Wrote X.XXKb (value 0xffffffff)
> +Phase 1 - find and verify superblock...
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> +bad magic # 0xffffffff for agi 0
> +bad version # -1 for agi 0
> +bad sequence # -1 for agi 0
> +bad length # -1 for agi 0, should be LENGTH
> +reset bad agi for ag 0
> +bad agbno AGBNO for inobt root, agno 0
> +root inode chunk not found
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +done
> +Corrupting agfl 0 - setting bits to -1
> +Wrote X.XXKb (value 0xffffffff)
> +Phase 1 - find and verify superblock...
> +Phase 2 - using <TYPEOF> log
> + - zero log...
> + - scan filesystem freespace and inode maps...
> +bad agbno AGBNO in agfl, agno 0
> +bad agbno AGBNO in agfl, agno 0
> +bad agbno AGBNO in agfl, agno 0
> +bad agbno AGBNO in agfl, agno 0
> +bad agbno AGBNO in agfl, agno 0
> +bad agbno AGBNO in agfl, agno 0
> + - found root inode chunk
> +Phase 3 - for each AG...
> + - scan and clear agi unlinked lists...
> + - process known inodes and perform inode discovery...
> + - process newly discovered inodes...
> +Phase 4 - check for duplicate blocks...
> + - setting up duplicate extent list...
> + - check for inodes claiming duplicate blocks...
> +Phase 5 - rebuild AG headers and trees...
> + - reset superblock...
> +Phase 6 - check inode connectivity...
> + - resetting contents of realtime bitmap and summary inodes
> + - traversing filesystem ...
> + - traversal finished ...
> + - moving disconnected inodes to lost+found ...
> +Phase 7 - verify and correct link counts...
> +done
> --
> 2.5.5
>
> _______________________________________________
> xfs mailing list
> xfs@xxxxxxxxxxx
> http://oss.sgi.com/mailman/listinfo/xfs
|