ltp/fsx: drop caches if we're doing closeopen
[xfstests-dev.git] / ltp / fsx.c
index 316f08eb3b9f387ca22446b4131855ac7b731558..120f4374c95b403d7cce60a761c6334ace85d6f1 100644 (file)
--- a/ltp/fsx.c
+++ b/ltp/fsx.c
@@ -1364,7 +1364,7 @@ test_clone_range(void)
        };
 
        if (ioctl(fd, FICLONERANGE, &fcr) &&
-           (errno = EOPNOTSUPP || errno == ENOTTY)) {
+           (errno == EOPNOTSUPP || errno == ENOTTY)) {
                if (!quiet)
                        fprintf(stderr,
                                "main: filesystem does not support "
@@ -1482,7 +1482,8 @@ test_dedupe_range(void)
        else
                error = 0;
 
-       if (error == EOPNOTSUPP || error == ENOTTY) {
+       /* Older kernels may return EINVAL... */
+       if (error == EOPNOTSUPP || error == ENOTTY || error == EINVAL) {
                if (!quiet)
                        fprintf(stderr,
                                "main: filesystem does not support "
@@ -1580,10 +1581,10 @@ do_dedupe_range(unsigned offset, unsigned length, unsigned dest)
 int
 test_copy_range(void)
 {
-       loff_t o1 = 0, o2 = 0;
+       loff_t o1 = 0, o2 = 1;
 
-       if (syscall(__NR_copy_file_range, fd, &o1, fd, &o2, 0, 0) == -1 &&
-           (errno == EOPNOTSUPP || errno == ENOTTY)) {
+       if (syscall(__NR_copy_file_range, fd, &o1, fd, &o2, 1, 0) == -1 &&
+           (errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTTY)) {
                if (!quiet)
                        fprintf(stderr,
                                "main: filesystem does not support "
@@ -1777,10 +1778,14 @@ docloseopen(void)
                prterr("docloseopen: close");
                report_failure(180);
        }
+       if (system("echo 3 > /proc/sys/vm/drop_caches")) {
+               prterr("docloseopen: drop_caches");
+               report_failure(181);
+       }
        fd = open(fname, O_RDWR|o_direct, 0);
        if (fd < 0) {
                prterr("docloseopen: open");
-               report_failure(181);
+               report_failure(182);
        }
 }
 
@@ -1910,6 +1915,14 @@ fail:
        return 0;
 }
 
+static inline bool
+range_overlaps(
+       unsigned long   off0,
+       unsigned long   off1,
+       unsigned long   size)
+{
+       return llabs((unsigned long long)off1 - off0) < size;
+}
 
 int
 test(void)
@@ -1992,7 +2005,7 @@ test(void)
                        offset2 = random();
                        TRIM_OFF(offset2, maxfilelen);
                        offset2 = offset2 & ~(block_size - 1);
-               } while (llabs(offset2 - offset) < size ||
+               } while (range_overlaps(offset, offset2, size) ||
                         offset2 + size > maxfilelen);
                break;
        case OP_DEDUPE_RANGE:
@@ -2010,7 +2023,7 @@ test(void)
                                offset2 = random();
                                TRIM_OFF(offset2, file_size);
                                offset2 = offset2 & ~(block_size - 1);
-                       } while (llabs(offset2 - offset) < size ||
+                       } while (range_overlaps(offset, offset2, size) ||
                                 offset2 + size > file_size);
                        break;
                }
@@ -2023,7 +2036,7 @@ test(void)
                        offset2 = random();
                        TRIM_OFF(offset2, maxfilelen);
                        offset2 -= offset2 % writebdy;
-               } while (llabs(offset2 - offset) < size ||
+               } while (range_overlaps(offset, offset2, size) ||
                         offset2 + size > maxfilelen);
                break;
        }
@@ -2202,10 +2215,10 @@ have_op:
                check_contents();
 
 out:
-       if (sizechecks && testcalls > simulatedopcount)
-               check_size();
        if (closeopen)
                docloseopen();
+       if (sizechecks && testcalls > simulatedopcount)
+               check_size();
        return 1;
 }
 
@@ -2423,7 +2436,8 @@ __test_fallocate(int mode, const char *mode_str)
 #ifdef HAVE_LINUX_FALLOC_H
        int ret = 0;
        if (!lite) {
-               if (fallocate(fd, mode, file_size, 1) && errno == EOPNOTSUPP) {
+               if (fallocate(fd, mode, file_size, 1) &&
+                   (errno == ENOSYS || errno == EOPNOTSUPP)) {
                        if(!quiet)
                                fprintf(stderr,
                                        "main: filesystem does not support "