This test verifies the data & required metadata (e.g. inode i_size for extending writes) integrity when using O_DSYNC and RWF_DSYNC during writes operations, across buffered-io, aio-dio and dio, in the event of a sudden filesystem shutdown after write completion. Man page of open says that - O_DSYNC provides synchronized I/O data integrity completion, meaning write operations will flush data to the underlying hardware, but will only flush metadata updates that are required to allow a subsequent read operation to complete successfully. Signed-off-by: Ritesh Harjani (IBM) <ritesh.list@xxxxxxxxx> --- tests/generic/737 | 30 +++++++++++++++++++++++++++++- tests/generic/737.out | 21 +++++++++++++++++++++ 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/tests/generic/737 b/tests/generic/737 index 99ca1f39..0f27c82b 100755 --- a/tests/generic/737 +++ b/tests/generic/737 @@ -4,7 +4,8 @@ # # FS QA Test No. 737 # -# Integrity test for O_SYNC with buff-io, dio, aio-dio with sudden shutdown. +# Integrity test for O_[D]SYNC and/or RWF_DSYNC with buff-io, dio, aio-dio with +# sudden shutdown. # Based on a testcase reported by Gao Xiang <hsiangkao@xxxxxxxxxxxxxxxxx> # @@ -21,6 +22,15 @@ _require_aiodio aio-dio-write-verify _scratch_mkfs > $seqres.full 2>&1 _scratch_mount +echo "T-0: Create a 1M file using buff-io & RWF_DSYNC" +$XFS_IO_PROG -f -c "pwrite -V 1 -D -S 0x5a 0 1M" $SCRATCH_MNT/testfile.t1 > /dev/null 2>&1 +echo "T-0: Shutdown the fs suddenly" +_scratch_shutdown +echo "T-0: Cycle mount" +_scratch_cycle_mount +echo "T-0: File contents after cycle mount" +_hexdump $SCRATCH_MNT/testfile.t1 + echo "T-1: Create a 1M file using buff-io & O_SYNC" $XFS_IO_PROG -fs -c "pwrite -S 0x5a 0 1M" $SCRATCH_MNT/testfile.t1 > /dev/null 2>&1 echo "T-1: Shutdown the fs suddenly" @@ -48,5 +58,23 @@ _scratch_cycle_mount echo "T-3: File contents after cycle mount" _hexdump $SCRATCH_MNT/testfile.t3 +echo "T-4: Create a 1M file using DIO & RWF_DSYNC" +$XFS_IO_PROG -fdc "pwrite -V 1 -S 0x5a -D 0 1M" $SCRATCH_MNT/testfile.t4 > /dev/null 2>&1 +echo "T-4: Shutdown the fs suddenly" +_scratch_shutdown +echo "T-4: Cycle mount" +_scratch_cycle_mount +echo "T-4: File contents after cycle mount" +_hexdump $SCRATCH_MNT/testfile.t4 + +echo "T-5: Create a 1M file using AIO-DIO & O_DSYNC" +$AIO_TEST -a size=1048576 -D -N $SCRATCH_MNT/testfile.t5 > /dev/null 2>&1 +echo "T-5: Shutdown the fs suddenly" +_scratch_shutdown +echo "T-5: Cycle mount" +_scratch_cycle_mount +echo "T-5: File contents after cycle mount" +_hexdump $SCRATCH_MNT/testfile.t5 + status=0 exit diff --git a/tests/generic/737.out b/tests/generic/737.out index efe6ff1f..2bafeefa 100644 --- a/tests/generic/737.out +++ b/tests/generic/737.out @@ -1,4 +1,11 @@ QA output created by 737 +T-0: Create a 1M file using buff-io & RWF_DSYNC +T-0: Shutdown the fs suddenly +T-0: Cycle mount +T-0: File contents after cycle mount +000000 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a >ZZZZZZZZZZZZZZZZ< +* +100000 T-1: Create a 1M file using buff-io & O_SYNC T-1: Shutdown the fs suddenly T-1: Cycle mount @@ -20,3 +27,17 @@ T-3: File contents after cycle mount 000000 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a >ZZZZZZZZZZZZZZZZ< * 100000 +T-4: Create a 1M file using DIO & RWF_DSYNC +T-4: Shutdown the fs suddenly +T-4: Cycle mount +T-4: File contents after cycle mount +000000 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a >ZZZZZZZZZZZZZZZZ< +* +100000 +T-5: Create a 1M file using AIO-DIO & O_DSYNC +T-5: Shutdown the fs suddenly +T-5: Cycle mount +T-5: File contents after cycle mount +000000 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a 5a >ZZZZZZZZZZZZZZZZ< +* +100000 -- 2.49.0