[LTP] [PATCH] fallocate04: another check if SEEK_HOLE is not supported

Zeng Linggang
2015-05-18T10:13:35Z

SEEK_HOLE is only supported since version 3.1. Check the specified
range blocks are zeroed while the kernel does not supported SEEK_HOLE.

Signed-off-by: Zeng Linggang <zenglg.jy@cn.fujitsu.com>
---
testcases/kernel/syscalls/fallocate/fallocate04.c | 49 ++++++++++++++++++-----
1 file changed, 39 insertions(+), 10 deletions(-)

diff --git a/testcases/kernel/syscalls/fallocate/fallocate04.c b/testcases/kernel/syscalls/fallocate/fallocate04.c
index 911bbe8..9d9587b 100644
--- a/testcases/kernel/syscalls/fallocate/fallocate04.c
+++ b/testcases/kernel/syscalls/fallocate/fallocate04.c
@@ -50,6 +50,8 @@ static const option_t options[] = {
{NULL, NULL, NULL}
};

+static off_t check_file_hole(int, off_t, off_t);
+
static void help(void)
{
printf(" -v Verbose\n");
@@ -150,17 +152,12 @@ static void test02(void)
}

tst_resm(TINFO, "check that file has a hole with lseek(,,SEEK_HOLE)");
- off_t ret = lseek(fd, 0, SEEK_HOLE);

- if (ret != (ssize_t)block_size) {
- /* exclude error when kernel doesn't have SEEK_HOLE support */
- if (errno != EINVAL) {
- tst_brkm(TFAIL | TERRNO, cleanup,
- "fallocate() or lseek() failed");
- }
- tst_resm(TWARN | TERRNO, "lseek() doesn't support SEEK_HOLE");
- }
- tst_resm(TINFO, "found a hole at '%ld' offset", ret);
+ off_t ret = check_file_hole(fd, block_size, block_size);
+ if (ret != (ssize_t)block_size)
+ tst_resm(TWARN | TERRNO, "No file hole found");
+ else
+ tst_resm(TINFO, "found a hole at '%ld' offset", ret);

size_t alloc_size1 = get_allocsize();

@@ -275,3 +272,35 @@ int main(int argc, char *argv[])

tst_exit();
}
+
+static off_t check_file_hole(int fd, off_t offset, off_t len)
+{
+ off_t ret;
+
+ ret = lseek(fd, 0, SEEK_HOLE);
+ if (ret < 0) {
+ /* exclude error when kernel doesn't have SEEK_HOLE support */
+ if (errno != EINVAL)
+ tst_brkm(TFAIL | TERRNO, cleanup, "lseek() failed");
+
+ int i;
+ char *buf;
+
+ SAFE_LSEEK(cleanup, fd, offset, SEEK_SET);
+
+ buf = SAFE_MALLOC(cleanup, len);
+
+ SAFE_READ(cleanup, 1, fd, buf, len);
+
+ for (i = 0; i < len; i++) {
+ if (buf[i] != '\0')
+ break;
+ }
+
+ free(buf);
+
+ return i;
+ }
+
+ return ret;
+}
--
1.9.3