[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:24:28 EST 2020


Please also include the contents of "dmesg" and of the files
"/proc/cmdline" and "/proc/mtd".

Best regards,
Bruno Pena

On Tue, Jan 21, 2020, 11:01 Bruno Pena <brunompena at gmail.com> wrote:

> 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/2b2f86cc/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