diff options
author | Boris Burkov <boris@bur.io> | 2023-02-23 10:01:51 -0800 |
---|---|---|
committer | Zorro Lang <zlang@kernel.org> | 2023-02-25 21:54:09 +0800 |
commit | 744a8a6be38fb1c535624e1aca69d8187688f33a (patch) | |
tree | fcde91295474d2640db68a93d551051a2f9dad5a /tests/generic | |
parent | e4561119eb12a62ed52a1a537a8e9fc24b82d29c (diff) |
generic: add test for direct io partial writes
btrfs recently had a bug where a direct io partial write resulted in a
hole in the file. Add a new generic test which creates a 2MiB file,
mmaps it, touches the first byte, then does an O_DIRECT write of the
mmapped buffer into a new file. This should result in the mapped pages
being a mix of in and out of page cache and thus a partial write, for
filesystems using iomap and IOMAP_DIO_PARTIAL.
Signed-off-by: Boris Burkov <boris@bur.io>
Reviewed-by: Zorro Lang <zlang@redhat.com>
Reviewed-by: David Disseldorp <ddiss@suse.de>
Reviewed-by: Filipe Manana <fdmanana@suse.com>
Signed-off-by: Zorro Lang <zlang@kernel.org>
Diffstat (limited to 'tests/generic')
-rwxr-xr-x | tests/generic/708 | 37 | ||||
-rw-r--r-- | tests/generic/708.out | 2 |
2 files changed, 39 insertions, 0 deletions
diff --git a/tests/generic/708 b/tests/generic/708 new file mode 100755 index 00000000..1f0843c7 --- /dev/null +++ b/tests/generic/708 @@ -0,0 +1,37 @@ +#! /bin/bash +# SPDX-License-Identifier: GPL-2.0 +# Copyright (c) 2023 Meta Platforms, Inc. All Rights Reserved. +# +# FS QA Test 708 +# +# Test iomap direct_io partial writes. +# +# Create a reasonably large file, then run a program which mmaps it, +# touches the first page, then dio writes it to a second file. This +# can result in a page fault reading from the mmapped dio write buffer and +# thus the iomap direct_io partial write codepath. +# +. ./common/preamble +_begin_fstest quick auto +[ $FSTYP == "btrfs" ] && \ + _fixed_by_kernel_commit XXXX 'btrfs: fix dio continue after short write due to buffer page fault' + +# real QA test starts here +_supported_fs generic +_require_test +_require_odirect +_require_test_program dio-buf-fault +src=$TEST_DIR/dio-buf-fault-$seq.src +dst=$TEST_DIR/dio-buf-fault-$seq.dst + +rm -rf "$src" "$dst" + +echo "Silence is golden" + +$XFS_IO_PROG -fc "pwrite -q -S 0xcd 0 $((2 * 1024 * 1024))" $src +$here/src/dio-buf-fault $src $dst > /dev/null || _fail "failed doing the dio copy" +diff $src $dst + +# success, all done +status=$? +exit diff --git a/tests/generic/708.out b/tests/generic/708.out new file mode 100644 index 00000000..33c478ad --- /dev/null +++ b/tests/generic/708.out @@ -0,0 +1,2 @@ +QA output created by 708 +Silence is golden |