[PATCH 1/2] fs-tests: integck: Refactor: split out common remount logic

Zhihao Cheng chengzhihao1 at huawei.com
Fri Aug 16 05:41:51 PDT 2024


在 2024/8/15 17:12, Csókás, Bence 写道:
> remount_tested_fs() and recover_tested_fs() both have
> almost the same code for umount'ing the target FS and
> mount'ing it back. Split this sequence into a new
> function called umount_and_remount().
> 
> Signed-off-by: Csókás, Bence <csokas.bence at prolan.hu>
> ---
> 
> Notes:
>      `--color-moved` is recommended
> 
>   tests/fs-tests/integrity/integck.c | 204 ++++++++++++++---------------
>   1 file changed, 96 insertions(+), 108 deletions(-)
> 
> diff --git a/tests/fs-tests/integrity/integck.c b/tests/fs-tests/integrity/integck.c
> index 0a7f142..6ce8c9d 100644
> --- a/tests/fs-tests/integrity/integck.c
> +++ b/tests/fs-tests/integrity/integck.c
> @@ -2577,6 +2577,97 @@ 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)
> +		ret = umount(fsinfo.mount_point);
> +	if (ret) {
> +		pcv("cannot unmount %s", fsinfo.mount_point);
> +		return -1;
> +	}
> +

[...]
>   /*
>    * Recover the tested file-system from an emulated power cut failure by
>    * unmounting it and mounting it again.
> @@ -3206,41 +3225,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);

I think the 'CHECK' should't be removed, because it may lead to a dead 
loop in the caller:

3303         /* Check whether we can re-mount the tested FS  */
3304         do {
3305                 ret = recover_tested_fs();
3306         } while (ret && args.power_cut_mode && errno == EROFS);
>   
> -	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;
> 




More information about the linux-mtd mailing list