block: support finding root device by mount point
[project/fstools.git] / block.c
diff --git a/block.c b/block.c
index de8a3b7..2726b1c 100644 (file)
--- a/block.c
+++ b/block.c
@@ -19,6 +19,7 @@
 #include <syslog.h>
 #include <libgen.h>
 #include <glob.h>
+#include <dirent.h>
 
 #include <sys/stat.h>
 #include <sys/types.h>
@@ -885,6 +886,35 @@ static int find_block_ubi_RO(libubi_t libubi, char *name, char *part, int plen)
 }
 #endif
 
+static int find_root_dev(char *buf, int len)
+{
+       DIR *d;
+       dev_t root;
+       struct stat s;
+       struct dirent *e;
+
+       if (stat("/", &s))
+               return -1;
+
+       if (!(d = opendir("/dev")))
+               return -1;
+
+       root = s.st_dev;
+
+       while ((e = readdir(d)) != NULL) {
+               snprintf(buf, len, "/dev/%s", e->d_name);
+
+               if (stat(buf, &s) || s.st_rdev != root)
+                       continue;
+
+               closedir(d);
+               return 0;
+       }
+
+       closedir(d);
+       return -1;
+}
+
 static int check_extroot(char *path)
 {
        struct blkid_struct_probe *pr = NULL;
@@ -902,8 +932,10 @@ static int check_extroot(char *path)
                        return -1;
        }
 #else
-       if (find_block_mtd("rootfs", fs, sizeof(fs)))
-               return -1;
+       if (find_block_mtd("rootfs", fs, sizeof(fs))) {
+               if (find_root_dev(fs, sizeof(fs)))
+                       return -1;
+       }
 #endif
 
        list_for_each_entry(pr, &devices, list) {
@@ -1016,7 +1048,6 @@ static int mount_extroot(char *cfg)
 static int main_extroot(int argc, char **argv)
 {
        struct blkid_struct_probe *pr;
-       char fs[32] = { 0 };
        char blkdev_path[32] = { 0 };
        int err = -1;
 #ifdef UBIFS_EXTROOT
@@ -1035,32 +1066,6 @@ static int main_extroot(int argc, char **argv)
        cache_load(1);
 
        /*
-        * Make sure there is "rootfs" MTD partition or UBI volume.
-        * TODO: What for?
-        */
-       find_block_mtd("rootfs", fs, sizeof(fs));
-       if (!fs[0]) {
-#ifdef UBIFS_EXTROOT
-               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;
-               }
-#else
-               ERROR("extroot: unable to locate rootfs mtdblock\n");
-               return -2;
-#endif
-       }
-
-       pr = find_block_info(NULL, NULL, fs);
-       if (!pr) {
-               ERROR("extroot: unable to retrieve rootfs information\n");
-               return -3;
-       }
-
-       /*
         * Look for "rootfs_data". We will want to mount it and check for
         * extroot configuration.
         */