All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test
@ 2015-07-15  8:36 Guangwen Feng
  2015-07-15  8:36 ` [LTP] [PATCH v2 2/3] umount2/umount2_02.c: " Guangwen Feng
                   ` (3 more replies)
  0 siblings, 4 replies; 7+ messages in thread
From: Guangwen Feng @ 2015-07-15  8:36 UTC (permalink / raw)
  To: ltp-list

Add new testcase to verify the flag MNT_DETACH of umount2(2).

Signed-off-by: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
---
 include/lapi/mount.h                           |  12 ++
 runtest/ltplite                                |   2 +
 runtest/syscalls                               |   2 +
 testcases/kernel/syscalls/.gitignore           |   1 +
 testcases/kernel/syscalls/umount2/Makefile     |  23 ++++
 testcases/kernel/syscalls/umount2/umount2_01.c | 164 +++++++++++++++++++++++++
 6 files changed, 204 insertions(+)
 create mode 100644 testcases/kernel/syscalls/umount2/Makefile
 create mode 100644 testcases/kernel/syscalls/umount2/umount2_01.c

diff --git a/include/lapi/mount.h b/include/lapi/mount.h
index c37f8c0..74e85c7 100644
--- a/include/lapi/mount.h
+++ b/include/lapi/mount.h
@@ -23,4 +23,16 @@
 #define MS_STRICTATIME  1 << 24
 #endif
 
+#ifndef MNT_DETACH
+#define MNT_DETACH 2
+#endif
+
+#ifndef MNT_EXPIRE
+#define MNT_EXPIRE 4
+#endif
+
+#ifndef UMOUNT_NOFOLLOW
+#define UMOUNT_NOFOLLOW 8
+#endif
+
 #endif /* __MOUNT_H__ */
diff --git a/runtest/ltplite b/runtest/ltplite
index 3bc681c..5f8ef8c 100644
--- a/runtest/ltplite
+++ b/runtest/ltplite
@@ -965,6 +965,8 @@ unlink08 unlink08
 #umount02 umount02 -D /dev/...
 #umount03 umount03 -D /dev/...
 
+umount2_01 umount2_01
+
 ustat01 ustat01
 ustat02 ustat02
 
diff --git a/runtest/syscalls b/runtest/syscalls
index 70d4945..762730f 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1314,6 +1314,8 @@ umount01 umount01
 umount02 umount02
 umount03 umount03
 
+umount2_01 umount2_01
+
 ustat01 ustat01
 ustat02 ustat02
 
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 172aeec..542ec3b 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -1002,6 +1002,7 @@
 /umount/umount01
 /umount/umount02
 /umount/umount03
+/umount2/umount2_01
 /uname/uname01
 /uname/uname02
 /uname/uname03
diff --git a/testcases/kernel/syscalls/umount2/Makefile b/testcases/kernel/syscalls/umount2/Makefile
new file mode 100644
index 0000000..bbf0541
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/Makefile
@@ -0,0 +1,23 @@
+#
+#  Copyright (c) 2015 Fujitsu Ltd.
+#  Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
+#
+#  This program is free software;  you can redistribute it and/or modify
+#  it under the terms of the GNU General Public License as published by
+#  the Free Software Foundation; either version 2 of the License, or
+#  (at your option) any later version.
+#
+#  This program is distributed in the hope that it will be useful,
+#  but WITHOUT ANY WARRANTY;  without even the implied warranty of
+#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+#  the GNU General Public License for more details.
+#
+#  You should have received a copy of the GNU General Public License
+#  along with this program.
+#
+
+top_srcdir		?= ../../../..
+
+include $(top_srcdir)/include/mk/testcases.mk
+
+include $(top_srcdir)/include/mk/generic_leaf_target.mk
diff --git a/testcases/kernel/syscalls/umount2/umount2_01.c b/testcases/kernel/syscalls/umount2/umount2_01.c
new file mode 100644
index 0000000..d301817
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/umount2_01.c
@@ -0,0 +1,164 @@
+/*
+ * Copyright (c) 2015 Fujitsu Ltd.
+ * Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
+ *
+ * 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
+ *  Test for feature MNT_DETACH of umount2().
+ *  "Perform a lazy unmount: make the mount point unavailable for
+ *   new accesses, and actually perform the unmount when the mount
+ *   point ceases to be busy."
+ */
+
+#include <errno.h>
+#include <sys/mount.h>
+
+#include "test.h"
+#include "safe_macros.h"
+#include "lapi/mount.h"
+
+static void setup(void);
+static void umount2_verify(void);
+static void cleanup(void);
+
+char *TCID = "umount2_01";
+int TST_TOTAL = 1;
+
+#define DIR_MODE	(S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
+#define FILE_MODE	(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID)
+#define MNTPOINT	"mntpoint"
+
+static int fd;
+static int mount_flag;
+
+static const char *device;
+static const char *fs_type;
+
+int main(int ac, char **av)
+{
+	int lc;
+
+	tst_parse_opts(ac, av, NULL, NULL);
+
+	setup();
+
+	for (lc = 0; TEST_LOOPING(lc); lc++) {
+		tst_count = 0;
+
+		umount2_verify();
+	}
+
+	cleanup();
+	tst_exit();
+}
+
+static void setup(void)
+{
+	tst_require_root(NULL);
+
+	tst_sig(NOFORK, DEF_HANDLER, NULL);
+
+	tst_tmpdir();
+
+	fs_type = tst_dev_fs_type();
+	device = tst_acquire_device(cleanup);
+
+	if (!device)
+		tst_brkm(TCONF, cleanup, "Failed to obtain block device");
+
+	tst_mkfs(cleanup, device, fs_type, NULL);
+
+	SAFE_MKDIR(cleanup, MNTPOINT, DIR_MODE);
+
+	TEST_PAUSE;
+}
+
+static void umount2_verify(void)
+{
+	int ret;
+	char buf[256];
+	const char *str = "abcdefghijklmnopqrstuvwxyz";
+
+	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
+	mount_flag = 1;
+
+	fd = SAFE_CREAT(cleanup, MNTPOINT "/file", FILE_MODE);
+
+	TEST(umount2(MNTPOINT, MNT_DETACH));
+
+	if (TEST_RETURN != 0) {
+		tst_resm(TFAIL | TTERRNO, "umount2(2) Failed");
+		goto EXIT;
+	}
+
+	mount_flag = 0;
+
+	/* check the unavailability for new access */
+	ret = access(MNTPOINT "/file", F_OK);
+
+	if (ret != -1) {
+		tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
+			"performed abnormally");
+		goto EXIT;
+	}
+
+	/*
+	 * check the old fd still points to the file
+	 * in previous mount point and is available
+	 */
+	SAFE_WRITE(cleanup, 1, fd, str, strlen(str));
+
+	SAFE_CLOSE(cleanup, fd);
+
+	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
+	mount_flag = 1;
+
+	fd = SAFE_OPEN(cleanup, MNTPOINT "/file", O_RDONLY);
+
+	memset(buf, 0, sizeof(buf));
+
+	SAFE_READ(cleanup, 1, fd, buf, strlen(str));
+
+	if (strcmp(str, buf)) {
+		tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
+			"performed abnormally");
+		goto EXIT;
+	}
+
+	tst_resm(TPASS, "umount2(2) Passed");
+
+EXIT:
+	SAFE_CLOSE(cleanup, fd);
+	fd = 0;
+
+	if (mount_flag) {
+		SAFE_UMOUNT(cleanup, MNTPOINT);
+		mount_flag = 0;
+	}
+}
+
+static void cleanup(void)
+{
+	if (fd > 0 && close(fd))
+		tst_resm(TWARN | TERRNO, "Failed to close file");
+
+	if (mount_flag && tst_umount(MNTPOINT))
+		tst_resm(TWARN | TERRNO, "Failed to unmount");
+
+	if (device)
+		tst_release_device(NULL, device);
+
+	tst_rmdir();
+}
-- 
1.8.4.2


