[LEDE-DEV] [PATCH fstools] libfstools: move mount points when switching to JFFS2

John Crispin john at phrozen.org
Mon Apr 16 08:13:26 PDT 2018



On 16/04/18 16:11, Rafał Miłecki wrote:
> From: Rafał Miłecki <rafal at milecki.pl>
>
> Switching from "tmpfs" to "jffs2" happens after JFFS2 formatting is
> done. During that time user can use filesystem (thanks to RAM) and the
> role of switch2jffs() is to copy all changes to the JFFS2 overlay
> partition.
>
> What wasn't handled so far was moving mount points. User can create
> custom mounts, cp command won't copy them and umounting "tmpfs" will
> cause these mounts to go away. To preserve them switch2jffs() has to
> find all custom mount points and move them to the new filesystem.
>
> Signed-off-by: Rafał Miłecki <rafal at milecki.pl>
Acked-by: John Crispin <john at phrozen.org>

> ---
>   libfstools/overlay.c | 46 +++++++++++++++++++++++++++++++++++++++++++++-
>   1 file changed, 45 insertions(+), 1 deletion(-)
>
> diff --git a/libfstools/overlay.c b/libfstools/overlay.c
> index a41364c..ebc43f7 100644
> --- a/libfstools/overlay.c
> +++ b/libfstools/overlay.c
> @@ -112,6 +112,24 @@ foreachdir(const char *dir, int (*cb)(const char*))
>   	cb(dir);
>   }
>   
> +static void foreach_mount(int (*cb)(const char *, const char *))
> +{
> +	FILE *fp = fopen("/proc/mounts", "r");
> +	static char line[256];
> +
> +	if (!fp)
> +		return;
> +
> +	while (fgets(line, sizeof(line), fp)) {
> +		char device[32], mount_point[32];
> +
> +		if (sscanf(line, "%31s %31s %*s %*s %*u %*u", device, mount_point) == 2)
> +			cb(device, mount_point);
> +	}
> +
> +	fclose(fp);
> +}
> +
>   void
>   overlay_delete(const char *dir, bool _keep_sysupgrade)
>   {
> @@ -135,6 +153,19 @@ overlay_mount(struct volume *v, char *fs)
>   	return 0;
>   }
>   
> +/**
> + * move_mount - move mount point to the new root
> + */
> +static int move_mount(const char *device, const char *mount_point)
> +{
> +	static const char *prefix = "/tmp/root/";
> +
> +	if (strncmp(mount_point, prefix, strlen(prefix)))
> +		return 0;
> +
> +	return mount_move(prefix, "/", mount_point + strlen(prefix));
> +}
> +
>   static int
>   switch2jffs(struct volume *v)
>   {
> @@ -174,7 +205,20 @@ switch2jffs(struct volume *v)
>   		return -1;
>   	}
>   
> -	return fopivot("/overlay", "/rom");
> +	ret = fopivot("/overlay", "/rom");
> +
> +	/*
> +	 * Besides copying overlay data from "tmpfs" to "jffs2" we should also
> +	 * move mount points that user could create during JFFS2 formatting.
> +	 * This has to happen after fopivot call because:
> +	 * 1) It's trivial to find mount points to move then (/tmp/root/...).
> +	 * 2) We can't do that earlier using /rom/overlay/upper/ as overlay(fs)
> +	 *    doesn't support mounts. Mounting to upper dir don't make overlay
> +	 *    /propagate/ files to the target dir.
> +	 */
> +	foreach_mount(move_mount);
> +
> +	return ret;
>   }
>   
>   int




More information about the Lede-dev mailing list