All of lore.kernel.org
 help / color / mirror / Atom feed
* [LTP] [PATCH 1/3] umount2/umount2_01.c: add new test
@ 2015-07-07  1:01 Guangwen Feng
  2015-07-07  1:01 ` [LTP] [PATCH 2/3] umount2/umount2_02.c: " Guangwen Feng
                   ` (2 more replies)
  0 siblings, 3 replies; 4+ messages in thread
From: Guangwen Feng @ 2015-07-07  1:01 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/umount.h                          |  34 +++++
 runtest/ltplite                                |   2 +
 runtest/syscalls                               |   2 +
 testcases/kernel/syscalls/.gitignore           |   1 +
 testcases/kernel/syscalls/umount2/Makefile     |  23 ++++
 testcases/kernel/syscalls/umount2/umount2_01.c | 176 +++++++++++++++++++++++++
 6 files changed, 238 insertions(+)
 create mode 100644 include/lapi/umount.h
 create mode 100644 testcases/kernel/syscalls/umount2/Makefile
 create mode 100644 testcases/kernel/syscalls/umount2/umount2_01.c

diff --git a/include/lapi/umount.h b/include/lapi/umount.h
new file mode 100644
index 0000000..67858e1
--- /dev/null
+++ b/include/lapi/umount.h
@@ -0,0 +1,34 @@
+/*
+ * 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 would 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.
+ */
+
+#ifndef __LAPI_UMOUNT_H__
+#define __LAPI_UMOUNT_H__
+
+#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 /* __LAPI_UMOUNT_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..7c59c06
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/umount2_01.c
@@ -0,0 +1,176 @@
+/*
+ * 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/umount.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 fd_new;
+static int mount_flag;
+
+static char buf[256];
+
+static const char *device;
+static const char *fs_type;
+static const char *str = "abcdefghijklmnopqrstuvwxyz";
+
+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)
+{
+	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
+	mount_flag = 1;
+
+	fd = SAFE_CREAT(cleanup, MNTPOINT "/file", FILE_MODE);
+
+	do {
+		TEST(umount2(MNTPOINT, MNT_DETACH));
+
+		if (TEST_RETURN != 0) {
+			tst_resm(TFAIL, "umount2(2) Failed while "
+				"unmounting %s errno = %d : %s",
+				MNTPOINT, TEST_ERRNO,
+				strerror(TEST_ERRNO));
+			break;
+		}
+
+		mount_flag = 0;
+
+		/* check the unavailability for new access */
+		fd_new = open(MNTPOINT "/file", O_RDONLY);
+
+		if (fd_new != -1) {
+			tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
+				"performed abnormally "
+				"expected error = %d : %s",
+				ENOENT, strerror(ENOENT));
+			break;
+		}
+
+		/*
+		 * check the old fd still points to the file
+		 * in previous mount point and is available
+		 */
+		SAFE_WRITE(cleanup, 0, 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);
+
+		SAFE_READ(cleanup, 0, fd, buf, 255);
+
+		if (strcmp(str, buf)) {
+			tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
+				"performed abnormally");
+			break;
+		}
+
+		tst_resm(TPASS, "umount2(2) Passed");
+	} while (0);
+
+	if (fd_new > 0) {
+		SAFE_CLOSE(cleanup, fd_new);
+		fd_new = 0;
+	}
+
+	SAFE_CLOSE(cleanup, fd);
+	fd = 0;
+
+	if (mount_flag) {
+		SAFE_UMOUNT(cleanup, MNTPOINT);
+		mount_flag = 0;
+	}
+}
+
+static void cleanup(void)
+{
+	if (fd_new > 0 && close(fd_new))
+		tst_resm(TWARN | TERRNO, "Failed to close file");
+
+	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] 4+ messages in thread

* [LTP] [PATCH 2/3] umount2/umount2_02.c: add new test
  2015-07-07  1:01 [LTP] [PATCH 1/3] umount2/umount2_01.c: add new test Guangwen Feng
