[OpenWrt-Devel] [PATCH v2] fstools: Add support to read-only MTD partitions (eg. recovery images)

Steve Brown sbrown at ewol.com
Tue Jan 21 04:51:06 EST 2020


Hi Bruno,

On Sat, 2020-01-04 at 12:52 +0100, Bruno Pena wrote:
> This patch enables fstools to open read-only MTD partitions, which in
> turn also enables OpenWrt to boot from read-only partitions.
> 
> The use of read-only partitions is of special importance for WiFi-
> only
> devices, where a protected read-only recovery image can be used in
> case
> something goes wrong with the main firmware (eg. user gets locked out
> due to bad settings, flash of an unbootable dev firmware, etc).
> 
> Signed-off-by: Bruno Pena <brunompena at gmail.com>
> ---
>  libfstools/mtd.c | 19 +++++++++++++++----
>  1 file changed, 15 insertions(+), 4 deletions(-)
> 
> diff --git a/libfstools/mtd.c b/libfstools/mtd.c
> index 77c71ee..aae633e 100644
> --- a/libfstools/mtd.c
> +++ b/libfstools/mtd.c
> @@ -36,20 +36,31 @@ struct mtd_volume {
>  
>  static struct driver mtd_driver;
>  
> +static int mtd_open_device(const char *dev)
> +{
> +	int ret;
> +
> +	ret = open(dev, O_RDWR | O_SYNC);
> +	if (ret < 0)
> +		ret = open(dev, O_RDONLY);
> +
> +	return ret;
> +}
> +
>  static int mtd_open(const char *mtd, int block)
>  {
>  	FILE *fp;
>  	char dev[PATH_MAX];
> -	int i, ret, flags = O_RDWR | O_SYNC;
> +	int i, ret;
>  
>  	if ((fp = fopen("/proc/mtd", "r"))) {
>  		while (fgets(dev, sizeof(dev), fp)) {
>  			if (sscanf(dev, "mtd%d:", &i) && strstr(dev,
> mtd)) {
>  				snprintf(dev, sizeof(dev),
> "/dev/mtd%s/%d", (block ? "block" : ""), i);
> -				ret = open(dev, flags);
> +				ret = mtd_open_device(dev);
>  				if (ret < 0) {
>  					snprintf(dev, sizeof(dev),
> "/dev/mtd%s%d", (block ? "block" : ""), i);
> -					ret = open(dev, flags);
> +					ret = mtd_open_device(dev);
>  				}
>  				fclose(fp);
>  				return ret;
> @@ -58,7 +69,7 @@ static int mtd_open(const char *mtd, int block)
>  		fclose(fp);
>  	}
>  
> -	return open(mtd, flags);
> +	return mtd_open_device(mtd);
>  }
>  
>  static void mtd_volume_close(struct mtd_volume *p)


This patch and related commit de80424f706682e8bba27c60bcd2a9c1b4a5e875
break the jffs erase on my Archer a7 v5.

    [   11.787856] jffs2_scan_eraseblock(): End of filesystem marker found at 0x10000
    [   11.795357] jffs2_build_filesystem(): unlocking the mtd device...
    [   11.795390] done.
    [   11.803771] jffs2_build_filesystem(): erasing all blocks after the end marker...
    [   11.803781] jffs2: Erase at 0x009e0000 failed immediately: -EROFS. Is the sector locked?
         -------------
    [   13.138841] jffs2: Erase at 0x00010000 failed immediately: -EROFS. Is the sector locked?
    [   13.147188] done.
    [   13.149202] jffs2: notice: (487) jffs2_build_xattr_subsystem: complete building xattr subsystem, 0 of xdatum (0 unchecked, 0 orphan) and 0 of xref (0 .
    [   13.165896] mount_root: unable to set filesystem state
    [   13.171443] mount_root: switching to jffs2 overlay
    [   13.201867] overlayfs: failed to resolve '/overlay/upper': -2
    [   13.223939] mount_root: mount failed: lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work, options No such device
    [   13.235145] mount_root: switching to jffs2 failed - fallback to ramoverlay

Verified by reverting de80424f7. 

Steve



_______________________________________________
openwrt-devel mailing list
openwrt-devel at lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel



More information about the openwrt-devel mailing list