]> git.ozlabs.org Git - petitboot/blobdiff - discover/device-handler.c
discover: Increase udev monitor buffer size
[petitboot] / discover / device-handler.c
index a2713904f01f4f85e30547c5a63ff643b0e46bf6..8bac86673b89abdc598991fa6c77eb19a9c58962 100644 (file)
@@ -7,6 +7,7 @@
 #include <mntent.h>
 #include <sys/stat.h>
 #include <sys/wait.h>
+#include <sys/mount.h>
 
 #include <talloc/talloc.h>
 #include <list/list.h>
@@ -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;
 }