xfs/111: make it work better

xfs/111 is failing today, primarily because it obliterates the
root inode chunk and the verifiers fail the mount - i.e. the test
fails to properly test the thing it's meant to test.

Change the test so that the induced corruption is further into the
filesystem, but still hitting the inodes which have been created
for the test, so that the fs can mount and continue.

This requires that the helper binary (itrash) take an offset, which
we will figure out by using xfs_db.

This changes the locations of the inodes we hit; we're not really
going to be able to predict that terribly well, so remove the
output which shows inode offsets, and just keep track of whether
we managed to obliterate any at all.

The test still fails, because the fs is corrupted; this was done
intentionally, so run xfs_repair before the test exits to fix
things up.

(This test doesn't run often; it's not in the auto group, and
all the failures are extremely noisy and time consuming...)

Signed-off-by: Eric Sandeen <sandeen@redhat.com>
Reviewed-by: Brian Foster <bfoster@redhat.com>
Signed-off-by: Dave Chinner <david@fromorbit.com>
This commit is contained in:
Eric Sandeen
2015-05-26 12:51:57 +10:00
committed by Dave Chinner
parent 50ea2c6606
commit f4eee51260
3 changed files with 35 additions and 96 deletions
+17 -4
View File
@@ -8,6 +8,7 @@
#include <fcntl.h>
char buffer[32768];
int overwrote;
void die(char *func)
{
@@ -21,20 +22,32 @@ void nuke()
for (i = 2048; i < 32768-1; i++)
if (buffer[i] == 'I' && buffer[i+1] == 'N') {
buffer[i] = buffer[i+1] = 'X';
printf("Overwrote IN @offset %d\n", i);
overwrote = 1;
}
}
int main(int argc, char* argv[])
{
int f = open(argv[1], O_RDWR);
int f;
loff_t offset;
if (argc != 3) {
printf("%s <device> <offset>\n", argv[0]);
exit(1);
}
f = open(argv[1], O_RDWR);
offset = atoll(argv[2]);
if (f < 0) die("open");
if (lseek(f, 32768, SEEK_SET) < 0) die("lseek");
if (lseek(f, offset, SEEK_SET) < 0) die("lseek");
if (read(f, buffer, 32768) != 32768) die("read");
printf("Starting overwrite\n");
nuke();
if (lseek(f, 32768, SEEK_SET) < 0) die("lseek");
if (lseek(f, offset, SEEK_SET) < 0) die("lseek");
if (write(f, buffer, 32768) != 32768) die("write");
if (!overwrote)
printf("Did not overwrite any inodes\n");
printf("Overwrite complete\n");
close(f);
return 0;
+17 -4
View File
@@ -40,6 +40,8 @@ _supported_fs xfs
_supported_os Linux
_require_scratch
rm -f $seqres.full
[ "$XFS_FSR_PROG" = "" ] && _notrun "xfs_fsr not found"
# real QA test starts here
@@ -56,16 +58,27 @@ do
$XFS_IO_PROG -f -c "pwrite 0 512" $SCRATCH_MNT/${I} > /dev/null
let I=$I+1
done
# Roughly the middle of the created inodes
INO=`ls -i $SCRATCH_MNT/512 | awk '{print $1}'`
umount $SCRATCH_DEV
echo Blat inode clusters
src/itrash $SCRATCH_DEV
# Figure out where that middle inode starts
BYTE=`$XFS_DB_PROG -c "convert inode $INO byte" $SCRATCH_DEV \
| awk '{print $2}' | sed s/[\(\)]//g`
_scratch_mount
echo Blat inode clusters
src/itrash $SCRATCH_DEV $BYTE
_scratch_mount || _fail "Couldn't mount after itrash"
echo Attempting bulkstat
#src/bstat -q $SCRATCH_MNT
xfs_fsr $SCRATCH_MNT
$XFS_FSR_PROG $SCRATCH_MNT | _filter_scratch
# Fix up intentional corruption so test can pass
umount $SCRATCH_DEV
$XFS_REPAIR_PROG $SCRATCH_DEV >> $seqres.full 2>&1
status=0
exit
+1 -88
View File
@@ -8,93 +8,6 @@ realtime =RDEV extsz=XXX blocks=XXX, rtextents=XXX
Create some files
Blat inode clusters
Starting overwrite
Overwrote IN @offset 2048
Overwrote IN @offset 2304
Overwrote IN @offset 2560
Overwrote IN @offset 2816
Overwrote IN @offset 3072
Overwrote IN @offset 3328
Overwrote IN @offset 3584
Overwrote IN @offset 3840
Overwrote IN @offset 4096
Overwrote IN @offset 4352
Overwrote IN @offset 4608
Overwrote IN @offset 4864
Overwrote IN @offset 5120
Overwrote IN @offset 5376
Overwrote IN @offset 5632
Overwrote IN @offset 5888
Overwrote IN @offset 6144
Overwrote IN @offset 6400
Overwrote IN @offset 6656
Overwrote IN @offset 6912
Overwrote IN @offset 7168
Overwrote IN @offset 7424
Overwrote IN @offset 7680
Overwrote IN @offset 7936
Overwrote IN @offset 8192
Overwrote IN @offset 8448
Overwrote IN @offset 8704
Overwrote IN @offset 8960
Overwrote IN @offset 9216
Overwrote IN @offset 9472
Overwrote IN @offset 9728
Overwrote IN @offset 9984
Overwrote IN @offset 10240
Overwrote IN @offset 10496
Overwrote IN @offset 10752
Overwrote IN @offset 11008
Overwrote IN @offset 11264
Overwrote IN @offset 11520
Overwrote IN @offset 11776
Overwrote IN @offset 12032
Overwrote IN @offset 12288
Overwrote IN @offset 12544
Overwrote IN @offset 12800
Overwrote IN @offset 13056
Overwrote IN @offset 13312
Overwrote IN @offset 13568
Overwrote IN @offset 13824
Overwrote IN @offset 14080
Overwrote IN @offset 14336
Overwrote IN @offset 14592
Overwrote IN @offset 14848
Overwrote IN @offset 15104
Overwrote IN @offset 15360
Overwrote IN @offset 15616
Overwrote IN @offset 15872
Overwrote IN @offset 16128
Overwrote IN @offset 24576
Overwrote IN @offset 24832
Overwrote IN @offset 25088
Overwrote IN @offset 25344
Overwrote IN @offset 25600
Overwrote IN @offset 25856
Overwrote IN @offset 26112
Overwrote IN @offset 26368
Overwrote IN @offset 26624
Overwrote IN @offset 26880
Overwrote IN @offset 27136
Overwrote IN @offset 27392
Overwrote IN @offset 27648
Overwrote IN @offset 27904
Overwrote IN @offset 28160
Overwrote IN @offset 28416
Overwrote IN @offset 28672
Overwrote IN @offset 28928
Overwrote IN @offset 29184
Overwrote IN @offset 29440
Overwrote IN @offset 29696
Overwrote IN @offset 29952
Overwrote IN @offset 30208
Overwrote IN @offset 30464
Overwrote IN @offset 30720
Overwrote IN @offset 30976
Overwrote IN @offset 31232
Overwrote IN @offset 31488
Overwrote IN @offset 31744
Overwrote IN @offset 32000
Overwrote IN @offset 32256
Overwrote IN @offset 32512
Overwrite complete
Attempting bulkstat
SCRATCH_MNT start inode=0