X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fdevice-handler.c;h=8bac86673b89abdc598991fa6c77eb19a9c58962;hb=70fb2ec0af31c1d78c8655ef13f682d597921390;hp=a2713904f01f4f85e30547c5a63ff643b0e46bf6;hpb=aa530148044a7c6d7ec7b6a32672cc69d53979b2;p=petitboot diff --git a/discover/device-handler.c b/discover/device-handler.c index a271390..8bac866 100644 --- a/discover/device-handler.c +++ b/discover/device-handler.c @@ -7,6 +7,7 @@ #include #include #include +#include #include #include @@ -250,7 +251,7 @@ const char *discover_device_get_param(struct discover_device *device, list_for_each_entry(&device->params, param, list) { if (!strcmp(param->name, name)) - return param->name; + return param->value; } return NULL; } @@ -372,7 +373,8 @@ static int default_timeout(void *arg) static bool priority_match(struct boot_priority *prio, struct discover_boot_option *opt) { - return prio->type == opt->device->device->type; + return prio->type == opt->device->device->type || + prio->type == DEVICE_TYPE_ANY; } static int default_option_priority(struct discover_boot_option *opt) @@ -805,6 +807,7 @@ static bool check_existing_mount(struct discover_device *dev) static int mount_device(struct discover_device *dev) { + const char *fstype; int rc; if (!dev->device_path) @@ -816,6 +819,10 @@ static int mount_device(struct discover_device *dev) if (check_existing_mount(dev)) return 0; + fstype = discover_device_get_param(dev, "ID_FS_TYPE"); + if (!fstype) + return 0; + dev->mount_path = join_paths(dev, mount_base(), dev->device_path); @@ -825,9 +832,10 @@ static int mount_device(struct discover_device *dev) goto err_free; } - rc = process_run_simple(dev, pb_system_apps.mount, - dev->device_path, dev->mount_path, - "-o", "ro", NULL); + pb_log("mounting device %s read-only\n", dev->device_path); + errno = 0; + rc = mount(dev->device_path, dev->mount_path, fstype, + MS_RDONLY | MS_SILENT, ""); if (!rc) { dev->mounted = true; dev->mounted_rw = false; @@ -835,16 +843,8 @@ static int mount_device(struct discover_device *dev) return 0; } - /* Retry mount without ro option. */ - rc = process_run_simple(dev, pb_system_apps.mount, - dev->device_path, dev->mount_path, NULL); - - if (!rc) { - dev->mounted = true; - dev->mounted_rw = true; - dev->unmount = true; - return 0; - } + pb_log("couldn't mount device %s: mount failed: %s\n", + dev->device_path, strerror(errno)); pb_rmdir_recursive(mount_base(), dev->mount_path); err_free: @@ -855,15 +855,14 @@ err_free: static int umount_device(struct discover_device *dev) { - int status; + int rc; if (!dev->mounted || !dev->unmount) return 0; - status = process_run_simple(dev, pb_system_apps.umount, - dev->mount_path, NULL); - - if (!WIFEXITED(status) || WEXITSTATUS(status) != 0) + pb_log("unmounting device %s\n", dev->device_path); + rc = umount(dev->mount_path); + if (rc) return -1; dev->mounted = false; @@ -888,8 +887,9 @@ int device_request_write(struct discover_device *dev, bool *release) if (dev->mounted_rw) return 0; - rc = process_run_simple(dev, pb_system_apps.mount, dev->mount_path, - "-o", "remount,rw", NULL); + pb_log("remounting device %s read-write\n", dev->device_path); + rc = mount(dev->device_path, dev->mount_path, "", + MS_REMOUNT | MS_SILENT, ""); if (rc) return -1; @@ -903,8 +903,9 @@ void device_release_write(struct discover_device *dev, bool release) if (!release) return; - process_run_simple(dev, pb_system_apps.mount, dev->mount_path, - "-o", "remount,ro", NULL); + pb_log("remounting device %s read-only\n", dev->device_path); + mount(dev->device_path, dev->mount_path, "", + MS_REMOUNT | MS_RDONLY | MS_SILENT, ""); dev->mounted_rw = false; }