diff mbox series

[v1] pwritev201.c: Add check for RWF_APPEND flag

Message ID 20240528034718.31798-1-wegao@suse.com
State New
Headers show
Series [v1] pwritev201.c: Add check for RWF_APPEND flag | expand

Commit Message

Wei Gao May 28, 2024, 3:47 a.m. UTC
Signed-off-by: Wei Gao <wegao@suse.com>
---
 .../kernel/syscalls/pwritev2/pwritev201.c     | 35 ++++++++++++-------
 1 file changed, 23 insertions(+), 12 deletions(-)
diff mbox series

Patch

diff --git a/testcases/kernel/syscalls/pwritev2/pwritev201.c b/testcases/kernel/syscalls/pwritev2/pwritev201.c
index 987412ba8..cb329d8fc 100644
--- a/testcases/kernel/syscalls/pwritev2/pwritev201.c
+++ b/testcases/kernel/syscalls/pwritev2/pwritev201.c
@@ -2,6 +2,7 @@ 
 /*
  * Copyright (c) 2019 FUJITSU LIMITED. All rights reserved.
  * Author: Jinhui Huang <huangjh.jy@cn.fujitsu.com>
+ * Copyright (c) 2024 SUSE LLC <wegao@suse.com>
  */
 
 /*\
@@ -15,6 +16,9 @@ 
  * - If the file offset argument is -1, pwritev2() should succeed in
  *   writing the expected content of data and the current file offset
  *   is used and changed after writing.
+ * - If the file flag argument is RWF_APPEND, pwritev2() should succeed in
+ *   writing the expected content to end of file. The offset argument does
+ *   not changed after writing except offset argument is -1.
  */
 
 #define _GNU_SOURCE
@@ -42,13 +46,16 @@  static struct tcase {
 	off_t write_off;
 	ssize_t size;
 	off_t exp_off;
+	int flag;
 } tcases[] = {
-	{0,     1, 0,          CHUNK, 0},
-	{CHUNK, 2, 0,          CHUNK, CHUNK},
-	{0,     1, CHUNK / 2,  CHUNK, 0},
-	{0,     1, -1,         CHUNK, CHUNK},
-	{0,     2, -1,         CHUNK, CHUNK},
-	{CHUNK, 1, -1,         CHUNK, CHUNK * 2},
+	{0,     1, 0,          CHUNK, 0, 0},
+	{CHUNK, 2, 0,          CHUNK, CHUNK, 0},
+	{0,     1, CHUNK / 2,  CHUNK, 0, 0},
+	{0,     1, -1,         CHUNK, CHUNK, 0},
+	{0,     2, -1,         CHUNK, CHUNK, 0},
+	{CHUNK, 1, -1,         CHUNK, CHUNK * 2, 0},
+	{CHUNK, 1, CHUNK,      CHUNK, CHUNK, RWF_APPEND},
+	{CHUNK, 1, -1,         CHUNK, CHUNK * 2, RWF_APPEND},
 };
 
 static void verify_pwritev2(unsigned int n)
@@ -60,7 +67,7 @@  static void verify_pwritev2(unsigned int n)
 	SAFE_PWRITE(1, fd, initbuf, sizeof(initbuf), 0);
 	SAFE_LSEEK(fd, tc->seek_off, SEEK_SET);
 
-	TEST(pwritev2(fd, wr_iovec, tc->count, tc->write_off, 0));
+	TEST(pwritev2(fd, wr_iovec, tc->count, tc->write_off, tc->flag));
 	if (TST_RET < 0) {
 		tst_res(TFAIL | TTERRNO, "pwritev2() failed");
 		return;
@@ -72,17 +79,21 @@  static void verify_pwritev2(unsigned int n)
 		return;
 	}
 
-	if (SAFE_LSEEK(fd, 0, SEEK_CUR) != tc->exp_off) {
+	if (SAFE_LSEEK(fd, 0, SEEK_CUR) != tc->exp_off && !(tc->flag == RWF_APPEND && tc->write_off == -1)) {
 		tst_res(TFAIL, "pwritev2() had changed file offset");
 		return;
 	}
 
 	memset(preadbuf, 0, CHUNK);
 
-	if (tc->write_off != -1)
-		SAFE_PREAD(1, fd, preadbuf, tc->size, tc->write_off);
-	else
-		SAFE_PREAD(1, fd, preadbuf, tc->size, tc->seek_off);
+	if (tc->flag == RWF_APPEND)
+		SAFE_PREAD(1, fd, preadbuf, tc->size, sizeof(initbuf));
+	else {
+		if (tc->write_off != -1)
+			SAFE_PREAD(1, fd, preadbuf, tc->size, tc->write_off);
+		else
+			SAFE_PREAD(1, fd, preadbuf, tc->size, tc->seek_off);
+	}
 
 	for (i = 0; i < tc->size; i++) {
 		if (preadbuf[i] != 0x61)