umount2/umount2_03.c: add UMOUNT_NOFOLLOW flag test
A message that is not in the archive (sent off-list or not yet received): [email protected]
A message that is not in the archive (sent off-list or not yet received): [email protected]
Hi!
Quoted 39 lines
(quoted diff) +39
-0+/* + * 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 + * 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);
Review
Quoted 10 lines
(quoted diff) +10
-0+ +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;
Same here, please name it better.
Quoted 71 lines
(quoted diff) +71
-0+} 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) {
Review
Quoted 10 lines
(quoted diff) +10
-0+ 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);
And here the message will look ugly. We should at least remove the umount2(2) so that it's shorter.
Review
Quoted 7 lines
(quoted diff) +7
-0+ 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);
Here as well.
Review
Quoted 4 lines
(quoted diff) +4
-0+ return; + } + + tst_resm(TPASS, "umount2(2) failed as expected");
Again please add which errno we got.
Review
Quoted 9 lines
(quoted diff) +9
-0+} + +static void verify_success(int i) +{ + if (TEST_RETURN != 0) { + tst_resm(TFAIL | TTERRNO, "umount2(2) failed, %s", + test_cases[i].string); + return; + }
And here.
Thinkig of it the best way would have been setting the string in the structure to:
"umount2('symlink', UMOUNT_NOFOLLOW) %s expected EINVAL"
and do tst_resm(..., tcases[i].desc, "failed unexpectedly");
But I guess that the compiler does not like when printf-like function get's formatting string that is not constant.
So we would have to live with adding the "failed unexpectedly" or "passed unexpectedly" to end of the message.
Quoted 17 lines
(quoted diff) +14
-0+ 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(); +}Signature · 1 line
1.8.4.2
Signature · 8 lines
Cyril Hrubis [email protected] ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list [email protected] https://lists.sourceforge.net/lists/listinfo/ltp-list