summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--tests/fs-tests/integrity/integck.c200
1 files changed, 92 insertions, 108 deletions
diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c
index 0a7f142..ad076b5 100644
--- a/tests/fs-tests/integrity/integck.c
+++ b/tests/fs-tests/integrity/integck.c
@@ -2577,6 +2577,93 @@ static int rm_minus_rf_dir(const char *dir_name)
return 0;
}
+/*
+ * Detach the MTD device from UBI and attach it back. This function is used
+ * whed performing emulated power cut testing andthe power cuts are amulated by
+ * UBI, not by UBIFS. In this case, to recover from the emulated power cut we
+ * have to unmount UBIFS and re-attach the MTD device.
+ */
+static int reattach(void)
+{
+ int err = 0;
+ libubi_t libubi;
+ struct ubi_attach_request req;
+
+ libubi = libubi_open();
+ if (!libubi) {
+ if (errno == 0)
+ return errmsg("UBI is not present in the system");
+ return sys_errmsg("cannot open libubi");
+ }
+
+ err = ubi_detach_mtd(libubi, "/dev/ubi_ctrl", args.mtdn);
+ if (err) {
+ sys_errmsg("cannot detach mtd%d", args.mtdn);
+ goto out;
+ }
+
+ req.dev_num = UBI_DEV_NUM_AUTO;
+ req.mtd_num = args.mtdn;
+ req.vid_hdr_offset = 0;
+ req.mtd_dev_node = NULL;
+ req.max_beb_per1024 = 0;
+
+ err = ubi_attach(libubi, "/dev/ubi_ctrl", &req);
+ if (err)
+ sys_errmsg("cannot attach mtd%d", args.mtdn);
+
+out:
+ libubi_close(libubi);
+ return err;
+}
+
+/**
+ * Unmount and mount back the test file-system.
+ */
+static int umount_and_remount(int mounted, int reatt, int um_rorw)
+{
+ int ret = 0;
+ unsigned long flags;
+
+ if (mounted)
+ CHECK(umount(fsinfo.mount_point) != -1);
+
+ if (reatt)
+ CHECK(reattach() == 0);
+
+ if (!um_rorw) {
+ ret = mount(fsinfo.fsdev, fsinfo.mount_point,
+ fsinfo.fstype, fsinfo.mount_flags,
+ fsinfo.mount_opts);
+ if (ret) {
+ pcv("unmounted %s, but cannot mount it back R/W",
+ fsinfo.mount_point);
+ return -1;
+ }
+ } else {
+ ret = mount(fsinfo.fsdev, fsinfo.mount_point,
+ fsinfo.fstype, fsinfo.mount_flags | MS_RDONLY,
+ fsinfo.mount_opts);
+ if (ret) {
+ pcv("unmounted %s, but cannot mount it back R/O",
+ fsinfo.mount_point);
+ return -1;
+ }
+
+ flags = fsinfo.mount_flags | MS_REMOUNT;
+ flags &= ~((unsigned long)MS_RDONLY);
+ ret = mount(fsinfo.fsdev, fsinfo.mount_point,
+ fsinfo.fstype, flags, fsinfo.mount_opts);
+ if (ret) {
+ pcv("unmounted %s, mounted R/O, but cannot re-mount it R/W",
+ fsinfo.mount_point);
+ return -1;
+ }
+ }
+
+ return 0;
+}
+
/**
* Re-mount the test file-system. This function randomly select how to
* re-mount.
@@ -2633,41 +2720,9 @@ static int remount_tested_fs(void)
}
}
- ret = umount(fsinfo.mount_point);
- if (ret) {
- pcv("cannot unmount %s", fsinfo.mount_point);
+ ret = umount_and_remount(1, 0, um_rorw);
+ if (ret)
return -1;
- }
-
- if (!um_rorw) {
- ret = mount(fsinfo.fsdev, fsinfo.mount_point,
- fsinfo.fstype, fsinfo.mount_flags,
- fsinfo.mount_opts);
- if (ret) {
- pcv("unmounted %s, but cannot mount it back R/W",
- fsinfo.mount_point);
- return -1;
- }
- } else {
- ret = mount(fsinfo.fsdev, fsinfo.mount_point,
- fsinfo.fstype, fsinfo.mount_flags | MS_RDONLY,
- fsinfo.mount_opts);
- if (ret) {
- pcv("unmounted %s, but cannot mount it back R/O",
- fsinfo.mount_point);
- return -1;
- }
-
- flags = fsinfo.mount_flags | MS_REMOUNT;
- flags &= ~((unsigned long)MS_RDONLY);
- ret = mount(fsinfo.fsdev, fsinfo.mount_point,
- fsinfo.fstype, flags, fsinfo.mount_opts);
- if (ret) {
- pcv("unmounted %s, mounted R/O, but cannot re-mount it R/W",
- fsinfo.mount_point);
- return -1;
- }
- }
}
if (rorw2) {
@@ -3144,46 +3199,6 @@ static void free_fs_info(struct dir_info *dir)
}
/*
- * Detach the MTD device from UBI and attach it back. This function is used
- * whed performing emulated power cut testing andthe power cuts are amulated by
- * UBI, not by UBIFS. In this case, to recover from the emulated power cut we
- * have to unmount UBIFS and re-attach the MTD device.
- */
-static int reattach(void)
-{
- int err = 0;
- libubi_t libubi;
- struct ubi_attach_request req;
-
- libubi = libubi_open();
- if (!libubi) {
- if (errno == 0)
- return errmsg("UBI is not present in the system");
- return sys_errmsg("cannot open libubi");
- }
-
- err = ubi_detach_mtd(libubi, "/dev/ubi_ctrl", args.mtdn);
- if (err) {
- sys_errmsg("cannot detach mtd%d", args.mtdn);
- goto out;
- }
-
- req.dev_num = UBI_DEV_NUM_AUTO;
- req.mtd_num = args.mtdn;
- req.vid_hdr_offset = 0;
- req.mtd_dev_node = NULL;
- req.max_beb_per1024 = 0;
-
- err = ubi_attach(libubi, "/dev/ubi_ctrl", &req);
- if (err)
- sys_errmsg("cannot attach mtd%d", args.mtdn);
-
-out:
- libubi_close(libubi);
- return err;
-}
-
-/*
* Recover the tested file-system from an emulated power cut failure by
* unmounting it and mounting it again.
*/
@@ -3206,41 +3221,10 @@ static int recover_tested_fs(void)
* while mounting in 'remount_tested_fs()'.
*/
mntent = get_tested_fs_mntent();
- if (mntent)
- CHECK(umount(fsinfo.mount_point) != -1);
-
- if (args.reattach)
- CHECK(reattach() == 0);
-
- if (!um_rorw) {
- ret = mount(fsinfo.fsdev, fsinfo.mount_point,
- fsinfo.fstype, fsinfo.mount_flags,
- fsinfo.mount_opts);
- if (ret) {
- pcv("unmounted %s, but cannot mount it back R/W",
- fsinfo.mount_point);
- return -1;
- }
- } else {
- ret = mount(fsinfo.fsdev, fsinfo.mount_point,
- fsinfo.fstype, fsinfo.mount_flags | MS_RDONLY,
- fsinfo.mount_opts);
- if (ret) {
- pcv("unmounted %s, but cannot mount it back R/O",
- fsinfo.mount_point);
- return -1;
- }
- flags = fsinfo.mount_flags | MS_REMOUNT;
- flags &= ~((unsigned long)MS_RDONLY);
- ret = mount(fsinfo.fsdev, fsinfo.mount_point,
- fsinfo.fstype, flags, fsinfo.mount_opts);
- if (ret) {
- pcv("unmounted %s, mounted R/O, but cannot re-mount it R/W",
- fsinfo.mount_point);
- return -1;
- }
- }
+ ret = umount_and_remount(!!mntent, args.reattach, um_rorw);
+ if (ret)
+ return -1;
if (rorw2) {
flags = fsinfo.mount_flags | MS_RDONLY | MS_REMOUNT;