Skip to contentSkip to conversation

fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

PATCH Superseded Guangwen Feng 3 participants 8 messages Sep 15, 2015 – Oct 13, 2015 1 message not in the archive

lore
Share & tools
lore

A message that is not in the archive (sent off-list or not yet received): [email protected]

#1 lore raw

PATCH v3 1/1 fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

Add new testcase to verify that a write lease may be placed on a file only if there are no other open file descriptors for the file.

---
 runtest/ltplite                           |   1 +
 runtest/stress.part3                      |   1 +
 runtest/syscalls                          |   2 +
 testcases/kernel/syscalls/.gitignore      |   2 +
 testcases/kernel/syscalls/fcntl/fcntl32.c | 137 ++++++++++++++++++++++++++++++
 5 files changed, 143 insertions(+)
 create mode 100644 testcases/kernel/syscalls/fcntl/fcntl32.c
runtest/ltplite +1 -0
index ab6424c..e3ae8cf 100644
@@ -225,6 +225,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/stress.part3 +1 -0
index ab9af3c..ca8b70c 100644
@@ -164,6 +164,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/syscalls +2 -0
index ee2627f..a641bcd 100644
@@ -258,6 +258,8 @@ fcntl30 fcntl30
 fcntl30_64 fcntl30_64
 fcntl31 fcntl31
 fcntl31_64 fcntl31_64
+fcntl32 fcntl32
+fcntl32_64 fcntl32_64
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
testcases/kernel/syscalls/.gitignore +2 -0
index 18c0ad6..2b288e0 100644
@@ -221,6 +221,8 @@
 /fcntl/fcntl30_64
 /fcntl/fcntl31
 /fcntl/fcntl31_64
+/fcntl/fcntl32
+/fcntl/fcntl32_64
 /fdatasync/fdatasync01
 /fdatasync/fdatasync02
 /flock/flock01
testcases/kernel/syscalls/fcntl/fcntl32.c new file +137 -0

137 lines not on this page · raw message

Signature · 1 line
1.8.4.2
#2 lore raw

PATCH v3 1/1 fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

----- Original Message -----

Quoted 10 lines

From: "Guangwen Feng" <[email protected]>
To: [email protected]
Sent: Tuesday, 15 September, 2015 10:55:39 AM
Subject: [LTP] [PATCH v3] fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

Add new testcase to verify that a write lease may be placed on a file only if there are no other open file descriptors for the file.

Looks good to me.

Quoted 212 lines
---
 runtest/ltplite                           |   1 +
 runtest/stress.part3                      |   1 +
 runtest/syscalls                          |   2 +
 testcases/kernel/syscalls/.gitignore      |   2 +
 testcases/kernel/syscalls/fcntl/fcntl32.c | 137
 ++++++++++++++++++++++++++++++
 5 files changed, 143 insertions(+)
 create mode 100644 testcases/kernel/syscalls/fcntl/fcntl32.c
runtest/ltplite +1 -0
index ab6424c..e3ae8cf 100644
@@ -225,6 +225,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/stress.part3 +1 -0
index ab9af3c..ca8b70c 100644
@@ -164,6 +164,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/syscalls +2 -0
index ee2627f..a641bcd 100644
@@ -258,6 +258,8 @@ fcntl30 fcntl30
 fcntl30_64 fcntl30_64
 fcntl31 fcntl31
 fcntl31_64 fcntl31_64
+fcntl32 fcntl32
+fcntl32_64 fcntl32_64
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
testcases/kernel/syscalls/.gitignore +2 -0
index 18c0ad6..2b288e0 100644
@@ -221,6 +221,8 @@
 /fcntl/fcntl30_64
 /fcntl/fcntl31
 /fcntl/fcntl31_64
+/fcntl/fcntl32
+/fcntl/fcntl32_64
 /fdatasync/fdatasync01
 /fdatasync/fdatasync02
 /flock/flock01