------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [LTP] [PATCH v2 2/3] umount2/umount2_02.c: add new test
  2015-07-15  8:36 [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test Guangwen Feng
@ 2015-07-15  8:36 ` Guangwen Feng
  2015-08-04 17:27   ` Cyril Hrubis
  2015-07-15  8:36 ` [LTP] [PATCH v2 3/3] umount2/umount2_03.c: " Guangwen Feng
                   ` (2 subsequent siblings)
  3 siblings, 1 reply; 7+ messages in thread
From: Guangwen Feng @ 2015-07-15  8:36 UTC (permalink / raw)
  To: ltp-list

Add new testcase to verify the flag MNT_EXPIRE of umount2(2).

Signed-off-by: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
---
 runtest/ltplite                                |   1 +
 runtest/syscalls                               |   1 +
 testcases/kernel/syscalls/.gitignore           |   1 +
 testcases/kernel/syscalls/umount2/umount2_02.c | 202 +++++++++++++++++++++++++
 4 files changed, 205 insertions(+)
 create mode 100644 testcases/kernel/syscalls/umount2/umount2_02.c

diff --git a/runtest/ltplite b/runtest/ltplite
index 5f8ef8c..f5a8a52 100644
--- a/runtest/ltplite
+++ b/runtest/ltplite
@@ -966,6 +966,7 @@ unlink08 unlink08
 #umount03 umount03 -D /dev/...
 
 umount2_01 umount2_01
+umount2_02 umount2_02
 
 ustat01 ustat01
 ustat02 ustat02
diff --git a/runtest/syscalls b/runtest/syscalls
index 762730f..92716d2 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1315,6 +1315,7 @@ umount02 umount02
 umount03 umount03
 
 umount2_01 umount2_01
+umount2_02 umount2_02
 
 ustat01 ustat01
 ustat02 ustat02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 542ec3b..4ee0b0d 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -1003,6 +1003,7 @@
 /umount/umount02
 /umount/umount03
 /umount2/umount2_01
+/umount2/umount2_02
 /uname/uname01
 /uname/uname02
 /uname/uname03
diff --git a/testcases/kernel/syscalls/umount2/umount2_02.c b/testcases/kernel/syscalls/umount2/umount2_02.c
new file mode 100644
index 0000000..7ec7758
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/umount2_02.c
@@ -0,0 +1,202 @@
+/*
+ * Copyright (c) 2015 Fujitsu Ltd.
+ * Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
+ *
+ * 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
+ *  Test for feature MNT_EXPIRE of umount2().
+ *  "Mark the mount point as expired.If a mount point is not currently
+ *   in use, then an initial call to umount2() with this flag fails with
+ *   the error EAGAIN, but marks the mount point as expired. The mount
+ *   point remains expired as long as it isn't accessed by any process.
+ *   A second umount2() call specifying MNT_EXPIRE unmounts an expired
+ *   mount point. This flag cannot be specified with either MNT_FORCE or
+ *   MNT_DETACH. (fails with the error EINVAL)"
+ */
+
+#include <errno.h>
+#include <sys/mount.h>
+
+#include "test.h"
+#include "safe_macros.h"
+#include "lapi/mount.h"
+
+static void setup(void);
+static void umount2_verify(void);
+static int umount2_verify_1(void);
+static int umount2_verify_2(void);
+static int umount2_verify_3(void);
+static void cleanup(void);
+
+char *TCID = "umount2_02";
+int TST_TOTAL = 1;
+
+#define DIR_MODE	(S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
+#define FILE_MODE	(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID)
+#define MNTPOINT	"mntpoint"
+#define EXP_ERRNO	EAGAIN
+
+static int fd;
+static int mount_flag;
+
+static const char *device;
+static const char *fs_type;
+
+int main(int ac, char **av)
+{
+	int lc;
+
+	tst_parse_opts(ac, av, NULL, NULL);
+
+	setup();
+
+	for (lc = 0; TEST_LOOPING(lc); lc++) {
+		tst_count = 0;
+
+		umount2_verify();
+	}
+
+	cleanup();
+	tst_exit();
+}
+
+static void setup(void)
+{
+	tst_require_root(NULL);
+
+	if ((tst_kvercmp(2, 6, 8)) < 0) {
+		tst_brkm(TCONF, NULL, "This test can only run on kernels "
+			"that are 2.6.8 or higher");
+	}
+
+	tst_sig(NOFORK, DEF_HANDLER, NULL);
+
+	tst_tmpdir();
+
+	fs_type = tst_dev_fs_type();
+	device = tst_acquire_device(cleanup);
+
+	if (!device)
+		tst_brkm(TCONF, cleanup, "Failed to obtain block device");
+
+	tst_mkfs(cleanup, device, fs_type, NULL);
+
+	SAFE_MKDIR(cleanup, MNTPOINT, DIR_MODE);
+
+	TEST_PAUSE;
+}
+
+static void umount2_verify(void)
+{
+	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
+	mount_flag = 1;
+
+	if (umount2_verify_1())
+		goto EXIT;
+
+	if (umount2_verify_2())
+		goto EXIT;
+
+	/* a new accesse removes the expired mark of the mount point */
+	fd = SAFE_CREAT(cleanup, MNTPOINT "/file", FILE_MODE);
+
+	SAFE_CLOSE(cleanup, fd);
+	fd = 0;
+
+	if (umount2_verify_2())
+		goto EXIT;
+
+	if (umount2_verify_3())
+		goto EXIT;
+
+	mount_flag = 0;
+
+	tst_resm(TPASS, "umount2(2) Passed");
+
+EXIT:
+	if (mount_flag) {
+		SAFE_UMOUNT(cleanup, MNTPOINT);
+		mount_flag = 0;
+	}
+}
+
+/* MNT_EXPIRE cannot be specified with either MNT_FORCE or MNT_DETACH */
+static int umount2_verify_1(void)
+{
+	TEST(umount2(MNTPOINT, MNT_EXPIRE | MNT_FORCE));
+
+	if (TEST_RETURN == 0 || TEST_ERRNO != EINVAL) {
+		tst_resm(TFAIL | TTERRNO, "umount2(2) MNT_EXPIRE flag "
+			"performed abnormally "
+			"expected error = %d : %s",
+			EINVAL, strerror(EINVAL));
+		return 1;
+	}
+
+	TEST(umount2(MNTPOINT, MNT_EXPIRE | MNT_DETACH));
+
+	if (TEST_RETURN == 0 || TEST_ERRNO != EINVAL) {
+		tst_resm(TFAIL | TTERRNO, "umount2(2) MNT_EXPIRE flag "
+			"performed abnormally "
+			"expected error = %d : %s",
+			EINVAL, strerror(EINVAL));
+		return 1;
+	}
+
+	return 0;
+}
+
+/* the initial call to umount2() with MNT_EXPIRE flag */
+static int umount2_verify_2(void)
+{
+	TEST(umount2(MNTPOINT, MNT_EXPIRE));
+
+	if (TEST_RETURN == 0 || TEST_ERRNO != EAGAIN) {
+		tst_resm(TFAIL | TTERRNO, "umount2(2) MNT_EXPIRE flag "
+			"performed abnormally "
+			"expected error = %d : %s",
+			EAGAIN, strerror(EAGAIN));
+		return 1;
+	}
+
+	return 0;
+}
+
+/* the second call to umount2() with MNT_EXPIRE flag */
+static int umount2_verify_3(void)
+{
+	TEST(umount2(MNTPOINT, MNT_EXPIRE));
+
+	if (TEST_RETURN != 0) {
+		tst_resm(TFAIL | TTERRNO, "umount2(2) Failed");
+		return 1;
+	}
+
+	return 0;
+}
+
+static void cleanup(void)
+{
+	if (fd > 0 && close(fd))
+		tst_resm(TWARN | TERRNO, "Failed to close file");
+
+	if (mount_flag && tst_umount(MNTPOINT))
+		tst_resm(TWARN | TERRNO, "Failed to unmount");
+
+	if (device)
+		tst_release_device(NULL, device);
+
+	tst_rmdir();
+}
-- 
1.8.4.2


------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* [LTP] [PATCH v2 3/3] umount2/umount2_03.c: add new test
  2015-07-15  8:36 [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test Guangwen Feng
  2015-07-15  8:36 ` [LTP] [PATCH v2 2/3] umount2/umount2_02.c: " Guangwen Feng
@ 2015-07-15  8:36 ` Guangwen Feng
  2015-08-04 17:52   ` Cyril Hrubis
  2015-07-27 10:25 ` [LTP] [PATCH v2 1/3] umount2/umount2_01.c: " Guangwen Feng
  2015-08-04 17:17 ` Cyril Hrubis
  3 siblings, 1 reply; 7+ messages in thread
From: Guangwen Feng @ 2015-07-15  8:36 UTC (permalink / raw)
  To: ltp-list

Add new testcase to verify the flag UMOUNT_NOFOLLOW of umount2(2).

Signed-off-by: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
---
 runtest/ltplite                                |   1 +
 runtest/syscalls                               |   1 +
 testcases/kernel/syscalls/.gitignore           |   1 +
 testcases/kernel/syscalls/umount2/umount2_03.c | 138 +++++++++++++++++++++++++
 4 files changed, 141 insertions(+)
 create mode 100644 testcases/kernel/syscalls/umount2/umount2_03.c

diff --git a/runtest/ltplite b/runtest/ltplite
index f5a8a52..083e48e 100644
--- a/runtest/ltplite
+++ b/runtest/ltplite
@@ -967,6 +967,7 @@ unlink08 unlink08
 
 umount2_01 umount2_01
 umount2_02 umount2_02
+umount2_03 umount2_03
 
 ustat01 ustat01
 ustat02 ustat02
diff --git a/runtest/syscalls b/runtest/syscalls
index 92716d2..2fbf4de 100644
--- a/runtest/syscalls
+++ b/runtest/syscalls
@@ -1316,6 +1316,7 @@ umount03 umount03
 
 umount2_01 umount2_01
 umount2_02 umount2_02
+umount2_03 umount2_03
 
 ustat01 ustat01
 ustat02 ustat02
diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
index 4ee0b0d..046c909 100644
--- a/testcases/kernel/syscalls/.gitignore
+++ b/testcases/kernel/syscalls/.gitignore
@@ -1004,6 +1004,7 @@
 /umount/umount03
 /umount2/umount2_01
 /umount2/umount2_02
+/umount2/umount2_03
 /uname/uname01
 /uname/uname02
 /uname/uname03
diff --git a/testcases/kernel/syscalls/umount2/umount2_03.c b/testcases/kernel/syscalls/umount2/umount2_03.c
new file mode 100644
index 0000000..ecfc775
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/umount2_03.c
@@ -0,0 +1,138 @@
+/*
+ * Copyright (c) 2015 Fujitsu Ltd.
+ * Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
+ *
+ * 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
+ *  Test for feature UMOUNT_NOFOLLOW of umount2().
+ *  "Don't dereference target if it is a symbolic link,
+ *   and fails with the error EINVAL."
+ */
+
+#include <errno.h>
+#include <sys/mount.h>
+
+#include "test.h"
+#include "safe_macros.h"
+#include "lapi/mount.h"
+
+static void setup(void);
+static void umount2_verify(void);
+static void cleanup(void);
+
+char *TCID = "umount2_03";
+int TST_TOTAL = 1;
+
+#define DIR_MODE	(S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
+#define MNTPOINT	"mntpoint"
+#define SYMLINK	"symlink"
+
+static int mount_flag;
+
+static const char *device;
+static const char *fs_type;
+
+int main(int ac, char **av)
+{
+	int lc;
+
+	tst_parse_opts(ac, av, NULL, NULL);
+
+	setup();
+
+	for (lc = 0; TEST_LOOPING(lc); lc++) {
+		tst_count = 0;
+
+		umount2_verify();
+	}
+
+	cleanup();
+	tst_exit();
+}
+
+static void setup(void)
+{
+	tst_require_root(NULL);
+
+	if ((tst_kvercmp(2, 6, 34)) < 0) {
+		tst_brkm(TCONF, NULL, "This test can only run on kernels "
+			"that are 2.6.34 or higher");
+	}
+
+	tst_sig(NOFORK, DEF_HANDLER, NULL);
+
+	tst_tmpdir();
+
+	fs_type = tst_dev_fs_type();
+	device = tst_acquire_device(cleanup);
+
+	if (!device)
+		tst_brkm(TCONF, cleanup, "Failed to obtain block device");
+
+	tst_mkfs(cleanup, device, fs_type, NULL);
+
+	SAFE_MKDIR(cleanup, MNTPOINT, DIR_MODE);
+
+	SAFE_SYMLINK(cleanup, MNTPOINT, SYMLINK);
+
+	TEST_PAUSE;
+}
+
+static void umount2_verify(void)
+{
+	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
+	mount_flag = 1;
+
+	TEST(umount2(SYMLINK, UMOUNT_NOFOLLOW));
+
+	if (TEST_RETURN == 0 || TEST_ERRNO != EINVAL) {
+		tst_resm(TFAIL | TTERRNO,
+			"umount2(2) UMOUNT_NOFOLLOW flag "
+			"performed abnormally "
+			"expected error = %d : %s",
+			EINVAL, strerror(EINVAL));
+		if (TEST_RETURN == 0)
+			mount_flag = 0;
+		goto EXIT;
+	}
+
+	TEST(umount2(MNTPOINT, UMOUNT_NOFOLLOW));
+
+	if (TEST_RETURN != 0) {
+		tst_resm(TFAIL | TTERRNO, "umount2(2) Failed");
+		goto EXIT;
+	}
+
+	mount_flag = 0;
+
+	tst_resm(TPASS, "umount2(2) Passed");
+
+EXIT:
+	if (mount_flag) {
+		SAFE_UMOUNT(cleanup, MNTPOINT);
+		mount_flag = 0;
+	}
+}
+
+static void cleanup(void)
+{
+	if (mount_flag && tst_umount(MNTPOINT))
+		tst_resm(TWARN | TERRNO, "Failed to unmount");
+
+	if (device)
+		tst_release_device(NULL, device);
+
+	tst_rmdir();
+}
-- 
1.8.4.2


------------------------------------------------------------------------------
Don't Limit Your Business. Reach for the Cloud.
GigeNET's Cloud Solutions provide you with the tools and support that
you need to offload your IT needs and focus on growing your business.
Configured For All Businesses. Start Your Cloud Today.
https://www.gigenetcloud.com/
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply related	[flat|nested] 7+ messages in thread

* Re: [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test
  2015-07-15  8:36 [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test Guangwen Feng
  2015-07-15  8:36 ` [LTP] [PATCH v2 2/3] umount2/umount2_02.c: " Guangwen Feng
  2015-07-15  8:36 ` [LTP] [PATCH v2 3/3] umount2/umount2_03.c: " Guangwen Feng
@ 2015-07-27 10:25 ` Guangwen Feng
  2015-08-04 17:17 ` Cyril Hrubis
  3 siblings, 0 replies; 7+ messages in thread
From: Guangwen Feng @ 2015-07-27 10:25 UTC (permalink / raw)
  To: ltp-list

Hello,

Ping.

Best Regards,
Guangwen Feng
于 2015年07月15日 16:36, Guangwen Feng 写道:
> Add new testcase to verify the flag MNT_DETACH of umount2(2).
> 
> Signed-off-by: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
> ---
>  include/lapi/mount.h                           |  12 ++
>  runtest/ltplite                                |   2 +
>  runtest/syscalls                               |   2 +
>  testcases/kernel/syscalls/.gitignore           |   1 +
>  testcases/kernel/syscalls/umount2/Makefile     |  23 ++++
>  testcases/kernel/syscalls/umount2/umount2_01.c | 164 +++++++++++++++++++++++++
>  6 files changed, 204 insertions(+)
>  create mode 100644 testcases/kernel/syscalls/umount2/Makefile
>  create mode 100644 testcases/kernel/syscalls/umount2/umount2_01.c
> 
> diff --git a/include/lapi/mount.h b/include/lapi/mount.h
> index c37f8c0..74e85c7 100644
> --- a/include/lapi/mount.h
> +++ b/include/lapi/mount.h
> @@ -23,4 +23,16 @@
>  #define MS_STRICTATIME  1 << 24
>  #endif
>  
> +#ifndef MNT_DETACH
> +#define MNT_DETACH 2
> +#endif
> +
> +#ifndef MNT_EXPIRE
> +#define MNT_EXPIRE 4
> +#endif
> +
> +#ifndef UMOUNT_NOFOLLOW
> +#define UMOUNT_NOFOLLOW 8
> +#endif
> +
>  #endif /* __MOUNT_H__ */
> diff --git a/runtest/ltplite b/runtest/ltplite
> index 3bc681c..5f8ef8c 100644
> --- a/runtest/ltplite
> +++ b/runtest/ltplite
> @@ -965,6 +965,8 @@ unlink08 unlink08
>  #umount02 umount02 -D /dev/...
>  #umount03 umount03 -D /dev/...
>  
> +umount2_01 umount2_01
> +
>  ustat01 ustat01
>  ustat02 ustat02
>  
> diff --git a/runtest/syscalls b/runtest/syscalls
> index 70d4945..762730f 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -1314,6 +1314,8 @@ umount01 umount01
>  umount02 umount02
>  umount03 umount03
>  
> +umount2_01 umount2_01
> +
>  ustat01 ustat01
>  ustat02 ustat02
>  
> diff --git a/testcases/kernel/syscalls/.gitignore b/testcases/kernel/syscalls/.gitignore
> index 172aeec..542ec3b 100644
> --- a/testcases/kernel/syscalls/.gitignore
> +++ b/testcases/kernel/syscalls/.gitignore
> @@ -1002,6 +1002,7 @@
>  /umount/umount01
>  /umount/umount02
>  /umount/umount03
> +/umount2/umount2_01
>  /uname/uname01
>  /uname/uname02
>  /uname/uname03
> diff --git a/testcases/kernel/syscalls/umount2/Makefile b/testcases/kernel/syscalls/umount2/Makefile
> new file mode 100644
> index 0000000..bbf0541
> --- /dev/null
> +++ b/testcases/kernel/syscalls/umount2/Makefile
> @@ -0,0 +1,23 @@
> +#
> +#  Copyright (c) 2015 Fujitsu Ltd.
> +#  Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
> +#
> +#  This program is free software;  you can redistribute it and/or modify
> +#  it under the terms of the GNU General Public License as published by
> +#  the Free Software Foundation; either version 2 of the License, or
> +#  (at your option) any later version.
> +#
> +#  This program is distributed in the hope that it will be useful,
> +#  but WITHOUT ANY WARRANTY;  without even the implied warranty of
> +#  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
> +#  the GNU General Public License for more details.
> +#
> +#  You should have received a copy of the GNU General Public License
> +#  along with this program.
> +#
> +
> +top_srcdir		?= ../../../..
> +
> +include $(top_srcdir)/include/mk/testcases.mk
> +
> +include $(top_srcdir)/include/mk/generic_leaf_target.mk
> diff --git a/testcases/kernel/syscalls/umount2/umount2_01.c b/testcases/kernel/syscalls/umount2/umount2_01.c
> new file mode 100644
> index 0000000..d301817
> --- /dev/null
> +++ b/testcases/kernel/syscalls/umount2/umount2_01.c
> @@ -0,0 +1,164 @@
> +/*
> + * Copyright (c) 2015 Fujitsu Ltd.
> + * Author: Guangwen Feng <fenggw-fnst@cn.fujitsu.com>
> + *
> + * 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
> + *  Test for feature MNT_DETACH of umount2().
> + *  "Perform a lazy unmount: make the mount point unavailable for
> + *   new accesses, and actually perform the unmount when the mount
> + *   point ceases to be busy."
> + */
> +
> +#include <errno.h>
> +#include <sys/mount.h>
> +
> +#include "test.h"
> +#include "safe_macros.h"
> +#include "lapi/mount.h"
> +
> +static void setup(void);
> +static void umount2_verify(void);
> +static void cleanup(void);
> +
> +char *TCID = "umount2_01";
> +int TST_TOTAL = 1;
> +
> +#define DIR_MODE	(S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
> +#define FILE_MODE	(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID)
> +#define MNTPOINT	"mntpoint"
> +
> +static int fd;
> +static int mount_flag;
> +
> +static const char *device;
> +static const char *fs_type;
> +
> +int main(int ac, char **av)
> +{
> +	int lc;
> +
> +	tst_parse_opts(ac, av, NULL, NULL);
> +
> +	setup();
> +
> +	for (lc = 0; TEST_LOOPING(lc); lc++) {
> +		tst_count = 0;
> +
> +		umount2_verify();
> +	}
> +
> +	cleanup();
> +	tst_exit();
> +}
> +
> +static void setup(void)
> +{
> +	tst_require_root(NULL);
> +
> +	tst_sig(NOFORK, DEF_HANDLER, NULL);
> +
> +	tst_tmpdir();
> +
> +	fs_type = tst_dev_fs_type();
> +	device = tst_acquire_device(cleanup);
> +
> +	if (!device)
> +		tst_brkm(TCONF, cleanup, "Failed to obtain block device");
> +
> +	tst_mkfs(cleanup, device, fs_type, NULL);
> +
> +	SAFE_MKDIR(cleanup, MNTPOINT, DIR_MODE);
> +
> +	TEST_PAUSE;
> +}
> +
> +static void umount2_verify(void)
> +{
> +	int ret;
> +	char buf[256];
> +	const char *str = "abcdefghijklmnopqrstuvwxyz";
> +
> +	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
> +	mount_flag = 1;
> +
> +	fd = SAFE_CREAT(cleanup, MNTPOINT "/file", FILE_MODE);
> +
> +	TEST(umount2(MNTPOINT, MNT_DETACH));
> +
> +	if (TEST_RETURN != 0) {
> +		tst_resm(TFAIL | TTERRNO, "umount2(2) Failed");
> +		goto EXIT;
> +	}
> +
> +	mount_flag = 0;
> +
> +	/* check the unavailability for new access */
> +	ret = access(MNTPOINT "/file", F_OK);
> +
> +	if (ret != -1) {
> +		tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
> +			"performed abnormally");
> +		goto EXIT;
> +	}
> +
> +	/*
> +	 * check the old fd still points to the file
> +	 * in previous mount point and is available
> +	 */
> +	SAFE_WRITE(cleanup, 1, fd, str, strlen(str));
> +
> +	SAFE_CLOSE(cleanup, fd);
> +
> +	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
> +	mount_flag = 1;
> +
> +	fd = SAFE_OPEN(cleanup, MNTPOINT "/file", O_RDONLY);
> +
> +	memset(buf, 0, sizeof(buf));
> +
> +	SAFE_READ(cleanup, 1, fd, buf, strlen(str));
> +
> +	if (strcmp(str, buf)) {
> +		tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
> +			"performed abnormally");
> +		goto EXIT;
> +	}
> +
> +	tst_resm(TPASS, "umount2(2) Passed");
> +
> +EXIT:
> +	SAFE_CLOSE(cleanup, fd);
> +	fd = 0;
> +
> +	if (mount_flag) {
> +		SAFE_UMOUNT(cleanup, MNTPOINT);
> +		mount_flag = 0;
> +	}
> +}
> +
> +static void cleanup(void)
> +{
> +	if (fd > 0 && close(fd))
> +		tst_resm(TWARN | TERRNO, "Failed to close file");
> +
> +	if (mount_flag && tst_umount(MNTPOINT))
> +		tst_resm(TWARN | TERRNO, "Failed to unmount");
> +
> +	if (device)
> +		tst_release_device(NULL, device);
> +
> +	tst_rmdir();
> +}
> 

------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test
  2015-07-15  8:36 [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test Guangwen Feng
                   ` (2 preceding siblings ...)
  2015-07-27 10:25 ` [LTP] [PATCH v2 1/3] umount2/umount2_01.c: " Guangwen Feng
@ 2015-08-04 17:17 ` Cyril Hrubis
  3 siblings, 0 replies; 7+ messages in thread
From: Cyril Hrubis @ 2015-08-04 17:17 UTC (permalink / raw)
  To: Guangwen Feng; +Cc: ltp-list

Hi!
I've fixed the call to tst_require_root() (since I've removed the unused
parameter today) and pushed this test, thanks.

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [LTP] [PATCH v2 2/3] umount2/umount2_02.c: add new test
  2015-07-15  8:36 ` [LTP] [PATCH v2 2/3] umount2/umount2_02.c: " Guangwen Feng
@ 2015-08-04 17:27   ` Cyril Hrubis
  0 siblings, 0 replies; 7+ messages in thread
From: Cyril Hrubis @ 2015-08-04 17:27 UTC (permalink / raw)
  To: Guangwen Feng; +Cc: ltp-list

Hi!
> +static void setup(void);
> +static void umount2_verify(void);
> +static int umount2_verify_1(void);
> +static int umount2_verify_2(void);
> +static int umount2_verify_3(void);
> +static void cleanup(void);
> +
> +char *TCID = "umount2_02";
> +int TST_TOTAL = 1;

This is not right. The testcase does four testcases as far as I can
tell. You should print PASS/FAIL for each of them and set TST_TOTAL = 4

> +#define DIR_MODE	(S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
> +#define FILE_MODE	(S_IRWXU | S_IRWXG | S_IRWXO | S_ISUID | S_ISGID)
> +#define MNTPOINT	"mntpoint"
> +#define EXP_ERRNO	EAGAIN

The EXP_ERRNO is not used at all, forget to remove it?

> +static int fd;
> +static int mount_flag;
> +
> +static const char *device;
> +static const char *fs_type;
> +
> +int main(int ac, char **av)
> +{
> +	int lc;
> +
> +	tst_parse_opts(ac, av, NULL, NULL);
> +
> +	setup();
> +
> +	for (lc = 0; TEST_LOOPING(lc); lc++) {
> +		tst_count = 0;
> +
> +		umount2_verify();
> +	}
> +
> +	cleanup();
> +	tst_exit();
> +}
> +
> +static void setup(void)
> +{
> +	tst_require_root(NULL);
> +
> +	if ((tst_kvercmp(2, 6, 8)) < 0) {
> +		tst_brkm(TCONF, NULL, "This test can only run on kernels "
> +			"that are 2.6.8 or higher");
> +	}
> +
> +	tst_sig(NOFORK, DEF_HANDLER, NULL);
> +
> +	tst_tmpdir();
> +
> +	fs_type = tst_dev_fs_type();
> +	device = tst_acquire_device(cleanup);
> +
> +	if (!device)
> +		tst_brkm(TCONF, cleanup, "Failed to obtain block device");
> +
> +	tst_mkfs(cleanup, device, fs_type, NULL);
> +
> +	SAFE_MKDIR(cleanup, MNTPOINT, DIR_MODE);
> +
> +	TEST_PAUSE;
> +}
> +
> +static void umount2_verify(void)
> +{
> +	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
> +	mount_flag = 1;
> +
> +	if (umount2_verify_1())
> +		goto EXIT;
> +
> +	if (umount2_verify_2())
> +		goto EXIT;
> +
> +	/* a new accesse removes the expired mark of the mount point */
> +	fd = SAFE_CREAT(cleanup, MNTPOINT "/file", FILE_MODE);
> +
> +	SAFE_CLOSE(cleanup, fd);
> +	fd = 0;
> +
> +	if (umount2_verify_2())
> +		goto EXIT;
> +
> +	if (umount2_verify_3())
> +		goto EXIT;
> +
> +	mount_flag = 0;
> +
> +	tst_resm(TPASS, "umount2(2) Passed");
> +
> +EXIT:
> +	if (mount_flag) {
> +		SAFE_UMOUNT(cleanup, MNTPOINT);
> +		mount_flag = 0;
> +	}
> +}
> +
> +/* MNT_EXPIRE cannot be specified with either MNT_FORCE or MNT_DETACH */
> +static int umount2_verify_1(void)
> +{
> +	TEST(umount2(MNTPOINT, MNT_EXPIRE | MNT_FORCE));
> +
> +	if (TEST_RETURN == 0 || TEST_ERRNO != EINVAL) {
> +		tst_resm(TFAIL | TTERRNO, "umount2(2) MNT_EXPIRE flag "
> +			"performed abnormally "
> +			"expected error = %d : %s",
> +			EINVAL, strerror(EINVAL));
                            ^
			    As last time, do not use strerror().

			    Given that the expected errno will never
			    change we can just print "expected EINVAL"
> +		return 1;
> +	}
> +
> +	TEST(umount2(MNTPOINT, MNT_EXPIRE | MNT_DETACH));
> +
> +	if (TEST_RETURN == 0 || TEST_ERRNO != EINVAL) {
> +		tst_resm(TFAIL | TTERRNO, "umount2(2) MNT_EXPIRE flag "
> +			"performed abnormally "
> +			"expected error = %d : %s",
> +			EINVAL, strerror(EINVAL));
> +		return 1;
> +	}
> +
> +	return 0;
> +}
> +
> +/* the initial call to umount2() with MNT_EXPIRE flag */
> +static int umount2_verify_2(void)
> +{
> +	TEST(umount2(MNTPOINT, MNT_EXPIRE));
> +
> +	if (TEST_RETURN == 0 || TEST_ERRNO != EAGAIN) {
> +		tst_resm(TFAIL | TTERRNO, "umount2(2) MNT_EXPIRE flag "
> +			"performed abnormally "
> +			"expected error = %d : %s",
> +			EAGAIN, strerror(EAGAIN));
> +		return 1;
> +	}
> +
> +	return 0;
> +}

This function is nearly identical to to the half of umout_verify_1().
Can you just write one verify function that takes umount flags in
parameters, expected errno and some string that describes what is
tested and use it instead both halfs of umout2_verify_1() and
umout2_verify_2()?

> +/* the second call to umount2() with MNT_EXPIRE flag */
> +static int umount2_verify_3(void)
> +{
> +	TEST(umount2(MNTPOINT, MNT_EXPIRE));
> +
> +	if (TEST_RETURN != 0) {
> +		tst_resm(TFAIL | TTERRNO, "umount2(2) Failed");
> +		return 1;
> +	}
> +
> +	return 0;
> +}

Also naming this umount2_verify_success() would be a bit more
descriptive than adding _3.

> +static void cleanup(void)
> +{
> +	if (fd > 0 && close(fd))
> +		tst_resm(TWARN | TERRNO, "Failed to close file");
> +
> +	if (mount_flag && tst_umount(MNTPOINT))
> +		tst_resm(TWARN | TERRNO, "Failed to unmount");
> +
> +	if (device)
> +		tst_release_device(NULL, device);
> +
> +	tst_rmdir();
> +}
> -- 
> 1.8.4.2
> 
> 
> ------------------------------------------------------------------------------
> Don't Limit Your Business. Reach for the Cloud.
> GigeNET's Cloud Solutions provide you with the tools and support that
> you need to offload your IT needs and focus on growing your business.
> Configured For All Businesses. Start Your Cloud Today.
> https://www.gigenetcloud.com/
> _______________________________________________
> Ltp-list mailing list
> Ltp-list@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/ltp-list

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 7+ messages in thread

* Re: [LTP] [PATCH v2 3/3] umount2/umount2_03.c: add new test
  2015-07-15  8:36 ` [LTP] [PATCH v2 3/3] umount2/umount2_03.c: " Guangwen Feng
@ 2015-08-04 17:52   ` Cyril Hrubis
  0 siblings, 0 replies; 7+ messages in thread
From: Cyril Hrubis @ 2015-08-04 17:52 UTC (permalink / raw)
  To: Guangwen Feng; +Cc: ltp-list

Hi!
> +static void umount2_verify(void)
> +{
> +	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
> +	mount_flag = 1;
> +
> +	TEST(umount2(SYMLINK, UMOUNT_NOFOLLOW));
> +
> +	if (TEST_RETURN == 0 || TEST_ERRNO != EINVAL) {
> +		tst_resm(TFAIL | TTERRNO,
> +			"umount2(2) UMOUNT_NOFOLLOW flag "
> +			"performed abnormally "
> +			"expected error = %d : %s",
> +			EINVAL, strerror(EINVAL));

Let's keep the messages short and to the point, what about:


tst_resm(TFAIL | TTERRNO,
         "umount2('symlink', UMOUNT_NOFOLLOW) failed unexpectedly, expected EINVAL");


Also it would be better if if we had separate case for the when the call
succeeded something as:

tst_resm(TFAIL, "umount2('symlink', UMOUNT_NOFOLLOW) "
         "succeeded unexpectedly");

> +		if (TEST_RETURN == 0)
> +			mount_flag = 0;
> +		goto EXIT;
> +	}
> +
> +	TEST(umount2(MNTPOINT, UMOUNT_NOFOLLOW));
> +
> +	if (TEST_RETURN != 0) {
> +		tst_resm(TFAIL | TTERRNO, "umount2(2) Failed");
> +		goto EXIT;
> +	}
> +
> +	mount_flag = 0;
> +
> +	tst_resm(TPASS, "umount2(2) Passed");
> +
> +EXIT:
> +	if (mount_flag) {
> +		SAFE_UMOUNT(cleanup, MNTPOINT);
> +		mount_flag = 0;
> +	}
> +}


Again, these are two testcases you should print two PASS/FAIL for each of
them. What about you split the verify funciton into two
umount2_verify_failure and umount2_verify_success and mount and umout
the device in each of them. That way we can make the code flow more
straightforward.

-- 
Cyril Hrubis
chrubis@suse.cz

------------------------------------------------------------------------------
_______________________________________________
Ltp-list mailing list
Ltp-list@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/ltp-list

^ permalink raw reply	[flat|nested] 7+ messages in thread

end of thread, other threads:[~2015-08-04 17:53 UTC | newest]

Thread overview: 7+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-15  8:36 [LTP] [PATCH v2 1/3] umount2/umount2_01.c: add new test Guangwen Feng
2015-07-15  8:36 ` [LTP] [PATCH v2 2/3] umount2/umount2_02.c: " Guangwen Feng
2015-08-04 17:27   ` Cyril Hrubis
2015-07-15  8:36 ` [LTP] [PATCH v2 3/3] umount2/umount2_03.c: " Guangwen Feng
2015-08-04 17:52   ` Cyril Hrubis
2015-07-27 10:25 ` [LTP] [PATCH v2 1/3] umount2/umount2_01.c: " Guangwen Feng
2015-08-04 17:17 ` Cyril Hrubis

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.