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-f...@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-f...@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-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_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