<div dir="auto">Hi Steve,<div dir="auto"><br></div><div dir="auto">These patches should only impact partitions that are marked as read only.</div><div dir="auto">Can you please provide more details about your configuration? (architecture, device profile, mtd layout, the mtd partition generating the error)</div><div dir="auto"><br></div><div dir="auto">Best regards,</div><div dir="auto">Bruno Pena</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Tue, Jan 21, 2020, 10:51 Steve Brown <<a href="mailto:sbrown@ewol.com">sbrown@ewol.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Hi Bruno,<br>
<br>
On Sat, 2020-01-04 at 12:52 +0100, Bruno Pena wrote:<br>
> This patch enables fstools to open read-only MTD partitions, which in<br>
> turn also enables OpenWrt to boot from read-only partitions.<br>
> <br>
> The use of read-only partitions is of special importance for WiFi-<br>
> only<br>
> devices, where a protected read-only recovery image can be used in<br>
> case<br>
> something goes wrong with the main firmware (eg. user gets locked out<br>
> due to bad settings, flash of an unbootable dev firmware, etc).<br>
> <br>
> Signed-off-by: Bruno Pena <<a href="mailto:brunompena@gmail.com" target="_blank" rel="noreferrer">brunompena@gmail.com</a>><br>
> ---<br>
>  libfstools/mtd.c | 19 +++++++++++++++----<br>
>  1 file changed, 15 insertions(+), 4 deletions(-)<br>
> <br>
> diff --git a/libfstools/mtd.c b/libfstools/mtd.c<br>
> index 77c71ee..aae633e 100644<br>
> --- a/libfstools/mtd.c<br>
> +++ b/libfstools/mtd.c<br>
> @@ -36,20 +36,31 @@ struct mtd_volume {<br>
>  <br>
>  static struct driver mtd_driver;<br>
>  <br>
> +static int mtd_open_device(const char *dev)<br>
> +{<br>
> +     int ret;<br>
> +<br>
> +     ret = open(dev, O_RDWR | O_SYNC);<br>
> +     if (ret < 0)<br>
> +             ret = open(dev, O_RDONLY);<br>
> +<br>
> +     return ret;<br>
> +}<br>
> +<br>
>  static int mtd_open(const char *mtd, int block)<br>
>  {<br>
>       FILE *fp;<br>
>       char dev[PATH_MAX];<br>
> -     int i, ret, flags = O_RDWR | O_SYNC;<br>
> +     int i, ret;<br>
>  <br>
>       if ((fp = fopen("/proc/mtd", "r"))) {<br>
>               while (fgets(dev, sizeof(dev), fp)) {<br>
>                       if (sscanf(dev, "mtd%d:", &i) && strstr(dev,<br>
> mtd)) {<br>
>                               snprintf(dev, sizeof(dev),<br>
> "/dev/mtd%s/%d", (block ? "block" : ""), i);<br>
> -                             ret = open(dev, flags);<br>
> +                             ret = mtd_open_device(dev);<br>
>                               if (ret < 0) {<br>
>                                       snprintf(dev, sizeof(dev),<br>
> "/dev/mtd%s%d", (block ? "block" : ""), i);<br>
> -                                     ret = open(dev, flags);<br>
> +                                     ret = mtd_open_device(dev);<br>
>                               }<br>
>                               fclose(fp);<br>
>                               return ret;<br>
> @@ -58,7 +69,7 @@ static int mtd_open(const char *mtd, int block)<br>
>               fclose(fp);<br>
>       }<br>
>  <br>
> -     return open(mtd, flags);<br>
> +     return mtd_open_device(mtd);<br>
>  }<br>
>  <br>
>  static void mtd_volume_close(struct mtd_volume *p)<br>
<br>
<br>
This patch and related commit de80424f706682e8bba27c60bcd2a9c1b4a5e875<br>
break the jffs erase on my Archer a7 v5.<br>
<br>
    [   11.787856] jffs2_scan_eraseblock(): End of filesystem marker found at 0x10000<br>
    [   11.795357] jffs2_build_filesystem(): unlocking the mtd device...<br>
    [   11.795390] done.<br>
    [   11.803771] jffs2_build_filesystem(): erasing all blocks after the end marker...<br>
    [   11.803781] jffs2: Erase at 0x009e0000 failed immediately: -EROFS. Is the sector locked?<br>
         -------------<br>
    [   13.138841] jffs2: Erase at 0x00010000 failed immediately: -EROFS. Is the sector locked?<br>
    [   13.147188] done.<br>
    [   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 .<br>
    [   13.165896] mount_root: unable to set filesystem state<br>
    [   13.171443] mount_root: switching to jffs2 overlay<br>
    [   13.201867] overlayfs: failed to resolve '/overlay/upper': -2<br>
    [   13.223939] mount_root: mount failed: lowerdir=/,upperdir=/overlay/upper,workdir=/overlay/work, options No such device<br>
    [   13.235145] mount_root: switching to jffs2 failed - fallback to ramoverlay<br>
<br>
Verified by reverting de80424f7. <br>
<br>
Steve<br>
<br>
<br>
</blockquote></div>