Skip to content

Commit

Permalink
new: blockdev/003 basic blockdev T10-DIF-TYPE1 integrity checks
Browse files Browse the repository at this point in the history
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
Show file tree
Hide file tree
Showing 3 changed files with 192 additions and 0 deletions.
158 changes: 158 additions & 0 deletions tests/blockdev/003
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
33 changes: 33 additions & 0 deletions tests/blockdev/003.out
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 -
1 change: 1 addition & 0 deletions tests/blockdev/group
Original file line number Diff line number Diff line change
Expand Up @@ -5,3 +5,4 @@
#
001 rw blockdev
002 rw blockdev liotarget
003 rw blockdev liotarget integrity dangerous

0 comments on commit 3c6509e

Please sign in to comment.