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

Bruno Pena brunompena at gmail.com
Tue Jan 21 05:01:27 EST 2020


Hi Steve,

These patches should only impact partitions that are marked as read only.
Can you please provide more details about your configuration?
(architecture, device profile, mtd layout, the mtd partition generating the
error)

Best regards,
Bruno Pena

On Tue, Jan 21, 2020, 10:51 Steve Brown <sbrown at ewol.com> wrote:

> 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
>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.infradead.org/pipermail/openwrt-devel/attachments/20200121/2c5b56d7/attachment.htm>
-------------- next part --------------
_______________________________________________
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