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!