testcases/kernel/syscalls/fcntl/fcntl32.c new file +137 -1
new file mode 100644
index 0000000..05d963e
@@ -0,0 +1,137 @@
+/*
+ * Copyright (c) 2015 Fujitsu Ltd.
+ * Author: Guangwen Feng <[email protected]>
+ *
+ * This program is free software; you can redistribute it and/or modify it
+ * under the terms of version 2 of the GNU General Public License as
+ * published by the Free Software Foundation.
+ *
+ * This program is distributed in the hope that it would be useful, but
+ * WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
+ *
+ * You should have received a copy of the GNU General Public License
+ * alone with this program.
+ */
+
+/*
+ * DESCRIPTION
+ *  Basic test for fcntl(2) using F_SETLEASE & F_WRLCK argument.
+ *  "A write lease may be placed on a file only if there are
+ *  no other open file descriptors for the file."
+ */
+
+#include <errno.h>
+
+#include "test.h"
+#include "safe_macros.h"
+#include "tst_fs_type.h"
+
+static void setup(void);
+static void verify_fcntl(int);
+static void cleanup(void);
+
+#define FILE_MODE	(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID)
+
+static int fd1;
+static int fd2;
+
+static struct test_case_t {
+	int fd1_flag;
+	int fd2_flag;
+} test_cases[] = {
+	{O_RDONLY, O_RDONLY},
+	{O_RDONLY, O_WRONLY},
+	{O_RDONLY, O_RDWR},
+	{O_WRONLY, O_RDONLY},
+	{O_WRONLY, O_WRONLY},
+	{O_WRONLY, O_RDWR},
+	{O_RDWR, O_RDONLY},
+	{O_RDWR, O_WRONLY},
+	{O_RDWR, O_RDWR},
+};
+
+char *TCID = "fcntl32";
+int TST_TOTAL = ARRAY_SIZE(test_cases);
+
+int main(int ac, char **av)
+{
+	int lc;
+	int tc;
+	long type;
+
+	tst_parse_opts(ac, av, NULL, NULL);
+
+	setup();
+
+	switch ((type = tst_fs_type(cleanup, "."))) {
+	case TST_NFS_MAGIC:
+	case TST_RAMFS_MAGIC:
+	case TST_TMPFS_MAGIC:
+		tst_brkm(TCONF, cleanup, "%s filesystem does not support "
+			 "fcntl(2)'s F_SETLEASE operation",
+			 tst_fs_type_name(type));
+	default:
+		break;
+	}
+
+	for (lc = 0; TEST_LOOPING(lc); lc++) {
+		tst_count = 0;
+
+		for (tc = 0; tc < TST_TOTAL; tc++)
+			verify_fcntl(tc);
+	}
+
+	cleanup();
+	tst_exit();
+}
+
+static void setup(void)
+{
+	tst_sig(NOFORK, DEF_HANDLER, cleanup);
+	TEST_PAUSE;
+
+	tst_tmpdir();
+
+	SAFE_TOUCH(cleanup, "file", FILE_MODE, NULL);
+}
+
+static void verify_fcntl(int i)
+{
+	fd1 = SAFE_OPEN(cleanup, "file", test_cases[i].fd1_flag);
+	fd2 = SAFE_OPEN(cleanup, "file", test_cases[i].fd2_flag);
+
+	TEST(fcntl(fd1, F_SETLEASE, F_WRLCK));
+
+	if (TEST_RETURN == 0) {
+		tst_resm(TFAIL, "fcntl(F_SETLEASE, F_WRLCK) "
+			 "succeeded unexpectedly");
+	} else {
+		if (TEST_ERRNO == EBUSY || TEST_ERRNO == EAGAIN) {
+			tst_resm(TPASS | TTERRNO,
+				 "fcntl(F_SETLEASE, F_WRLCK) "
+				 "failed as expected");
+		} else {
+			tst_resm(TFAIL | TTERRNO,
+				 "fcntl(F_SETLEASE, F_WRLCK) "
+				 "failed unexpectedly, "
+				 "expected errno is EBUSY or EAGAIN");
+		}
+	}
+
+	SAFE_CLOSE(cleanup, fd1);
+	fd1 = 0;
+	SAFE_CLOSE(cleanup, fd2);
+	fd2 = 0;
+}
+
+static void cleanup(void)
+{
+	if (fd1 > 0 && close(fd1))
+		tst_resm(TWARN | TERRNO, "Failed to close file");
+
+	if (fd2 > 0 && close(fd2))
+		tst_resm(TWARN | TERRNO, "Failed to close file");
+
+	tst_rmdir();
+}
--

