forked from amir73il/xfstests
-
Notifications
You must be signed in to change notification settings - Fork 1
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
new: blockdev/003 basic blockdev T10-DIF-TYPE1 integrity checks
Test create virtual block device via lio-targed infastructure and perform basic IO operations with data corruption detection. Temprorally mark is as dangerous, because currently it trigger BUG_ON inside blkdev_issue_flush BTW: I use 'dd' to test read from corrupted image instead of xfs_io because even if pread failed, xfs_io still exit with success, BUG?
- Loading branch information
Dmitry Monakhov
committed
Apr 3, 2017
1 parent
8472814
commit 3c6509e
Showing
3 changed files
with
192 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,158 @@ | ||
#! /bin/bash | ||
# FS QA Test 003 | ||
# | ||
# Check basic T10-DIF integrity features for a block device | ||
# | ||
# DIF/DIX TYPE: T10-DIF-TYPE1-CRC | ||
# Kernel docs: Documentation/blockdev/data-integrity.txt | ||
#----------------------------------------------------------------------- | ||
# Copyright (c) 2017 Dmitry Monakhov <dmonakhov@openvz.org> | ||
# 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.* | ||
_liotgt_cleanup | ||
rm -rf $TEST_DIR/$$ | ||
} | ||
|
||
# get standard environment, filters and checks | ||
. ./common/rc | ||
. ./common/filter | ||
. ./common/liotarget | ||
|
||
# remove previous $seqres.full before test | ||
rm -f $seqres.full | ||
|
||
# real QA test starts here | ||
|
||
# Modify as appropriate. | ||
_supported_fs generic | ||
_supported_os Linux | ||
_require_test | ||
_require_liotarget | ||
|
||
mkdir -p $TEST_DIR/$$ || _fail "Can not make test dir" | ||
|
||
# One full test suite | ||
_run_one() | ||
{ | ||
local img_name=$1 | ||
|
||
echo "Run: $img_name" | ||
echo "T0: Test basic IO" | ||
$XFS_IO_PROG -c "pwrite -S 0xa0 -b 4M 0 16M" -d $dev >>$seqres.full 2>&1 || \ | ||
_fail "pwrite failed" | ||
|
||
$XFS_IO_PROG -c "pwrite -S 0xa1 -b 1k -V8 20M 32k" -d $dev >>$seqres.full 2>&1 || \ | ||
_fail "pwrite failed" | ||
|
||
$XFS_IO_PROG -c "pwrite -S 0xa2 -b 1k -V8 2M 32k" -f $dev >>$seqres.full 2>&1 || \ | ||
_fail "pwrite failed" | ||
|
||
$XFS_IO_PROG -c "pwrite -S 0xa3 -b 4k 1536000 8k" -f $dev >>$seqres.full 2>&1 || \ | ||
_fail "pwrite failed" | ||
|
||
$XFS_IO_PROG -c "fsync" -d $dev >>$seqres.full 2>&1 || _fail "fsync failed" | ||
|
||
echo "Check that buffered and direct read works" | ||
dd if=$dev bs=4k 2>>$seqres.full | md5sum | ||
dd if=$dev bs=4M iflag=direct 2>>$seqres.full | md5sum | ||
|
||
echo "Check csum corruption detection" | ||
# LIO-fileio store t10 DIF data in separate file ${IMG}.protection | ||
# struct t10_pi_tuple { | ||
# __be16 guard_tag; /* Checksum */ | ||
# __be16 app_tag; /* Opaque storage */ | ||
# __be32 ref_tag; /* Target LBA or indirect LBA */ | ||
#} | ||
# Play with 3000'th sector -> t10_pi_tuple offset == 3000 * 8 == 24000 | ||
# | ||
echo "T1: Corrupt guard_tag, next read should fail" | ||
$XFS_IO_PROG -c "pwrite -S 0xde -b2 24000 2 -w" \ | ||
-f $TEST_DIR/$$/$img_name.protection >>$seqres.full 2>&1 | ||
dd if=$dev of=/dev/null bs=1M count=2 iflag=direct >>$seqres.full 2>&1 && | ||
_fail "read should fail on 3000'th sector" | ||
|
||
echo "T2: Check that unaffected blocks are still readable" | ||
dd if=$dev of=/dev/null bs=1M count=1 iflag=direct >>$seqres.full 2>&1 || _fail "read failed" | ||
|
||
echo "T3: Rewrite corrupted sector and check that read works" | ||
$XFS_IO_PROG -c "pwrite -S 0xa3 -b 4k 1536000 4k" -d $dev >>$seqres.full 2>&1 || \ | ||
_fail "pwrite failed" | ||
dd if=$dev bs=2M count=1 iflag=direct >>$seqres.full 2>&1 || _fail "read failed" | ||
|
||
echo "T4: Corrupt app_tag, should not affect read" | ||
$XFS_IO_PROG -c "pwrite -S 0xde -b2 24002 2 -w" \ | ||
-f $TEST_DIR/$$/$img_name.protection >>$seqres.full 2>&1 | ||
dd if=$dev bs=2M count=1 iflag=direct >>$seqres.full 2>&1 || _fail "read failed" | ||
|
||
echo "T5: Corrupt ref_tag, next read should fail" | ||
$XFS_IO_PROG -c "pwrite -S 0xde -b4 24004 4 -w" \ | ||
$TEST_DIR/$$/$img_name.protection >>$seqres.full 2>&1 | ||
dd if=$dev of=/dev/null bs=1M count=2 iflag=direct >>$seqres.full 2>&1 && | ||
_fail "read should fail on 3000'th sector" | ||
|
||
echo "T6: Check that unaffected blocks are still readable" | ||
dd if=$dev of=/dev/null bs=1M count=1 iflag=direct >>$seqres.full 2>&1 || _fail "read failed" | ||
|
||
echo "T7: Rewrite corrupted sector and check that read works" | ||
$XFS_IO_PROG -c "pwrite -S 0xa3 -b 4k 1536000 4k" -d $dev >>$seqres.full 2>&1 || \ | ||
_fail "pwrite failed" | ||
|
||
echo "Check that buffered and direct read works" | ||
dd if=$dev bs=4k 2>>$seqres.full | md5sum | ||
dd if=$dev bs=4M iflag=direct 2>>$seqres.full | md5sum | ||
# success, all done | ||
} | ||
|
||
# Create virtual scsi target with internal csum verification | ||
name=dif-type1-w | ||
cfg_path=$(_liotgt_create_fileio $name $TEST_DIR/$$/$name 32M) | ||
|
||
_liotgt_set_attribute $cfg_path pi_prot_type 1 | ||
_liotgt_set_attribute $cfg_path pi_prot_format 1 | ||
_liotgt_set_attribute $cfg_path pi_prot_verify 1 | ||
dev=$(_liotgt_attach_target /backstores/fileio/$name) | ||
_run_one $name | ||
|
||
# Create virtual scsi target w/o internal csum verification, | ||
# check that core blk_integrity_profile->verify_fn works | ||
# | ||
name=dif-type1-wo | ||
cfg_path=$(_liotgt_create_fileio $name $TEST_DIR/$$/$name 32M) | ||
|
||
_liotgt_set_attribute $cfg_path pi_prot_type 1 | ||
_liotgt_set_attribute $cfg_path pi_prot_format 1 | ||
_liotgt_set_attribute $cfg_path pi_prot_verify 0 | ||
dev=$(_liotgt_attach_target /backstores/fileio/$name) | ||
_run_one $name | ||
|
||
status=0 | ||
exit |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,33 @@ | ||
QA output created by 003 | ||
Run: dif-type1-w | ||
T0: Test basic IO | ||
Check that buffered and direct read works | ||
d4dacb57332e9125d56a0bad5fbfb8ff - | ||
d4dacb57332e9125d56a0bad5fbfb8ff - | ||
Check csum corruption detection | ||
T1: Corrupt guard_tag, next read should fail | ||
T2: Check that unaffected blocks are still readable | ||
T3: Rewrite corrupted sector and check that read works | ||
T4: Corrupt app_tag, should not affect read | ||
T5: Corrupt ref_tag, next read should fail | ||
T6: Check that unaffected blocks are still readable | ||
T7: Rewrite corrupted sector and check that read works | ||
Check that buffered and direct read works | ||
d4dacb57332e9125d56a0bad5fbfb8ff - | ||
d4dacb57332e9125d56a0bad5fbfb8ff - | ||
Run: dif-type1-wo | ||
T0: Test basic IO | ||
Check that buffered and direct read works | ||
d4dacb57332e9125d56a0bad5fbfb8ff - | ||
d4dacb57332e9125d56a0bad5fbfb8ff - | ||
Check csum corruption detection | ||
T1: Corrupt guard_tag, next read should fail | ||
T2: Check that unaffected blocks are still readable | ||
T3: Rewrite corrupted sector and check that read works | ||
T4: Corrupt app_tag, should not affect read | ||
T5: Corrupt ref_tag, next read should fail | ||
T6: Check that unaffected blocks are still readable | ||
T7: Rewrite corrupted sector and check that read works | ||
Check that buffered and direct read works | ||
d4dacb57332e9125d56a0bad5fbfb8ff - | ||
d4dacb57332e9125d56a0bad5fbfb8ff - |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
|
@@ -5,3 +5,4 @@ | |
# | ||
001 rw blockdev | ||
002 rw blockdev liotarget | ||
003 rw blockdev liotarget integrity dangerous |