diff options
author | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-04-21 08:13:21 +0300 |
---|---|---|
committer | Artem Bityutskiy <Artem.Bityutskiy@nokia.com> | 2011-04-22 14:29:53 +0300 |
commit | 22bfdee79b65253fe2d5656303d2a00da934b00a (patch) | |
tree | f25268eb3546770d63d79d8c8086489d94e583e2 | |
parent | ef4b2ceb552b5e32fa2defe7a48f1aec86b82333 (diff) |
fs-tests: integck: do not assume the FS is mounted after failure
If a power cut emulation error happens and we are trying to re-mount
the file-system, do not assume it is mounted because the failure could
have happened after it had had been unmounted but before it was
successfully mounted.
Signed-off-by: Artem Bityutskiy <Artem.Bityutskiy@nokia.com>
-rw-r--r-- | tests/fs-tests/integrity/integck.c | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c index 1816461..8703355 100644 --- a/tests/fs-tests/integrity/integck.c +++ b/tests/fs-tests/integrity/integck.c @@ -2493,14 +2493,37 @@ static void parse_mount_options(const char *mount_opts) } /* + * This is a helper function which searches for the tested file-system mount + * description. + */ +static struct mntent *get_tested_fs_mntent(void) +{ + const char *mp; + struct mntent *mntent; + FILE *f; + + mp = "/proc/mounts"; + f = fopen(mp, "rb"); + if (!f) { + mp = "/etc/mtab"; + f = fopen(mp, "rb"); + } + CHECK(f != NULL); + + while ((mntent = getmntent(f)) != NULL) + if (!strcmp(mntent->mnt_dir, fsinfo.mount_point)) + break; + fclose(f); + return mntent; +} + +/* * Fill 'fsinfo' with information about the tested file-system. */ static void get_tested_fs_info(void) { struct statfs fs_info; struct mntent *mntent; - const char *mp; - FILE *f; uint64_t z; char *p; unsigned int pid; @@ -2516,25 +2539,11 @@ static void get_tested_fs_info(void) CHECK(statfs(fsinfo.mount_point, &fs_info) == 0); fsinfo.max_name_len = fs_info.f_namelen; - mp = "/proc/mounts"; - f = fopen(mp, "rb"); - if (!f) { - mp = "/etc/mtab"; - f = fopen(mp, "rb"); + mntent = get_tested_fs_mntent(); + if (!mntent) { + errmsg("cannot find file-system info"); + CHECK(0); } - CHECK(f != NULL); - - while (1) { - mntent = getmntent(f); - if (!mntent) { - errmsg("cannot find file-system info"); - CHECK(0); - } - - if (!strcmp(mntent->mnt_dir, fsinfo.mount_point)) - break; - } - fclose(f); fsinfo.fstype = dup_string(mntent->mnt_type); fsinfo.fsdev = dup_string(mntent->mnt_fsname); @@ -2701,6 +2710,7 @@ static int recover_tested_fs(void) int ret; unsigned long flags; unsigned int um_rorw, rorw2; + struct mntent *mntent; /* Save current working directory */ wd_save = malloc(PATH_MAX + 1); @@ -2714,7 +2724,14 @@ static int recover_tested_fs(void) um_rorw = rand() & 1; rorw2 = rand() & 1; - CHECK(umount(fsinfo.mount_point) != -1); + /* + * At this point we do not know for sure whether the tested FS is + * mounted, because the emulated power cut error could have happened + * while mounting in 'remount_tested_fs()'. + */ + mntent = get_tested_fs_mntent(); + if (mntent) + CHECK(umount(fsinfo.mount_point) != -1); if (!um_rorw) { ret = mount(fsinfo.fsdev, fsinfo.mount_point, |