]> git.ozlabs.org Git - petitboot/blobdiff - discover/udev.c
discover: Mount snapshots for all eligible disk devices
[petitboot] / discover / udev.c
index 6ccb8d4ba42917aed8669cf4e78bff03cc500a6e..75393d51768cb9ab1782112a71c7c8d4f4cd4fdc 100644 (file)
@@ -25,6 +25,7 @@
 #include "pb-discover.h"
 #include "device-handler.h"
 #include "cdrom.h"
+#include "devmapper.h"
 
 /* We set a default monitor buffer size, as we may not process monitor
  * events while performing device discvoery. systemd uses a 128M buffer, so
@@ -94,12 +95,16 @@ static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev,
 
        node = udev_device_get_devnode(dev);
        path = udev_device_get_devpath(dev);
-       if (path && (strstr(path, "virtual/block/loop")
-                       || strstr(path, "virtual/block/ram"))) {
+       if (path && strstr(path, "virtual/block/loop")) {
                pb_log("SKIP: %s: ignored (path=%s)\n", name, path);
                return 0;
        }
 
+       if (path && strstr(path, "virtual/block/ram")) {
+               device_handler_add_ramdisk(udev->handler, node);
+               return 0;
+       }
+
        cdrom = node && !!udev_device_get_property_value(dev, "ID_CDROM");
        if (cdrom) {
                /* CDROMs require a little initialisation, to get
@@ -111,6 +116,14 @@ static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev,
                }
        }
 
+       /* If our environment's udev can recognise them explictly skip any
+        * device mapper devices we encounter */
+       const char *devname = udev_device_get_property_value(dev, "DM_NAME");
+       if (devname) {
+               pb_log("SKIP: dm-device %s\n", devname);
+               return 0;
+       }
+
        type = udev_device_get_property_value(dev, "ID_FS_TYPE");
        if (!type) {
                pb_log("SKIP: %s: no ID_FS_TYPE property\n", name);
@@ -142,6 +155,9 @@ static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev,
 
        udev_setup_device_params(dev, ddev);
 
+       if (ddev->device->type == DEVICE_TYPE_DISK)
+               devmapper_init_snapshot(udev->handler, ddev);
+
        device_handler_discover(udev->handler, ddev);
 
        return 0;