blockd_notify(pr->dev, m, pr);
}
- } else if (!strcmp(argv[2], "available")) {
- err = hotplug_call_mount("add", argv[3]);
- } else if (!strcmp(argv[2], "unavailable")) {
- err = hotplug_call_mount("remove", argv[3]);
} else {
if (argc < 4)
return -EINVAL;
return err;
}
-
-#else
+#endif
static int find_root_dev(char *buf, int len)
{
return -1;
}
-#endif
-
static int test_fs_support(const char *name)
{
char line[128], *p;
static int check_extroot(char *path)
{
struct probe_info *pr = NULL;
+ struct probe_info *tmp;
+ struct stat s;
+ char uuid[64] = { 0 };
char devpath[32];
+ char tag[64];
+ FILE *fp;
+ int err;
+ err = find_block_mtd("\"rootfs\"", devpath, sizeof(devpath));
#ifdef UBIFS_EXTROOT
- if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) {
- int err = -1;
+ if (err) {
libubi_t libubi;
libubi = libubi_open();
err = find_block_ubi_RO(libubi, "rootfs", devpath, sizeof(devpath));
libubi_close(libubi);
- if (err)
- return -1;
}
-#else
- if (find_block_mtd("\"rootfs\"", devpath, sizeof(devpath))) {
- if (find_root_dev(devpath, sizeof(devpath))) {
- ULOG_ERR("extroot: unable to determine root device\n");
- return -1;
+#endif
+ if (err) {
+ err = find_root_dev(devpath, sizeof(devpath));
+ }
+ if (err) {
+ ULOG_ERR("extroot: unable to determine root device\n");
+ return -1;
+ }
+
+ /* Find root device probe_info so we know its UUID */
+ list_for_each_entry(tmp, &devices, list) {
+ if (!strcmp(tmp->dev, devpath)) {
+ pr = tmp;
+ break;
}
}
-#endif
+ if (!pr) {
+ ULOG_ERR("extroot: unable to lookup root device %s\n", devpath);
+ return -1;
+ }
- list_for_each_entry(pr, &devices, list) {
- if (!strcmp(pr->dev, devpath)) {
- struct stat s;
- FILE *fp = NULL;
- char tag[64];
- char uuid[64] = { 0 };
-
- snprintf(tag, sizeof(tag), "%s/etc", path);
- if (stat(tag, &s))
- mkdir_p(tag);
-
- snprintf(tag, sizeof(tag), "%s/etc/.extroot-uuid", path);
- if (stat(tag, &s)) {
- fp = fopen(tag, "w+");
- if (!fp) {
- ULOG_ERR("extroot: failed to write UUID to %s: %d (%m)\n",
- tag, errno);
- /* return 0 to continue boot regardless of error */
- return 0;
- }
- fputs(pr->uuid, fp);
- fclose(fp);
- return 0;
- }
+ snprintf(tag, sizeof(tag), "%s/etc", path);
+ if (stat(tag, &s))
+ mkdir_p(tag);
- fp = fopen(tag, "r");
- if (!fp) {
- ULOG_ERR("extroot: failed to read UUID from %s: %d (%m)\n",
- tag, errno);
- return -1;
- }
+ snprintf(tag, sizeof(tag), "%s/etc/.extroot-uuid", path);
+ if (stat(tag, &s)) {
+ fp = fopen(tag, "w+");
+ if (!fp) {
+ ULOG_ERR("extroot: failed to write UUID to %s: %d (%m)\n",
+ tag, errno);
+ /* return 0 to continue boot regardless of error */
+ return 0;
+ }
+ fputs(pr->uuid, fp);
+ fclose(fp);
+ return 0;
+ }
- if (!fgets(uuid, sizeof(uuid), fp))
- ULOG_ERR("extroot: failed to read UUID from %s: %d (%m)\n",
- tag, errno);
- fclose(fp);
+ fp = fopen(tag, "r");
+ if (!fp) {
+ ULOG_ERR("extroot: failed to read UUID from %s: %d (%m)\n", tag,
+ errno);
+ return -1;
+ }
- if (*uuid && !strcasecmp(uuid, pr->uuid))
- return 0;
+ if (!fgets(uuid, sizeof(uuid), fp))
+ ULOG_ERR("extroot: failed to read UUID from %s: %d (%m)\n", tag,
+ errno);
+ fclose(fp);
- ULOG_ERR("extroot: UUID mismatch (root: %s, %s: %s)\n",
- pr->uuid, basename(path), uuid);
- return -1;
- }
- }
+ if (*uuid && !strcasecmp(uuid, pr->uuid))
+ return 0;
- ULOG_ERR("extroot: unable to lookup root device %s\n", devpath);
+ ULOG_ERR("extroot: UUID mismatch (root: %s, %s: %s)\n", pr->uuid,
+ basename(path), uuid);
return -1;
}