<div dir="ltr"><div dir="ltr"><div class="gmail_default" style="font-size:small">Hi Sumit,</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Jun 10, 2019 at 6:14 PM Sumit Garg <<a href="mailto:sumit.garg@linaro.org">sumit.garg@linaro.org</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">Add partial file sync tests as part of sync_file_range02 test-case.<br>
<br>
Signed-off-by: Sumit Garg <<a href="mailto:sumit.garg@linaro.org" target="_blank">sumit.garg@linaro.org</a>><br>
---<br>
<br>
Changes in v4:<br>
vfat FS doesn't support sparse files. So handle this via pre-filling the<br>
test file in case of "test3".<br>
<br>
Changes in v3:<br>
1. Add upper bound check for synced size to device.<br>
2. Refactor tests for more code reuse.<br>
3. Add another test to check sync over partial write.<br>
<br>
Changes in v2:<br>
1. Do full file write instead of partial and test sync partial file.<br>
<br>
 .../syscalls/sync_file_range/sync_file_range02.c   | 53 ++++++++++++++++++----<br>
 1 file changed, 43 insertions(+), 10 deletions(-)<br>
<br>
diff --git a/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c b/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c<br>
index 82d77f7..9454a56 100644<br>
--- a/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c<br>
+++ b/testcases/kernel/syscalls/sync_file_range/sync_file_range02.c<br>
@@ -22,23 +22,36 @@<br>
 #include "check_sync_file_range.h"<br>
<br>
 #define MNTPOINT               "mnt_point"<br>
-#define FNAME          MNTPOINT"/test"<br>
-#define FILE_SIZE_MB   32<br>
-#define FILE_SIZE (FILE_SIZE_MB * TST_MB)<br>
+#define FNAME1                 MNTPOINT"/test1"<br>
+#define FNAME2                 MNTPOINT"/test2"<br>
+#define FNAME3                 MNTPOINT"/test3"<br>
+#define FILE_SZ_MB             32<br>
+#define FILE_SZ                        (FILE_SZ_MB * TST_MB)<br>
 #define MODE                   0644<br>
<br>
-static void verify_sync_file_range(void)<br>
+struct testcase {<br>
+       char *fname;<br>
+       off64_t sync_off;<br>
+       off64_t sync_size;<br>
+       size_t exp_sync_size;<br>
+       off64_t write_off;<br>
+       size_t write_size_mb;<br>
+};<br>
+<br>
+static void verify_sync_file_range(struct testcase *tc)<br>
 {<br>
        int fd;<br>
        unsigned long written;<br>
<br>
-       fd = SAFE_OPEN(FNAME, O_RDWR|O_CREAT, MODE);<br>
+       fd = SAFE_OPEN(tc->fname, O_RDWR|O_CREAT, MODE);<br>
+<br>
+       lseek(fd, tc->write_off, SEEK_SET);<br>
<br>
        tst_dev_bytes_written(tst_device->dev);<br>
<br>
-       tst_fill_fd(fd, 0, TST_MB, FILE_SIZE_MB);<br>
+       tst_fill_fd(fd, 0, TST_MB, tc->write_size_mb);<br>
<br>
-       TEST(sync_file_range(fd, 0, FILE_SIZE,<br>
+       TEST(sync_file_range(fd, tc->sync_off, tc->sync_size,<br>
                             SYNC_FILE_RANGE_WAIT_BEFORE |<br>
                             SYNC_FILE_RANGE_WRITE |<br>
                             SYNC_FILE_RANGE_WAIT_AFTER));<br>
@@ -50,23 +63,43 @@ static void verify_sync_file_range(void)<br>
<br>
        SAFE_CLOSE(fd);<br>
<br>
-       if (written >= FILE_SIZE)<br>
+       if ((written >= tc->exp_sync_size) &&<br>
+           (written <= (tc->exp_sync_size + tc->exp_sync_size/10)))<br>
                tst_res(TPASS, "Test file range synced to device");<br>
        else<br>
-               tst_res(TFAIL, "Synced %li, expected %i", written, FILE_SIZE);<br>
+               tst_res(TFAIL, "Synced %li, expected %li", written,<br>
+                       tc->exp_sync_size);<br>
+}<br>
+<br>
+static struct testcase testcases[] = {<br>
+       { FNAME1, 0, FILE_SZ, FILE_SZ, 0, FILE_SZ_MB },<br>
+       { FNAME2, FILE_SZ/4, FILE_SZ/2, FILE_SZ/2, 0, FILE_SZ_MB },<br>
+       { FNAME3, FILE_SZ/4, FILE_SZ/2, FILE_SZ/4, FILE_SZ/2, FILE_SZ_MB/4 },<br>
+};<br>
+<br>
+static void run(unsigned int i)<br>
+{<br>
+       verify_sync_file_range(&testcases[i]);<br>
 }<br>
<br>
 static void setup(void)<br>
 {<br>
        if (!check_sync_file_range())<br>
                tst_brk(TCONF, "sync_file_range() not supported");<br></blockquote><div><br></div><div><div class="gmail_default" style="font-size:small">Reviewed-by: Li Wang <<a href="mailto:liwang@redhat.com">liwang@redhat.com</a>></div><br></div><div><div class="gmail_default" style="font-size:small">That'd be great if we have code comments here, anyway the patch makes sense to me.</div></div><div class="gmail_default" style="font-size:small"><br></div><div class="gmail_default" style="font-size:small">/*  </div><div class="gmail_default" style="font-size:small"> * vfat FS doesn't support sparse files. So handle this via pre-filling the</div><div class="gmail_default" style="font-size:small"> * test file in case of "test3". </div><div class="gmail_default" style="font-size:small">*/</div><div class="gmail_default" style="font-size:small"><br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
+<br>
+       if (!strcmp(tst_device->fs_type, "vfat")) {<br>
+               tst_res(TINFO, "Pre-filling file");<br>
+               tst_fill_file(FNAME3, 0, TST_MB, FILE_SZ_MB);<br>
+               sync();<br>
+       }<br>
 }<br>
<br>
 static struct tst_test test = {<br>
+       .tcnt = ARRAY_SIZE(testcases),<br>
        .needs_root = 1,<br>
        .mount_device = 1,<br>
        .all_filesystems = 1,<br>
        .mntpoint = MNTPOINT,<br>
        .setup = setup,<br>
-       .test_all = verify_sync_file_range,<br>
+       .test = run,<br>
 };<br>
-- <br>
2.7.4<br>
<br>
</blockquote></div><br clear="all"><div><br></div>-- <br><div dir="ltr" class="gmail_signature"><div dir="ltr"><div>Regards,<br></div><div>Li Wang<br></div></div></div></div>