[LTP] [PATCH] syscalls/fallocate04: add 'FALLOC_FL_INSERT_RANGE' test-case
Alexey Kodanev
alexey.kodanev@oracle.com
Wed Jun 22 18:15:45 CEST 2016
Check that it can insert space in the middle of the file.
Verify new size and file's content. The flag is available
since Linux 4.1. Supported FS: XFS(4.1+) & ext4(4.2+).
Also fix test04() if number of blocks more than 3.
Signed-off-by: Alexey Kodanev <alexey.kodanev@oracle.com>
---
testcases/kernel/syscalls/fallocate/fallocate.h | 4 ++
testcases/kernel/syscalls/fallocate/fallocate04.c | 50 ++++++++++++++++++++-
2 files changed, 52 insertions(+), 2 deletions(-)
diff --git a/testcases/kernel/syscalls/fallocate/fallocate.h b/testcases/kernel/syscalls/fallocate/fallocate.h
index 1900aa0..5119988 100644
--- a/testcases/kernel/syscalls/fallocate/fallocate.h
+++ b/testcases/kernel/syscalls/fallocate/fallocate.h
@@ -47,6 +47,10 @@
#define FALLOC_FL_ZERO_RANGE 0x10
#endif
+#ifndef FALLOC_FL_INSERT_RANGE
+#define FALLOC_FL_INSERT_RANGE 0x20
+#endif
+
#if !defined(HAVE_FALLOCATE)
static inline long fallocate(int fd, int mode, loff_t offset, loff_t len)
{
diff --git a/testcases/kernel/syscalls/fallocate/fallocate04.c b/testcases/kernel/syscalls/fallocate/fallocate04.c
index 910d0fb..4a66376 100644
--- a/testcases/kernel/syscalls/fallocate/fallocate04.c
+++ b/testcases/kernel/syscalls/fallocate/fallocate04.c
@@ -35,7 +35,7 @@
#include "fallocate.h"
char *TCID = "fallocate04";
-int TST_TOTAL = 4;
+int TST_TOTAL = 5;
static int fd;
static const char fname[] = "fallocate04.txt";
@@ -266,7 +266,8 @@ static void test04(void)
fill_tst_buf(tmp_buf);
memcpy(exp_buf, tmp_buf, block_size);
- memcpy(exp_buf + block_size, tmp_buf + size, block_size);
+ memcpy(exp_buf + block_size, tmp_buf + 2 * block_size,
+ buf_size - block_size * 2);
exp_buf[block_size - 1] = exp_buf[block_size] = '\0';
check_file_data(exp_buf, size);
@@ -274,6 +275,50 @@ static void test04(void)
tst_resm(TPASS, "test-case succeeded");
}
+static void test05(void)
+{
+ tst_resm(TINFO, "inserting space with FALLOC_FL_INSERT_RANGE");
+
+ size_t alloc_size0 = get_allocsize();
+
+ tst_resm(TINFO, "read current allocated file size '%zu'", alloc_size0);
+
+ if (fallocate(fd, FALLOC_FL_INSERT_RANGE, block_size,
+ block_size) == -1) {
+ if (errno == EOPNOTSUPP) {
+ tst_brkm(TCONF, cleanup,
+ "FALLOC_FL_INSERT_RANGE not supported");
+ }
+ tst_brkm(TFAIL | TERRNO, cleanup, "fallocate failed");
+ }
+
+ /* allocate space and ensure that it filled with zeroes */
+ if (fallocate(fd, FALLOC_FL_ZERO_RANGE, block_size, block_size) == -1)
+ tst_brkm(TFAIL | TERRNO, cleanup, "fallocate failed");
+
+ size_t alloc_size1 = get_allocsize();
+
+ tst_resm(TINFO, "allocated file size before '%zu' and after '%zu'",
+ alloc_size0, alloc_size1);
+ if ((alloc_size0 + block_size) != alloc_size1)
+ tst_brkm(TFAIL, cleanup, "not expected allocated size");
+
+ size_t size = buf_size;
+ char tmp_buf[buf_size];
+ char exp_buf[size];
+
+ fill_tst_buf(tmp_buf);
+
+ memcpy(exp_buf, tmp_buf, block_size);
+ memcpy(exp_buf + 2 * block_size, tmp_buf + 2 * block_size,
+ buf_size - block_size * 2);
+ memset(exp_buf + block_size - 1, 0, block_size + 2);
+
+ check_file_data(exp_buf, size);
+
+ tst_resm(TPASS, "test-case succeeded");
+}
+
int main(int argc, char *argv[])
{
int lc;
@@ -287,6 +332,7 @@ int main(int argc, char *argv[])
test02();
test03();
test04();
+ test05();
}
cleanup();
--
1.7.1
More information about the ltp
mailing list