[OpenWrt-Devel,package] fstools: make extroot functionality work with ubifs
diff mbox

Message ID CAF-mK=Vx1+kenp7w+Gjwt_8R9YvOXHjFiK-cJkQBeeu=MC2fdA@mail.gmail.com
State Changes Requested
Headers show

Commit Message

Gergely Kiss Dec. 12, 2014, 11:43 p.m. UTC
From: Gergely Kiss <mail.gery@gmail.com>

Fix extroot functionality for devices where rootfs is on a ubifs partition

Signed-off-by: Gergely Kiss <mail.gery@gmail.com>
Tested-by: Gergely Kiss <mail.gery@gmail.com>
---
Originally created by forum user "Hiro.AK47" for the 14.07 branch.
I've created a new diff to make it work with the master branch.

Tested on a Netgear WNDR4300 router, working fine in both overlay and
pivot root modes.

Comments

John Crispin Dec. 13, 2014, 7:23 a.m. UTC | #1
Hi,

thanks for the patch, code looks good however

* the patch is whitespace mangled and line broken.
* this will build always build with ubi support even if the target has
no UBI. please add a config option so that is selectable whether ubi is
enabled.

	John

On 13/12/2014 00:43, Gergely Kiss wrote:
> From: Gergely Kiss <mail.gery@gmail.com>
> 
> Fix extroot functionality for devices where rootfs is on a ubifs partition
> 
> Signed-off-by: Gergely Kiss <mail.gery@gmail.com>
> Tested-by: Gergely Kiss <mail.gery@gmail.com>
> ---
> Originally created by forum user "Hiro.AK47" for the 14.07 branch.
> I've created a new diff to make it work with the master branch.
> 
> Tested on a Netgear WNDR4300 router, working fine in both overlay and
> pivot root modes.
> 
> diff -rupN fstools.old/block.c fstools.new/block.c
> --- fstools.old/block.c    2014-12-12 17:32:23.833641055 +0100
> +++ fstools.new/block.c    2014-12-12 17:36:59.532478289 +0100
> @@ -35,6 +35,7 @@
>  #include <libubox/avl-cmp.h>
> 
>  #include "libblkid-tiny/libblkid-tiny.h"
> +#include "libubi/libubi.h"
> 
>  #define ERROR(fmt, ...) do { \
>          syslog(LOG_ERR, fmt, ## __VA_ARGS__); \
> @@ -823,13 +824,70 @@ static int find_block_mtd(char *name, ch
>      return 0;
>  }
> 
> +static int find_ubi_vol(libubi_t libubi, char *name, int *dev_num, int *vol_id)
> +{
> +       int dev = 0;
> +
> +       while (ubi_dev_present(libubi, dev))
> +       {
> +               struct ubi_dev_info dev_info;
> +               struct ubi_vol_info vol_info;
> +
> +               if (ubi_get_dev_info1(libubi, dev++, &dev_info))
> +                       continue;
> +               if (ubi_get_vol_info1_nm(libubi, dev_info.dev_num,
> name, &vol_info))
> +                       continue;
> +
> +               *dev_num = dev_info.dev_num;
> +               *vol_id = vol_info.vol_id;
> +
> +               return 0;
> +       }
> +
> +       return -1;
> +}
> +
> +static int find_block_ubi(libubi_t libubi, char *name, char *part, int plen)
> +{
> +       int dev_num;
> +       int vol_id;
> +       int err = -1;
> +
> +       err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
> +       if (!err)
> +               snprintf(part, plen, "/dev/ubi%d_%d", dev_num, vol_id);
> +
> +       return err;
> +}
> +
> +static int find_block_ubi_RO(libubi_t libubi, char *name, char *part, int plen)
> +{
> +       int dev_num;
> +       int vol_id;
> +       int err = -1;
> +
> +       err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
> +       if (!err)
> +               snprintf(part, plen, "/dev/ubiblock%d_%d", dev_num, vol_id);
> +
> +       return err;
> +}
> +
>  static int check_extroot(char *path)
>  {
>      struct blkid_struct_probe *pr = NULL;
>      char fs[32];
> 
> -    if (find_block_mtd("rootfs", fs, sizeof(fs)))
> -        return -1;
> +       if (find_block_mtd("rootfs", fs, sizeof(fs))) {
> +               int err = -1;
> +               libubi_t libubi;
> +
> +               libubi = libubi_open();
> +               err = find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
> +               libubi_close(libubi);
> +               if (err)
> +                       return -1;
> +       }
> 
>      list_for_each_entry(pr, &devices, list) {
>          if (!strcmp(pr->dev, fs)) {
> @@ -933,6 +991,7 @@ static int main_extroot(int argc, char *
>      char fs[32] = { 0 };
>      char fs_data[32] = { 0 };
>      int err = -1;
> +    libubi_t libubi;
> 
>      if (!getenv("PREINIT"))
>          return -1;
> @@ -947,8 +1006,13 @@ static int main_extroot(int argc, char *
> 
>      find_block_mtd("rootfs", fs, sizeof(fs));
>      if (!fs[0]) {
> -        ERROR("extroot: unable to locate rootfs mtdblock\n");
> -        return -2;
> +               libubi = libubi_open();
> +               find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
> +               libubi_close(libubi);
> +               if (!fs[0]) {
> +                       ERROR("extroot: unable to locate rootfs
> mtdblock / ubiblock\n");
> +                       return -2;
> +               }
>      }
> 
>      pr = find_block_info(NULL, NULL, fs);
> @@ -975,6 +1039,24 @@ static int main_extroot(int argc, char *
>          }
>      }
> 
> +       memset(fs_data, 0, sizeof(fs_data));
> +       libubi = libubi_open();
> +       find_block_ubi(libubi, "rootfs_data", fs_data, sizeof(fs_data));
> +       libubi_close(libubi);
> +       if (fs_data[0]) {
> +               char cfg[] = "/tmp/ubifs_cfg";
> +
> +               mkdir_p(cfg);
> +               if (!mount(fs_data, cfg, "ubifs", MS_NOATIME, NULL)) {
> +                       err = mount_extroot(cfg);
> +                       umount2(cfg, MNT_DETACH);
> +               }
> +               if (err < 0)
> +                       rmdir("/tmp/overlay");
> +               rmdir(cfg);
> +               return err;
> +       }
> +
>      return mount_extroot(NULL);
>  }
> 
> diff -rupN fstools.old/CMakeLists.txt fstools.new/CMakeLists.txt
> --- fstools.old/CMakeLists.txt    2014-12-12 17:32:23.833641055 +0100
> +++ fstools.new/CMakeLists.txt    2014-12-12 17:31:48.729637303 +0100
> @@ -48,7 +48,7 @@ TARGET_LINK_LIBRARIES(mount_root fstools
>  INSTALL(TARGETS mount_root RUNTIME DESTINATION sbin)
> 
>  ADD_EXECUTABLE(block block.c)
> -TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json)
> +TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json ubi-utils)
>  INSTALL(TARGETS block RUNTIME DESTINATION sbin)
> 
>  ADD_EXECUTABLE(jffs2reset jffs2reset.c)
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
>
Gergely Kiss Dec. 13, 2014, 7:36 p.m. UTC | #2
Hi John,

thanks for your comments!

I'm about to fix the issues you mentioned and repost the patch soon.


Regards,
Gergely

On 13 December 2014 at 08:23, John Crispin <blogic@openwrt.org> wrote:
> Hi,
>
> thanks for the patch, code looks good however
>
> * the patch is whitespace mangled and line broken.
> * this will build always build with ubi support even if the target has
> no UBI. please add a config option so that is selectable whether ubi is
> enabled.
>
>         John
>
> On 13/12/2014 00:43, Gergely Kiss wrote:
>> From: Gergely Kiss <mail.gery@gmail.com>
>>
>> Fix extroot functionality for devices where rootfs is on a ubifs partition
>>
>> Signed-off-by: Gergely Kiss <mail.gery@gmail.com>
>> Tested-by: Gergely Kiss <mail.gery@gmail.com>
>> ---
>> Originally created by forum user "Hiro.AK47" for the 14.07 branch.
>> I've created a new diff to make it work with the master branch.
>>
>> Tested on a Netgear WNDR4300 router, working fine in both overlay and
>> pivot root modes.
>>
>> diff -rupN fstools.old/block.c fstools.new/block.c
>> --- fstools.old/block.c    2014-12-12 17:32:23.833641055 +0100
>> +++ fstools.new/block.c    2014-12-12 17:36:59.532478289 +0100
>> @@ -35,6 +35,7 @@
>>  #include <libubox/avl-cmp.h>
>>
>>  #include "libblkid-tiny/libblkid-tiny.h"
>> +#include "libubi/libubi.h"
>>
>>  #define ERROR(fmt, ...) do { \
>>          syslog(LOG_ERR, fmt, ## __VA_ARGS__); \
>> @@ -823,13 +824,70 @@ static int find_block_mtd(char *name, ch
>>      return 0;
>>  }
>>
>> +static int find_ubi_vol(libubi_t libubi, char *name, int *dev_num, int *vol_id)
>> +{
>> +       int dev = 0;
>> +
>> +       while (ubi_dev_present(libubi, dev))
>> +       {
>> +               struct ubi_dev_info dev_info;
>> +               struct ubi_vol_info vol_info;
>> +
>> +               if (ubi_get_dev_info1(libubi, dev++, &dev_info))
>> +                       continue;
>> +               if (ubi_get_vol_info1_nm(libubi, dev_info.dev_num,
>> name, &vol_info))
>> +                       continue;
>> +
>> +               *dev_num = dev_info.dev_num;
>> +               *vol_id = vol_info.vol_id;
>> +
>> +               return 0;
>> +       }
>> +
>> +       return -1;
>> +}
>> +
>> +static int find_block_ubi(libubi_t libubi, char *name, char *part, int plen)
>> +{
>> +       int dev_num;
>> +       int vol_id;
>> +       int err = -1;
>> +
>> +       err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
>> +       if (!err)
>> +               snprintf(part, plen, "/dev/ubi%d_%d", dev_num, vol_id);
>> +
>> +       return err;
>> +}
>> +
>> +static int find_block_ubi_RO(libubi_t libubi, char *name, char *part, int plen)
>> +{
>> +       int dev_num;
>> +       int vol_id;
>> +       int err = -1;
>> +
>> +       err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
>> +       if (!err)
>> +               snprintf(part, plen, "/dev/ubiblock%d_%d", dev_num, vol_id);
>> +
>> +       return err;
>> +}
>> +
>>  static int check_extroot(char *path)
>>  {
>>      struct blkid_struct_probe *pr = NULL;
>>      char fs[32];
>>
>> -    if (find_block_mtd("rootfs", fs, sizeof(fs)))
>> -        return -1;
>> +       if (find_block_mtd("rootfs", fs, sizeof(fs))) {
>> +               int err = -1;
>> +               libubi_t libubi;
>> +
>> +               libubi = libubi_open();
>> +               err = find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
>> +               libubi_close(libubi);
>> +               if (err)
>> +                       return -1;
>> +       }
>>
>>      list_for_each_entry(pr, &devices, list) {
>>          if (!strcmp(pr->dev, fs)) {
>> @@ -933,6 +991,7 @@ static int main_extroot(int argc, char *
>>      char fs[32] = { 0 };
>>      char fs_data[32] = { 0 };
>>      int err = -1;
>> +    libubi_t libubi;
>>
>>      if (!getenv("PREINIT"))
>>          return -1;
>> @@ -947,8 +1006,13 @@ static int main_extroot(int argc, char *
>>
>>      find_block_mtd("rootfs", fs, sizeof(fs));
>>      if (!fs[0]) {
>> -        ERROR("extroot: unable to locate rootfs mtdblock\n");
>> -        return -2;
>> +               libubi = libubi_open();
>> +               find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
>> +               libubi_close(libubi);
>> +               if (!fs[0]) {
>> +                       ERROR("extroot: unable to locate rootfs
>> mtdblock / ubiblock\n");
>> +                       return -2;
>> +               }
>>      }
>>
>>      pr = find_block_info(NULL, NULL, fs);
>> @@ -975,6 +1039,24 @@ static int main_extroot(int argc, char *
>>          }
>>      }
>>
>> +       memset(fs_data, 0, sizeof(fs_data));
>> +       libubi = libubi_open();
>> +       find_block_ubi(libubi, "rootfs_data", fs_data, sizeof(fs_data));
>> +       libubi_close(libubi);
>> +       if (fs_data[0]) {
>> +               char cfg[] = "/tmp/ubifs_cfg";
>> +
>> +               mkdir_p(cfg);
>> +               if (!mount(fs_data, cfg, "ubifs", MS_NOATIME, NULL)) {
>> +                       err = mount_extroot(cfg);
>> +                       umount2(cfg, MNT_DETACH);
>> +               }
>> +               if (err < 0)
>> +                       rmdir("/tmp/overlay");
>> +               rmdir(cfg);
>> +               return err;
>> +       }
>> +
>>      return mount_extroot(NULL);
>>  }
>>
>> diff -rupN fstools.old/CMakeLists.txt fstools.new/CMakeLists.txt
>> --- fstools.old/CMakeLists.txt    2014-12-12 17:32:23.833641055 +0100
>> +++ fstools.new/CMakeLists.txt    2014-12-12 17:31:48.729637303 +0100
>> @@ -48,7 +48,7 @@ TARGET_LINK_LIBRARIES(mount_root fstools
>>  INSTALL(TARGETS mount_root RUNTIME DESTINATION sbin)
>>
>>  ADD_EXECUTABLE(block block.c)
>> -TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json)
>> +TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json ubi-utils)
>>  INSTALL(TARGETS block RUNTIME DESTINATION sbin)
>>
>>  ADD_EXECUTABLE(jffs2reset jffs2reset.c)
>> _______________________________________________
>> openwrt-devel mailing list
>> openwrt-devel@lists.openwrt.org
>> https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel
>>
> _______________________________________________
> openwrt-devel mailing list
> openwrt-devel@lists.openwrt.org
> https://lists.openwrt.org/cgi-bin/mailman/listinfo/openwrt-devel

Patch
diff mbox

diff -rupN fstools.old/block.c fstools.new/block.c
--- fstools.old/block.c    2014-12-12 17:32:23.833641055 +0100
+++ fstools.new/block.c    2014-12-12 17:36:59.532478289 +0100
@@ -35,6 +35,7 @@ 
 #include <libubox/avl-cmp.h>

 #include "libblkid-tiny/libblkid-tiny.h"
+#include "libubi/libubi.h"

 #define ERROR(fmt, ...) do { \
         syslog(LOG_ERR, fmt, ## __VA_ARGS__); \
@@ -823,13 +824,70 @@  static int find_block_mtd(char *name, ch
     return 0;
 }

+static int find_ubi_vol(libubi_t libubi, char *name, int *dev_num, int *vol_id)
+{
+       int dev = 0;
+
+       while (ubi_dev_present(libubi, dev))
+       {
+               struct ubi_dev_info dev_info;
+               struct ubi_vol_info vol_info;
+
+               if (ubi_get_dev_info1(libubi, dev++, &dev_info))
+                       continue;
+               if (ubi_get_vol_info1_nm(libubi, dev_info.dev_num,
name, &vol_info))
+                       continue;
+
+               *dev_num = dev_info.dev_num;
+               *vol_id = vol_info.vol_id;
+
+               return 0;
+       }
+
+       return -1;
+}
+
+static int find_block_ubi(libubi_t libubi, char *name, char *part, int plen)
+{
+       int dev_num;
+       int vol_id;
+       int err = -1;
+
+       err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
+       if (!err)
+               snprintf(part, plen, "/dev/ubi%d_%d", dev_num, vol_id);
+
+       return err;
+}
+
+static int find_block_ubi_RO(libubi_t libubi, char *name, char *part, int plen)
+{
+       int dev_num;
+       int vol_id;
+       int err = -1;
+
+       err = find_ubi_vol(libubi, name, &dev_num, &vol_id);
+       if (!err)
+               snprintf(part, plen, "/dev/ubiblock%d_%d", dev_num, vol_id);
+
+       return err;
+}
+
 static int check_extroot(char *path)
 {
     struct blkid_struct_probe *pr = NULL;
     char fs[32];

-    if (find_block_mtd("rootfs", fs, sizeof(fs)))
-        return -1;
+       if (find_block_mtd("rootfs", fs, sizeof(fs))) {
+               int err = -1;
+               libubi_t libubi;
+
+               libubi = libubi_open();
+               err = find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
+               libubi_close(libubi);
+               if (err)
+                       return -1;
+       }

     list_for_each_entry(pr, &devices, list) {
         if (!strcmp(pr->dev, fs)) {
@@ -933,6 +991,7 @@  static int main_extroot(int argc, char *
     char fs[32] = { 0 };
     char fs_data[32] = { 0 };
     int err = -1;
+    libubi_t libubi;

     if (!getenv("PREINIT"))
         return -1;
@@ -947,8 +1006,13 @@  static int main_extroot(int argc, char *

     find_block_mtd("rootfs", fs, sizeof(fs));
     if (!fs[0]) {
-        ERROR("extroot: unable to locate rootfs mtdblock\n");
-        return -2;
+               libubi = libubi_open();
+               find_block_ubi_RO(libubi, "rootfs", fs, sizeof(fs));
+               libubi_close(libubi);
+               if (!fs[0]) {
+                       ERROR("extroot: unable to locate rootfs
mtdblock / ubiblock\n");
+                       return -2;
+               }
     }

     pr = find_block_info(NULL, NULL, fs);
@@ -975,6 +1039,24 @@  static int main_extroot(int argc, char *
         }
     }

+       memset(fs_data, 0, sizeof(fs_data));
+       libubi = libubi_open();
+       find_block_ubi(libubi, "rootfs_data", fs_data, sizeof(fs_data));
+       libubi_close(libubi);
+       if (fs_data[0]) {
+               char cfg[] = "/tmp/ubifs_cfg";
+
+               mkdir_p(cfg);
+               if (!mount(fs_data, cfg, "ubifs", MS_NOATIME, NULL)) {
+                       err = mount_extroot(cfg);
+                       umount2(cfg, MNT_DETACH);
+               }
+               if (err < 0)
+                       rmdir("/tmp/overlay");
+               rmdir(cfg);
+               return err;
+       }
+
     return mount_extroot(NULL);
 }

diff -rupN fstools.old/CMakeLists.txt fstools.new/CMakeLists.txt
--- fstools.old/CMakeLists.txt    2014-12-12 17:32:23.833641055 +0100
+++ fstools.new/CMakeLists.txt    2014-12-12 17:31:48.729637303 +0100
@@ -48,7 +48,7 @@  TARGET_LINK_LIBRARIES(mount_root fstools
 INSTALL(TARGETS mount_root RUNTIME DESTINATION sbin)

 ADD_EXECUTABLE(block block.c)
-TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json)
+TARGET_LINK_LIBRARIES(block blkid-tiny uci ubox blobmsg_json ubi-utils)
 INSTALL(TARGETS block RUNTIME DESTINATION sbin)

 ADD_EXECUTABLE(jffs2reset jffs2reset.c)