Allow fsync-err test to use sync_file_range
Signed-off-by: Jeff Layton <jlayton@redhat.com>
diff --git a/src/fsync-err.c b/src/fsync-err.c
index bd05dcc..da1f3ea 100644
--- a/src/fsync-err.c
+++ b/src/fsync-err.c
@@ -24,9 +24,20 @@
/* default number of fds to open */
#define DEFAULT_NUM_FDS 10
+bool use_sync_file_range;
+
static void usage()
{
- printf("Usage: fsync-err [ -b bufsize ] [ -n num_fds ] [ -s ] -d dmerror path <filename>\n");
+ printf("Usage: fsync-err [ -b bufsize ] [ -n num_fds ] [ -s ] [ -S ] -d dmerror path <filename>\n");
+}
+
+static int sync_file(int fd, size_t bufsize)
+{
+ if (use_sync_file_range)
+ return sync_file_range(fd, 0, bufsize, SYNC_FILE_RANGE_WRITE |
+ SYNC_FILE_RANGE_WAIT_AFTER);
+ else
+ return fsync(fd);
}
int main(int argc, char **argv)
@@ -38,7 +49,7 @@
size_t cmdsize, bufsize = DEFAULT_BUFSIZE;
bool simple_mode = false;
- while ((i = getopt(argc, argv, "b:d:n:s")) != -1) {
+ while ((i = getopt(argc, argv, "b:d:n:sS")) != -1) {
switch (i) {
case 'b':
bufsize = strtol(optarg, &buf, 0);
@@ -66,6 +77,9 @@
* testing.
*/
simple_mode = true;
+ break;
+ case 'S':
+ use_sync_file_range = true;
}
}
@@ -114,7 +128,7 @@
}
for (i = 0; i < numfds; ++i) {
- ret = fsync(fd[i]);
+ ret = sync_file(fd[i], bufsize);
if (ret < 0) {
printf("First fsync on fd[%d] failed: %m\n", i);
return 1;
@@ -157,7 +171,7 @@
}
for (i = 0; i < numfds; ++i) {
- ret = fsync(fd[i]);
+ ret = sync_file(fd[i], bufsize);
/* Now, we EXPECT the error! */
if (ret >= 0) {
printf("Success on second fsync on fd[%d]!\n", i);
@@ -167,7 +181,7 @@
if (!simple_mode) {
for (i = 0; i < numfds; ++i) {
- ret = fsync(fd[i]);
+ ret = sync_file(fd[i], bufsize);
if (ret < 0) {
/*
* We did a failed write and fsync on each fd
@@ -200,7 +214,7 @@
if (!simple_mode) {
for (i = 0; i < numfds; ++i) {
- ret = fsync(fd[i]);
+ ret = sync_file(fd[i], bufsize);
if (ret < 0) {
/* The error should still be clear */
printf("fsync after healing device on fd[%d] failed: %m\n", i);
@@ -225,7 +239,7 @@
printf("Second open of fd[%d] failed: %m\n", i);
return 1;
}
- ret = fsync(fd[i]);
+ ret = sync_file(fd[i], bufsize);
if (ret < 0) {
/* New opens should not return an error */
printf("First fsync after reopen of fd[%d] failed: %m\n", i);
diff --git a/tests/generic/441 b/tests/generic/441
index 5fbfece..108c2bb 100755
--- a/tests/generic/441
+++ b/tests/generic/441
@@ -84,6 +84,18 @@
echo "$here/src/fsync-err $sflag -d $here/src/dmerror $testfile" >> $seqres.full
$here/src/fsync-err $sflag -d $here/src/dmerror $testfile
+# success, finished with first phase
+_dmerror_load_working_table
+_dmerror_unmount
+
+# test sync_file_range
+echo "Format and mount"
+_scratch_mkfs > $seqres.full 2>&1
+_dmerror_mount
+
+echo "$here/src/fsync-err $sflag -S -d $here/src/dmerror $testfile" >> $seqres.full
+$here/src/fsync-err $sflag -S -d $here/src/dmerror $testfile
+
# success, all done
_dmerror_load_working_table
_dmerror_unmount
diff --git a/tests/generic/441.out b/tests/generic/441.out
index f06df04..714fd49 100644
--- a/tests/generic/441.out
+++ b/tests/generic/441.out
@@ -1,3 +1,5 @@
QA output created by 441
Format and mount
Test passed!
+Format and mount
+Test passed!