I'm sorry! I sent the wrong version.
Please ignore this one, and I will resend the patch.

Best Regards,
Guangwen Feng

On 2015/08/06 15:04, Guangwen Feng wrote:
> Add new testcase to verify the flag MNT_EXPIRE 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_02.c | 180 
> +++++++++++++++++++++++++
>  4 files changed, 183 insertions(+)
>  create mode 100644 testcases/kernel/syscalls/umount2/umount2_02.c
> 
> diff --git a/runtest/ltplite b/runtest/ltplite
> index 3c7fac6..8b37b5a 100644
> --- a/runtest/ltplite
> +++ b/runtest/ltplite
> @@ -967,6 +967,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 5fe99b9..51db050 100644
> --- a/runtest/syscalls
> +++ b/runtest/syscalls
> @@ -1316,6 +1316,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 57c64f7..8cda77c 100644
> --- a/testcases/kernel/syscalls/.gitignore
> +++ b/testcases/kernel/syscalls/.gitignore
> @@ -1004,6 +1004,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..4e62fe7
> --- /dev/null
> +++ b/testcases/kernel/syscalls/umount2/umount2_02.c
> @@ -0,0 +1,180 @@
> +/*
> + * 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 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"
> +
> +#define DIR_MODE     (S_IRWXU | S_IRWXG | S_IROTH | S_IXOTH)
> +#define MNTPOINT     "mntpoint"
> +
> +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 {
> +     int flag;
> +     int exp_errno;
> +     const char *string;
> +} test_cases[] = {
> +     {MNT_EXPIRE | MNT_FORCE, EINVAL,
> +             "umount2(2) with MNT_EXPIRE | MNT_FORCE expected EINVAL"},
> +     {MNT_EXPIRE | MNT_DETACH, EINVAL,
> +             "umount2(2) with MNT_EXPIRE | MNT_DETACH expected EINVAL"},
> +     {MNT_EXPIRE, EAGAIN,
> +             "initial call to umount2(2) with MNT_EXPIRE expected EAGAIN"},
> +     {MNT_EXPIRE, EAGAIN,
> +             "umount2(2) with MNT_EXPIRE after access(2) expected EAGAIN"},
> +     {MNT_EXPIRE, 0,
> +             "second call to umount2(2) with MNT_EXPIRE expected success"},
> +};
> +
> +char *TCID = "umount2_02";
> +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;
> +
> +             SAFE_MOUNT(cleanup, device, MNTPOINT, fs_type, 0, NULL);
> +             mount_flag = 1;
> +
> +             for (tc = 0; tc < TST_TOTAL; tc++) {
> +                     test_umount2(tc);
> +             }
> +
> +             if (mount_flag) {
> +                     SAFE_UMOUNT(cleanup, MNTPOINT);
> +                     mount_flag = 0;
> +             }
> +     }
> +
> +     cleanup();
> +     tst_exit();
> +}
> +
> +static void setup(void)
> +{
> +     tst_require_root();
> +
> +     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 test_umount2(int i)
> +{
> +     /* a new access removes the expired mark of the mount point */
> +     if (strstr(test_cases[i].string, "access(2)") != NULL) {
> +             if (access(MNTPOINT, F_OK) == -1)
> +                     tst_brkm(TBROK | TERRNO, cleanup, "access(2) failed");
> +     }
> +
> +     TEST(umount2(MNTPOINT, test_cases[i].flag));
> +
> +     if (test_cases[i].exp_errno != 0)
> +             verify_failure(i);
> +     else
> +             verify_success(i);
> +}
> +
> +static void verify_failure(int i)
> +{
> +     if (TEST_RETURN == 0) {
> +             tst_resm(TFAIL, "umount2(2) succeeded 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();
> +}
> 

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

Reply via email to