#!/bin/bash # SPDX-License-Identifier: GPL-2.0 # Copyright (C) 2014 SUSE Linux Products GmbH. All Rights Reserved. # # FS QA Test No. btrfs/035 # # Regression test for overwriting clones # seq=`basename $0` seqres=$RESULT_DIR/$seq echo "QA output created by $seq" here=`pwd` tmp=/tmp/$$ status=1 # failure is the default! _cleanup() { rm -f $tmp.* } trap "_cleanup ; exit \$status" 0 1 2 3 15 # get standard environment, filters and checks . ./common/rc . ./common/filter . ./common/filter.btrfs # real QA test starts here _supported_fs btrfs _require_scratch _require_cloner _scratch_mkfs > /dev/null 2>&1 _scratch_mount src_str="aaaaaaaaaa" echo -n "$src_str" > $SCRATCH_MNT/src $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone1 src_str="bbbbbbbbbbcccccccccc" echo -n "$src_str" > $SCRATCH_MNT/src $CLONER_PROG $SCRATCH_MNT/src $SCRATCH_MNT/src.clone2 snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone1 | awk '{print $5}'` echo "attempting ioctl (src.clone1 src)" $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ $SCRATCH_MNT/src.clone1 $SCRATCH_MNT/src | _filter_btrfs_cloner_error # The clone operation should have failed. If it did not it meant we had data # loss, because file "src.clone1" has an inline extent which is 10 bytes long # while file "src" has an inline extent which is 20 bytes long. The clone # operation would remove the inline extent of "src" and then copy the inline # extent from "src.clone1" into "src", which means we would lose the last 10 # bytes of data from "src" (on read we would get 0x00 as the value for any # of those 10 bytes, because the file's size remains as 20 bytes). echo "File src data after attempt to clone from src.clone1 into src:" od -t x1 $SCRATCH_MNT/src snap_src_sz=`ls -lah $SCRATCH_MNT/src.clone2 | awk '{print $5}'` echo "attempting ioctl (src.clone2 src)" $CLONER_PROG -s 0 -d 0 -l ${snap_src_sz} \ $SCRATCH_MNT/src.clone2 $SCRATCH_MNT/src # The clone operation should have succeeded. echo "File src data after attempt to clone from src.clone2 into src:" od -t x1 $SCRATCH_MNT/src status=0 ; exit