@ 2015-07-07  1:01 ` Guangwen Feng
  2015-07-07  1:01 ` [LTP] [PATCH 3/3] umount2/umount2_03.c: " Guangwen Feng
  2015-07-13 11:11 ` [LTP] [PATCH 1/3] umount2/umount2_01.c: " Cyril Hrubis
  2 siblings, 0 replies; 4+ messages in thread
From: Guangwen Feng @ 2015-07-07  1:01 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 | 206 +++++++++++++++++++++++++
 4 files changed, 209 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..30e5047
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/umount2_02.c
@@ -0,0 +1,206 @@
+/*
+ * 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/umount.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;
+
+	do {
+		if (umount2_verify_1())
+			break;
+
+		if (umount2_verify_2())
+			break;
+
+		/* 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())
+			break;
+
+		if (umount2_verify_3())
+			break;
+
+		mount_flag = 0;
+
+		tst_resm(TPASS, "umount2(2) Passed");
+	} while (0);
+
+	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, "umount2(2) Failed while "
+			"unmounting %s errno = %d : %s",
+			MNTPOINT, TEST_ERRNO,
+			strerror(TEST_ERRNO));
+		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] 4+ messages in thread

* [LTP] [PATCH 3/3] umount2/umount2_03.c: add new test
  2015-07-07  1:01 [LTP] [PATCH 1/3] umount2/umount2_01.c: add new test Guangwen Feng
  2015-07-07  1:01 ` [LTP] [PATCH 2/3] umount2/umount2_02.c: " Guangwen Feng
@ 2015-07-07  1:01 ` Guangwen Feng
  2015-07-13 11:11 ` [LTP] [PATCH 1/3] umount2/umount2_01.c: " Cyril Hrubis
  2 siblings, 0 replies; 4+ messages in thread
From: Guangwen Feng @ 2015-07-07  1:01 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 | 142 +++++++++++++++++++++++++
 4 files changed, 145 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..470fe1e
--- /dev/null
+++ b/testcases/kernel/syscalls/umount2/umount2_03.c
@@ -0,0 +1,142 @@
+/*
+ * 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/umount.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;
+
+	do {
+		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;
+			break;
+		}
+
+		TEST(umount2(MNTPOINT, UMOUNT_NOFOLLOW));
+
+		if (TEST_RETURN != 0) {
+			tst_resm(TFAIL, "umount2(2) Failed while "
+				"unmounting %s errno = %d : %s",
+				MNTPOINT, TEST_ERRNO,
+				strerror(TEST_ERRNO));
+			break;
+		}
+
+		mount_flag = 0;
+
+		tst_resm(TPASS, "umount2(2) Passed");
+	} while (0);
+
+	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] 4+ messages in thread

* Re: [LTP] [PATCH 1/3] umount2/umount2_01.c: add new test
  2015-07-07  1:01 [LTP] [PATCH 1/3] umount2/umount2_01.c: add new test Guangwen Feng
  2015-07-07  1:01 ` [LTP] [PATCH 2/3] umount2/umount2_02.c: " Guangwen Feng
  2015-07-07  1:01 ` [LTP] [PATCH 3/3] umount2/umount2_03.c: " Guangwen Feng
@ 2015-07-13 11:11 ` Cyril Hrubis
  2 siblings, 0 replies; 4+ messages in thread
From: Cyril Hrubis @ 2015-07-13 11:11 UTC (permalink / raw)
  To: Guangwen Feng; +Cc: ltp-list

Hi!
> +#ifndef MNT_DETACH
> +#define MNT_DETACH 2
> +#endif
> +
> +#ifndef MNT_EXPIRE
> +#define MNT_EXPIRE 4
> +#endif
> +
> +#ifndef UMOUNT_NOFOLLOW
> +#define UMOUNT_NOFOLLOW 8
> +#endif

We may add these to allready exsting lapi/mount.h.

> +static int fd;
> +static int fd_new;
> +static int mount_flag;
> +
> +static char buf[256];
> +
> +static const char *device;
> +static const char *fs_type;
> +static const char *str = "abcdefghijklmnopqrstuvwxyz";

The buf and str are used only in the verify function, why don't decleare
them as local variables there?

> +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)
> +{
> +	SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
> +	mount_flag = 1;
> +
> +	fd = SAFE_CREAT(cleanup, MNTPOINT "/file", FILE_MODE);
> +
> +	do {
> +		TEST(umount2(MNTPOINT, MNT_DETACH));
> +
> +		if (TEST_RETURN != 0) {
> +			tst_resm(TFAIL, "umount2(2) Failed while "
> +				"unmounting %s errno = %d : %s",
> +				MNTPOINT, TEST_ERRNO,
> +				strerror(TEST_ERRNO));

                                Use TFAIL | TTERRNO instead of printing
				the TEST_ERRNO yourself.

> +			break;
> +		}
> +
> +		mount_flag = 0;
> +
> +		/* check the unavailability for new access */
> +		fd_new = open(MNTPOINT "/file", O_RDONLY);

                What about access() with F_OK instead?

