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