block: support finding root device by mount point
[project/fstools.git] / block.c
diff --git a/block.c b/block.c
index a44241d..2726b1c 100644 (file)
--- a/block.c
+++ b/block.c
@@ -19,6 +19,7 @@
 #include <syslog.h>
 #include <libgen.h>
 #include <glob.h>
 #include <syslog.h>
 #include <libgen.h>
 #include <glob.h>
+#include <dirent.h>
 
 #include <sys/stat.h>
 #include <sys/types.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
 
 }
 #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;
 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
                        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) {
 #endif
 
        list_for_each_entry(pr, &devices, list) {