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 <brunomp...@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@lists.openwrt.org
https://lists.openwrt.org/mailman/listinfo/openwrt-devel

Reply via email to