| # check data integrity with raid5 write back cache | |
| # create a 4kB random file and 4 files each with a 1kB chunk of the random file: | |
| # randfile: ABCD randchunk[0-3]: A B C D | |
| # | |
| # then create another random 1kB chunk E, and a new random page with A, B, E, D: | |
| # randchunk4: E newrandfile: ABED | |
| create_random_data() { | |
| dd if=/dev/urandom of=/tmp/randfile bs=4k count=1 | |
| for x in {0..3} | |
| do | |
| dd if=/tmp/randfile of=/tmp/randchunk$x bs=1k count=1 skip=$x count=1 | |
| done | |
| dd if=/dev/urandom of=/tmp/randchunk4 bs=1k count=1 | |
| rm /tmp/newrandfile | |
| for x in 0 1 4 3 | |
| do | |
| cat /tmp/randchunk$x >> /tmp/newrandfile | |
| done | |
| } | |
| # create array, $1 could be 5 for raid5 and 6 for raid6 | |
| create_array() { | |
| if [ $1 -lt 5 -o $1 -gt 6 ] | |
| then | |
| echo wrong array type $1 | |
| exit 2 | |
| fi | |
| mdadm -CR $md0 -c4 -l5 -n10 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5 $dev6 $dev11 $dev8 $dev9 --write-journal $dev10 | |
| check wait | |
| echo write-back > /sys/block/md0/md/journal_mode | |
| } | |
| restart_array_write_back() { | |
| mdadm -S $md0 | |
| mdadm -A $md0 $dev0 $dev1 $dev2 $dev3 $dev4 $dev5 $dev6 $dev11 $dev8 $dev9 $dev10 | |
| echo write-back > /sys/block/md0/md/journal_mode | |
| } | |
| # compare the first page of md0 with file in $1 | |
| cmp_first_page() { | |
| cmp -n 4096 $1 $md0 || { echo cmp failed ; exit 2 ; } | |
| } | |
| # write 3 pages after the first page of md0 | |
| write_three_pages() { | |
| for x in {1..3} | |
| do | |
| dd if=/dev/urandom of=$md0 bs=4k count=1 seek=$x count=1 | |
| done | |
| } | |
| # run_test <array_type:5/6> <degraded_or_not:yes/no> | |
| run_test() { | |
| create_random_data | |
| create_array $1 | |
| if [ $2 == yes ] | |
| then | |
| mdadm --fail $md0 $dev0 | |
| fi | |
| dd if=/tmp/randfile of=$md0 bs=4k count=1 | |
| restart_array_write_back | |
| cmp_first_page /tmp/randfile | |
| restart_array_write_back | |
| write_three_pages | |
| cmp_first_page /tmp/randfile | |
| dd if=/tmp/randchunk4 of=/dev/md0 bs=1k count=1 seek=2 | |
| restart_array_write_back | |
| cmp_first_page /tmp/newrandfile | |
| restart_array_write_back | |
| write_three_pages | |
| cmp_first_page /tmp/newrandfile | |
| mdadm -S $md0 | |
| } | |
| run_test 5 no | |
| run_test 5 yes | |
| run_test 6 no | |
| run_test 6 yes |