Hi! Thank you for reply!
On 2015/08/05 01:27, Cyril Hrubis wrote: > Hi! >> +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; > > This is not right. The testcase does four testcases as far as I can > tell. You should print PASS/FAIL for each of them and set TST_TOTAL = 4 > I got it, thanks! I will rewrite each of them respectively. >> +#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 > > The EXP_ERRNO is not used at all, forget to remove it? > I forgot, sorry! >> +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; >> + >> + if (umount2_verify_1()) >> + goto EXIT; >> + >> + if (umount2_verify_2()) >> + goto EXIT; >> + >> + /* 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()) >> + goto EXIT; >> + >> + if (umount2_verify_3()) >> + goto EXIT; >> + >> + mount_flag = 0; >> + >> + tst_resm(TPASS, "umount2(2) Passed"); >> + >> +EXIT: >> + 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)); > ^ > As last time, do not use strerror(). > > Given that the expected errno will never > change we can just print "expected EINVAL" I see, thanks! I will pay more attention to it. >> + 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; >> +} > > This function is nearly identical to to the half of umout_verify_1(). > Can you just write one verify function that takes umount flags in > parameters, expected errno and some string that describes what is > tested and use it instead both halfs of umout2_verify_1() and > umout2_verify_2()? > I see, thanks for pointing it out! I am going to rewrite the code as you said. >> +/* 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 | TTERRNO, "umount2(2) Failed"); >> + return 1; >> + } >> + >> + return 0; >> +} > > Also naming this umount2_verify_success() would be a bit more > descriptive than adding _3. > OK, I understand. I am going to split them into verify_failure and verify_success, check the result respectively. Best Regards, Guangwen Feng >> +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 > ------------------------------------------------------------------------------ _______________________________________________ Ltp-list mailing list Ltp-list@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/ltp-list