]> git.ozlabs.org Git - petitboot/blobdiff - discover/device-handler.c
discover: Increase udev monitor buffer size
[petitboot] / discover / device-handler.c
index c57b7b62880d8d4a8952fd896ac3bfe8dd38311d..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)
@@ -386,28 +388,36 @@ static int default_option_priority(struct discover_boot_option *opt)
        for (i = 0; i < config->n_boot_priorities; i++) {
                prio = &config->boot_priorities[i];
                if (priority_match(prio, opt))
-                       break;
+                       return prio->priority;
        }
 
-       return i;
+       return 0;
 }
 
 static void set_default(struct device_handler *handler,
                struct discover_boot_option *opt)
 {
+       int new_prio;
+
        if (!handler->autoboot_enabled)
                return;
 
+       new_prio = default_option_priority(opt);
+
+       /* A negative priority indicates that we don't want to boot this device
+        * by default */
+       if (new_prio < 0)
+               return;
+
        /* Resolve any conflicts: if we have a new default option, it only
         * replaces the current if it has a higher priority. */
        if (handler->default_boot_option) {
-               int new_prio, cur_prio;
+               int cur_prio;
 
-               new_prio = default_option_priority(opt);
                cur_prio = default_option_priority(
                                        handler->default_boot_option);
 
-               if (new_prio < cur_prio) {
+               if (new_prio > cur_prio) {
                        handler->default_boot_option = opt;
                        /* extend the timeout a little, so the user sees some
                         * indication of the change */
@@ -797,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)
@@ -808,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);
 
@@ -817,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;
@@ -827,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:
@@ -847,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;
@@ -880,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;
 
@@ -895,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;
 }