1.8.4.2

--
Mailing list info: http://lists.linux.it/listinfo/ltp

#3 lore raw

PATCH v3 1/1 fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

In reply to Guangwen Feng

Hi!

Quoted 10 lines
testcases/kernel/syscalls/fcntl/fcntl32.c new file +10 -0
+int main(int ac, char **av)
+{
+	int lc;
+	int tc;
+	long type;
+
+	tst_parse_opts(ac, av, NULL, NULL);
+
+	setup();
+

testcases/kernel/syscalls/fcntl/fcntl32.c line 76

Quoted 10 lines
testcases/kernel/syscalls/fcntl/fcntl32.c new file +10 -0
+	switch ((type = tst_fs_type(cleanup, "."))) {
+	case TST_NFS_MAGIC:
+	case TST_RAMFS_MAGIC:
+	case TST_TMPFS_MAGIC:
+		tst_brkm(TCONF, cleanup, "%s filesystem does not support "
+			 "fcntl(2)'s F_SETLEASE operation",
+			 tst_fs_type_name(type));
+	default:
+		break;
+	}

Same as the second one. I would preffer figuring out that the fcntl() is unsupported by actually trying to use it.

Otherwise it looks fine.

Signature · 2 lines
Cyril Hrubis
[email protected]
#4 lore raw

PATCH v3 1/1 fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

Hi!
Thanks for your reply.

Quoted 16 lines · Cyril Hrubis

Hi!

Quoted 15 lines
testcases/kernel/syscalls/fcntl/fcntl32.c new file +15 -0
+int main(int ac, char **av)
+{
+	int lc;
+	int tc;
+	long type;
+
+	tst_parse_opts(ac, av, NULL, NULL);
+
+	setup();
+
+	switch ((type = tst_fs_type(cleanup, "."))) {
+	case TST_NFS_MAGIC:
+	case TST_RAMFS_MAGIC:
+	case TST_TMPFS_MAGIC:
+		tst_brkm(TCONF, cleanup, "%s filesystem does not support "
Quoted 9 lines

testcases/kernel/syscalls/fcntl/fcntl32.c line 76

Quoted 5 lines
testcases/kernel/syscalls/fcntl/fcntl32.c new file +5 -0
+			 "fcntl(2)'s F_SETLEASE operation",
+			 tst_fs_type_name(type));
+	default:
+		break;
+	}

Same as the second one. I would preffer figuring out that the fcntl() is unsupported by actually trying to use it.

It will return EAGAIN when we actually use it, I don't think it's a reasonable errno, since on ramfs or tmpfs, when opening or creating a new file, the dentry->d_count will get an extra count to be 2 but not 1. Please have a look at the following link:
http://www.gossamer-threads.com/lists/linux/kernel/913113

I feel the expression is not clear, it should be "cannot do fcntl()'s F_SETLEASE operation on %s filesystem"

Quoted 3 lines

Otherwise it looks fine.

#5 lore raw

PATCH v4 1/1 fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

Add new testcase to verify that a write lease may be placed on a file only if there are no other open file descriptors for the file.

---
 runtest/ltplite                           |   1 +
 runtest/stress.part3                      |   1 +
 runtest/syscalls                          |   2 +
 testcases/kernel/syscalls/.gitignore      |   2 +
 testcases/kernel/syscalls/fcntl/fcntl32.c | 135 ++++++++++++++++++++++++++++++
 5 files changed, 141 insertions(+)
 create mode 100644 testcases/kernel/syscalls/fcntl/fcntl32.c
runtest/ltplite +1 -0
index 7f3efdc..63a1583 100644
@@ -225,6 +225,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/stress.part3 +1 -0
index ab9af3c..ca8b70c 100644
@@ -164,6 +164,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/syscalls +2 -0
index c54a637..db03ccc 100644
@@ -258,6 +258,8 @@ fcntl30 fcntl30
 fcntl30_64 fcntl30_64
 fcntl31 fcntl31
 fcntl31_64 fcntl31_64
+fcntl32 fcntl32
+fcntl32_64 fcntl32_64
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
testcases/kernel/syscalls/.gitignore +2 -0
index 9f659c5..3bba587 100644
@@ -221,6 +221,8 @@
 /fcntl/fcntl30_64
 /fcntl/fcntl31
 /fcntl/fcntl31_64
+/fcntl/fcntl32
+/fcntl/fcntl32_64
 /fdatasync/fdatasync01
 /fdatasync/fdatasync02
 /flock/flock01
testcases/kernel/syscalls/fcntl/fcntl32.c new file +135 -0

135 lines not on this page · raw message

Signature · 1 line
1.8.4.2
#6 lore raw

PATCH v3 1/1 fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

In reply to Guangwen Feng

Hi!

Quoted 8 lines
Quoted 3 lines

Same as the second one. I would preffer figuring out that the fcntl() is unsupported by actually trying to use it.

It will return EAGAIN when we actually use it, I don't think it's a reasonable errno, since on ramfs or tmpfs, when opening or creating a new file, the dentry->d_count will get an extra count to be 2 but not 1. Please have a look at the following link:
http://www.gossamer-threads.com/lists/linux/kernel/913113

Hmm, so the kernel thinks that the file has been opened two times allready and returns EAGAIN when we try the lock. It may be better to just to skip these filesystems as you did then, since it's unlikely that somebody will fix this in kernel.

Signature · 2 lines
Cyril Hrubis
[email protected]
#7 lore raw

PATCH v5 1/1 fcntl/fcntl32.c: add F_SETLEASE and F_WRLCK argument test

Add new testcase to verify that a write lease may be placed on a file only if there are no other open file descriptors for the file.

---
 runtest/ltplite                           |   1 +
 runtest/stress.part3                      |   1 +
 runtest/syscalls                          |   2 +
 testcases/kernel/syscalls/.gitignore      |   2 +
 testcases/kernel/syscalls/fcntl/fcntl32.c | 138 ++++++++++++++++++++++++++++++
 5 files changed, 144 insertions(+)
 create mode 100644 testcases/kernel/syscalls/fcntl/fcntl32.c
runtest/ltplite +1 -0
index 7f3efdc..63a1583 100644
@@ -225,6 +225,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/stress.part3 +1 -0
index ab9af3c..ca8b70c 100644
@@ -164,6 +164,7 @@ fcntl26 fcntl26
 fcntl29 fcntl29
 fcntl30 fcntl30
 fcntl31 fcntl31
+fcntl32 fcntl32
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
runtest/syscalls +2 -0
index 1b53fb0..bce4865 100644
@@ -258,6 +258,8 @@ fcntl30 fcntl30
 fcntl30_64 fcntl30_64
 fcntl31 fcntl31
 fcntl31_64 fcntl31_64
+fcntl32 fcntl32
+fcntl32_64 fcntl32_64
 
 fdatasync01 fdatasync01
 fdatasync02 fdatasync02
testcases/kernel/syscalls/.gitignore +2 -0
index 7822b2e..d085ed6 100644
@@ -221,6 +221,8 @@
 /fcntl/fcntl30_64
 /fcntl/fcntl31
 /fcntl/fcntl31_64
+/fcntl/fcntl32
+/fcntl/fcntl32_64
 /fdatasync/fdatasync01
 /fdatasync/fdatasync02
 /flock/flock01
testcases/kernel/syscalls/fcntl/fcntl32.c new file +138 -0

138 lines not on this page · raw message

Signature · 1 line
1.8.4.2