| #! /bin/bash |
| # FS QA Test No. 012 |
| # |
| # Test btrfs-convert |
| # |
| # 1) create ext4 filesystem & populate it |
| # 2) convert it to btrfs, mount it, verify contents |
| # 3) verify archived ext4 image integriy & contents |
| # 4) populate btrfs fs with new data |
| # 5) roll back conversion to original ext4 |
| # 6) verify rolled-back fs integrity & contents |
| # |
| #----------------------------------------------------------------------- |
| # Copyright (c) 2013 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.* |
| } |
| |
| # get standard environment, filters and checks |
| . ./common/rc |
| . ./common/filter.btrfs |
| |
| # real QA test starts here |
| |
| # Modify as appropriate. |
| _supported_fs btrfs |
| _supported_os Linux |
| _require_scratch_nocheck |
| |
| _require_command "$BTRFS_CONVERT_PROG" btrfs-convert |
| _require_command "$MKFS_EXT4_PROG" mkfs.ext4 |
| _require_command "$E2FSCK_PROG" e2fsck |
| |
| rm -f $seqres.full |
| |
| BLOCK_SIZE=`_get_block_size $TEST_DIR` |
| |
| # Create & populate an ext4 filesystem |
| $MKFS_EXT4_PROG -F -b $BLOCK_SIZE $SCRATCH_DEV > $seqres.full 2>&1 || \ |
| _notrun "Could not create ext4 filesystem" |
| # Manual mount so we don't use -t btrfs or selinux context |
| mount -t ext4 $SCRATCH_DEV $SCRATCH_MNT |
| |
| cp -aR /lib/modules/`uname -r`/ $SCRATCH_MNT |
| _scratch_unmount |
| |
| # Convert it to btrfs, mount it, verify the data |
| $BTRFS_CONVERT_PROG $SCRATCH_DEV >> $seqres.full 2>&1 || \ |
| _fail "btrfs-convert failed" |
| _try_scratch_mount || _fail "Could not mount new btrfs fs" |
| # (Ignore the symlinks which may be broken/nonexistent) |
| diff -r /lib/modules/`uname -r`/ $SCRATCH_MNT/`uname -r`/ 2>&1 | grep -vw "source\|build" |
| |
| # Old ext4 image file should exist & be consistent |
| $E2FSCK_PROG -fn $SCRATCH_MNT/ext2_saved/image >> $seqres.full 2>&1 || \ |
| _fail "archived ext4 image is corrupt" |
| |
| # And the files in that image should match |
| mkdir -p $SCRATCH_MNT/mnt |
| mount -o loop $SCRATCH_MNT/ext2_saved/image $SCRATCH_MNT/mnt || \ |
| _fail "could not loop mount saved ext4 image" |
| # Ignore the symlinks which may be broken/nonexistent |
| diff -r /lib/modules/`uname -r`/ $SCRATCH_MNT/mnt/`uname -r`/ 2>&1 | grep -vw "source\|build" |
| umount $SCRATCH_MNT/mnt |
| |
| # Now put some fresh data on the btrfs fs |
| mkdir -p $SCRATCH_MNT/new |
| cp -aR /lib/modules/`uname -r`/ $SCRATCH_MNT/new |
| |
| _scratch_unmount |
| |
| # Now restore the ext4 device |
| $BTRFS_CONVERT_PROG -r $SCRATCH_DEV >> $seqres.full 2>&1 || \ |
| _fail "btrfs-convert rollback failed" |
| |
| # Check it again |
| $E2FSCK_PROG -fn $SCRATCH_DEV >> $seqres.full 2>&1 || \ |
| _fail "restored ext4 image is corrupt" |
| |
| # Mount the un-converted ext4 device & check the contents |
| mount -t ext4 $SCRATCH_DEV $SCRATCH_MNT |
| # (Ignore the symlinks which may be broken/nonexistent) |
| diff -r /lib/modules/`uname -r`/ $SCRATCH_MNT/`uname -r`/ 2>&1 | grep -vw "source\|build" |
| |
| _scratch_unmount |
| |
| # Convert it to btrfs, mount it and delete "ext2_saved" |
| $BTRFS_CONVERT_PROG $SCRATCH_DEV >> $seqres.full 2>&1 || \ |
| _fail "btrfs-convert failed" |
| _try_scratch_mount || _fail "Could not mount new btrfs fs" |
| $BTRFS_UTIL_PROG subvolume delete $SCRATCH_MNT/ext2_saved >> $seqres.full 2>&1 || |
| _fail "failed to delete ext2_saved subvolume" |
| _scratch_unmount |
| |
| # Now restore the ext4 device, expecting a failure |
| $BTRFS_CONVERT_PROG -r $SCRATCH_DEV >> $seqres.full 2>&1 |
| [ $? -eq 1 ] || _fail "Failure is expected, but btrfs-convert returns with rollback complete" |
| |
| # success, all done |
| status=0 |
| exit |