#include <string.h>
#include <errno.h>
#include <err.h>
+#include <getopt.h>
char *filename;
unsigned int page_size;
return count2;
}
+static void usage(const char *argv0)
+{
+ fprintf(stderr, "Usage: %s [-2] {filename}\n", argv0);
+ exit(2);
+}
+
int main(int argc, char *argv[])
{
- if (argc != 2)
- errx(1, "no test filename argument given");
- filename = argv[1];
+ int opt, opt_2 = 0;
+
+ while ((opt = getopt(argc, argv, "2")) != -1) {
+ switch(opt) {
+ case '2':
+ opt_2 = 1;
+ break;
+ default:
+ usage(argv[0]);
+ }
+ }
+
+ if (optind + 1 != argc)
+ usage(argv[0]);
+ filename = argv[optind];
page_size = ret = sysconf(_SC_PAGE_SIZE);
if (ret == -1)
errx(1, "pread (D_DIRECT) from hole is broken");
done();
+ if (opt_2) {
+ init('f', O_RDWR | O_DIRECT);
+ ret = do_write(fd, addr + page_size, page_size, page_size);
+ if (ret != page_size)
+ err(1, "pwrite %s (O_DIRECT): %ld != %u", filename, ret, page_size);
+ done();
+ }
+
if (unlink(filename))
err(1, "unlink %s", filename);
--- /dev/null
+#! /bin/bash
+# SPDX-License-Identifier: GPL-2.0
+# Copyright (c) 2023 Red Hat, Inc. All Rights Reserved.
+#
+# FS QA Test No. 729
+#
+# Trigger page faults in the same file during read and write
+#
+# This is generic/647 with an additional test that writes a memory-mapped page
+# onto itself using direct I/O.
+#
+# The kernel will invalidate the page cache before carrying out the write, so
+# filesystems that fault in the page and then carry out the direct I/O write
+# with page faults disabled will never make any progress.
+#
+. ./common/preamble
+_begin_fstest auto quick
+
+# Override the default cleanup function.
+_cleanup()
+{
+ cd /
+ rm -f $tmp.*
+ rm -f $TEST_DIR/mmap-rw-fault.tmp
+}
+
+# Import common functions.
+. ./common/filter
+
+# real QA test starts here
+
+_supported_fs generic
+_require_test
+_require_odirect
+_require_test_program mmap-rw-fault
+
+echo "Silence is golden"
+
+$here/src/mmap-rw-fault -2 $TEST_DIR/mmap-rw-fault.tmp
+
+status=$?
+exit