> +		if (fd_new != -1) {
> +			tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
> +				"performed abnormally "
> +				"expected error = %d : %s",
> +				ENOENT, strerror(ENOENT));

                                Eh, this is misleading, the errno may
				NOT be ENOENT here.

> +			break;
> +		}
> +
> +		/*
> +		 * check the old fd still points to the file
> +		 * in previous mount point and is available
> +		 */
> +		SAFE_WRITE(cleanup, 0, fd, str, strlen(str));

The second parameter should be set to 1 here as we want to assert that
the whole buffer was written. And the same for the SAFE_READ() below.

> +		SAFE_CLOSE(cleanup, fd);
> +
> +		SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
> +		mount_flag = 1;
> +
> +		fd = SAFE_OPEN(cleanup, MNTPOINT "/file", O_RDONLY);
> +
> +		SAFE_READ(cleanup, 0, fd, buf, 255);
> +
> +		if (strcmp(str, buf)) {
> +			tst_resm(TFAIL, "umount2(2) MNT_DETACH flag "
> +				"performed abnormally");
> +			break;
> +		}
> +
> +		tst_resm(TPASS, "umount2(2) Passed");
> +	} while (0);

The do { } while (0); here is ugly as it adds unceccessary level of
indentation. Either use tst_brkm() instead of tst_resm() or use the
kernel style goto (have a look at Linux kernel CodingStyle if you are
not familiar with that).

> +	if (fd_new > 0) {
> +		SAFE_CLOSE(cleanup, fd_new);
> +		fd_new = 0;
> +	}
> +
> +	SAFE_CLOSE(cleanup, fd);
> +	fd = 0;
> +
> +	if (mount_flag) {
> +		SAFE_UMOUNT(cleanup, MNTPOINT);
> +		mount_flag = 0;
> +	}
> +}
> +
> +static void cleanup(void)
> +{
> +	if (fd_new > 0 && close(fd_new))
> +		tst_resm(TWARN | TERRNO, "Failed to close file");
> +
> +	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

------------------------------------------------------------------------------
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	[flat|nested] 4+ messages in thread

end of thread, other threads:[~2015-07-13 11:12 UTC | newest]

Thread overview: 4+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-07-07  1:01 [LTP] [PATCH 1/3] umount2/umount2_01.c: add new test Guangwen Feng
2015-07-07  1:01 ` [LTP] [PATCH 2/3] umount2/umount2_02.c: " Guangwen Feng
2015-07-07  1:01 ` [LTP] [PATCH 3/3] umount2/umount2_03.c: " Guangwen Feng
2015-07-13 11:11 ` [LTP] [PATCH 1/3] umount2/umount2_01.c: " 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.