Hi

We run data validation test for buffered workload on filesystems:
ext3, ext4, and XFS.
In context of flushing page cache block device driver returned IO error.
After dropping page cache our validation tool reported data corruption.

We provided a simple patch in order to inject IO error in device mapper.
We run test to verify md5sum of file during IO error.
Test shows checksum mismatch.

Attachments:
0001-drivers-md-dm-add-error-injection.patch - device mapper patch
dm-test.txt - validation test script

Regards,
Mariusz Barczak
Intel Technology Poland

--------------------------------------------------------------------

Intel Technology Poland sp. z o.o.
ul. Slowackiego 173 | 80-298 Gdansk | Sad Rejonowy Gdansk Polnoc | VII Wydzial 
Gospodarczy Krajowego Rejestru Sadowego - KRS 101882 | NIP 957-07-52-316 | 
Kapital zakladowy 200.000 PLN.

Ta wiadomosc wraz z zalacznikami jest przeznaczona dla okreslonego adresata i 
moze zawierac informacje poufne. W razie przypadkowego otrzymania tej 
wiadomosci, prosimy o powiadomienie nadawcy oraz trwale jej usuniecie; 
jakiekolwiek
przegladanie lub rozpowszechnianie jest zabronione.
This e-mail and any attachments may contain confidential material for the sole 
use of the intended recipient(s). If you are not the intended recipient, please 
contact the sender and delete all copies; any review or distribution by
others is strictly prohibited.

Attachment: 0001-drivers-md-dm-add-error-injection.patch
Description: 0001-drivers-md-dm-add-error-injection.patch

#!/bin/bash

DISK=/dev/vda

FILE_SIZE=50

PART_NUM=10
PART_GB=2

prepare_test() {
        parted -s $DISK mktable gpt
        for i in `seq 1 1 $PART_NUM`; do
                parted -s -a optimal $DISK mkpart primary \
                        $(( PART_GB * (i - 1) ))GiB $(( PART_GB * i ))GiB
        done

        for i in `seq 1 1 $PART_NUM`; do
                SIZE=`blockdev --getsize ${DISK}${i}`
                dmsetup create linear${i} --table \
                        "0 ${SIZE} linear ${DISK}${i} 0"
        done

        sleep 2

        for i in `seq 1 1 $PART_NUM`; do
                mkfs.xfs -f /dev/dm-$(( i - 1 ))
        done

        for i in `seq 1 1 $PART_NUM`; do
                mkdir /mnt/p${i}
        done

        for i in `seq 1 1 $PART_NUM`; do
                mount /dev/dm-$(( i - 1 )) /mnt/p${i}
        done
}

cleanup_test() {
        for i in `seq 1 1 $PART_NUM`; do
                umount /mnt/p${i}
        done

        for i in `seq 1 1 $PART_NUM`; do
                rm -rf /mnt/p${i}
        done

        for i in `seq 1 1 $PART_NUM`; do
                dmsetup remove linear${i}
        done
}

inject_error() {
        while true; do
                echo "Error = 0"
                echo 0 > /sys/kernel/debug/dm_debug/error
                echo 0 > /sys/kernel/debug/dm_debug/error_counter
                echo 100 > /sys/kernel/debug/dm_debug/error_max
                sleep 1
                echo "Drop caches"
                echo 1 > /proc/sys/vm/drop_caches
                sleep 1
                echo "Error = 1"
                echo 1 > /sys/kernel/debug/dm_debug/error
                sleep 3
        done
}

inject_stop() {
        echo 0 > /sys/kernel/debug/dm_debug/error
}

run_test() {
        truncate -s 0 md5sum.log
        inject_error &
        PID=$!
        for i in `seq 1 1 $PART_NUM`; do
                dd if=/dev/urandom bs=1M count=$FILE_SIZE of=/mnt/p${i}/file
                md5sum /mnt/p${i}/file >> md5sum.log
        done
        kill $PID
        inject_stop
        md5sum -c md5sum.log
}

prepare_test
run_test
cleanup_test

Reply via email to