Add new testcase to verify the flag UMOUNT_NOFOLLOW of umount2(2). Signed-off-by: Guangwen Feng <fenggw-f...@cn.fujitsu.com> --- runtest/ltplite | 1 + runtest/syscalls | 1 + testcases/kernel/syscalls/.gitignore | 1 + testcases/kernel/syscalls/umount2/umount2_03.c | 165 +++++++++++++++++++++++++ 4 files changed, 168 insertions(+) create mode 100644 testcases/kernel/syscalls/umount2/umount2_03.c
diff --git a/runtest/ltplite b/runtest/ltplite index 8b37b5a..1f4ea20 100644 --- a/runtest/ltplite +++ b/runtest/ltplite @@ -968,6 +968,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 51db050..4c3d891 100644 --- a/runtest/syscalls +++ b/runtest/syscalls @@ -1317,6 +1317,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 8cda77c..7b5c994 100644 --- a/testcases/kernel/syscalls/.gitignore +++ b/testcases/kernel/syscalls/.gitignore @@ -1005,6 +1005,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..8561156 --- /dev/null +++ b/testcases/kernel/syscalls/umount2/umount2_03.c @@ -0,0 +1,165 @@ +/* + * Copyright (c) 2015 Fujitsu Ltd. + * Author: Guangwen Feng <fenggw-f...@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" + +#define DIR_MODE (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH) +#define MNTPOINT "mntpoint" +#define SYMLINK "symlink" + +static void setup(void); +static void test_umount2(int i); +static void verify_failure(int i); +static void verify_success(int i); +static void cleanup(void); + +static const char *device; +static const char *fs_type; + +static int mount_flag; + +static struct test_case_t { + const char *mntpoint; + int exp_errno; + const char *string; +} test_cases[] = { + {SYMLINK, EINVAL, + "umount2('symlink', UMOUNT_NOFOLLOW) expected EINVAL"}, + {MNTPOINT, 0, + "umount2('mntpoint', UMOUNT_NOFOLLOW) expected success"}, +}; + +char *TCID = "umount2_03"; +int TST_TOTAL = ARRAY_SIZE(test_cases); + +int main(int ac, char **av) +{ + int lc; + int tc; + + tst_parse_opts(ac, av, NULL, NULL); + + setup(); + + for (lc = 0; TEST_LOOPING(lc); lc++) { + tst_count = 0; + + for (tc = 0; tc < TST_TOTAL; tc++) + test_umount2(tc); + } + + cleanup(); + tst_exit(); +} + +static void setup(void) +{ + tst_require_root(); + + 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 test_umount2(int i) +{ + SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL); + mount_flag = 1; + + TEST(umount2(test_cases[i].mntpoint, UMOUNT_NOFOLLOW)); + + if (test_cases[i].exp_errno != 0) + verify_failure(i); + else + verify_success(i); + + if (mount_flag) { + SAFE_UMOUNT(cleanup, MNTPOINT); + mount_flag = 0; + } +} + +static void verify_failure(int i) +{ + if (TEST_RETURN == 0) { + tst_resm(TFAIL, "umount2(2) suceeded unexpectedly, %s", + test_cases[i].string); + mount_flag = 0; + return; + } + + if (TEST_ERRNO != test_cases[i].exp_errno) { + tst_resm(TFAIL | TTERRNO, "umount2(2) failed unexpectedly, %s", + test_cases[i].string); + return; + } + + tst_resm(TPASS, "umount2(2) failed as expected"); +} + +static void verify_success(int i) +{ + if (TEST_RETURN != 0) { + tst_resm(TFAIL | TTERRNO, "umount2(2) failed, %s", + test_cases[i].string); + return; + } + + tst_resm(TPASS, "umount2(2) succeeded as expected"); + 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 ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list