};
if (ioctl(fd, FICLONERANGE, &fcr) &&
- (errno = EOPNOTSUPP || errno == ENOTTY)) {
+ (errno == EOPNOTSUPP || errno == ENOTTY)) {
if (!quiet)
fprintf(stderr,
"main: filesystem does not support "
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 "
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 &&
+ if (syscall(__NR_copy_file_range, fd, &o1, fd, &o2, 1, 0) == -1 &&
(errno == ENOSYS || errno == EOPNOTSUPP || errno == ENOTTY)) {
if (!quiet)
fprintf(stderr,
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);
}
}
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)
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:
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;
}
offset2 = random();
TRIM_OFF(offset2, maxfilelen);
offset2 -= offset2 % writebdy;
- } while (llabs(offset2 - offset) < size ||
+ } while (range_overlaps(offset, offset2, size) ||
offset2 + size > maxfilelen);
break;
}
check_contents();
out:
- if (sizechecks && testcalls > simulatedopcount)
- check_size();
if (closeopen)
docloseopen();
+ if (sizechecks && testcalls > simulatedopcount)
+ check_size();
return 1;
}