X-Git-Url: https://git.ozlabs.org/?a=blobdiff_plain;f=discover%2Fudev.c;h=0c3da66a6eeaa5347ae7ca137e57bb6779c714e8;hb=HEAD;hp=45a8b56b05dd3847b9face8e6dec0f401e3081f6;hpb=58db060fbb1548a0acdfc475fa41fe86fb32dd11;p=petitboot diff --git a/discover/udev.c b/discover/udev.c index 45a8b56..0c3da66 100644 --- a/discover/udev.c +++ b/discover/udev.c @@ -81,11 +81,11 @@ static void udev_setup_device_params(struct udev_device *udev, static void lvm_vg_search(struct device_handler *handler) { if (process_run_simple(handler, pb_system_apps.vgscan, "-qq", NULL)) - pb_log("%s: Failed to execute vgscan\n", __func__); + pb_log_fn("Failed to execute vgscan\n"); if (process_run_simple(handler, pb_system_apps.vgchange, "-ay", "-qq", NULL)) - pb_log("%s: Failed to execute vgchange\n", __func__); + pb_log_fn("Failed to execute vgchange\n"); } static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev, @@ -106,7 +106,7 @@ static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev, "swap", NULL, }; - bool cdrom, usb; + bool cdrom, usb, luks = false; typestr = udev_device_get_devtype(dev); if (!typestr) { @@ -142,11 +142,18 @@ static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev, } } - /* Ignore any device mapper devices that aren't logical volumes */ + /* + * Ignore any device mapper devices that aren't logical volumes or + * opened encrypted devices + */ devname = udev_device_get_property_value(dev, "DM_NAME"); - if (devname && ! udev_device_get_property_value(dev, "DM_LV_NAME")) { - pb_debug("SKIP: dm-device %s\n", devname); - return 0; + if (devname) { + if (device_handler_found_crypt_device(udev->handler, devname)) { + luks = true; + } else if (!udev_device_get_property_value(dev, "DM_LV_NAME")) { + pb_debug("SKIP: dm-device %s\n", devname); + return 0; + } } type = udev_device_get_property_value(dev, "ID_FS_TYPE"); @@ -216,16 +223,32 @@ static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev, usb = !!udev_device_get_property_value(dev, "ID_USB_DRIVER"); if (cdrom) ddev->device->type = DEVICE_TYPE_OPTICAL; + else if (strncmp(type, "crypto_LUKS", strlen("crypto_LUKS")) == 0) + ddev->device->type = DEVICE_TYPE_LUKS; else ddev->device->type = usb ? DEVICE_TYPE_USB : DEVICE_TYPE_DISK; udev_setup_device_params(dev, ddev); + /* + * Don't perform discovery on encrypted devices, just register and + * notify clients. + */ + if (ddev->device->type == DEVICE_TYPE_LUKS) { + pb_log("Notifying clients about encrypted device %s\n", + name); + device_handler_add_encrypted_dev(udev->handler, ddev); + return 0; + } + /* Create a snapshot for all disk devices */ if ((ddev->device->type == DEVICE_TYPE_DISK || ddev->device->type == DEVICE_TYPE_USB)) devmapper_init_snapshot(udev->handler, ddev); + /* Note if this is an opened LUKS device */ + ddev->crypt_device = luks; + device_handler_discover(udev->handler, ddev); return 0; @@ -241,7 +264,7 @@ static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev, static int udev_check_interface_ready(struct device_handler *handler, struct udev_device *dev) { - const char *name, *name_path, *ifindex, *interface, *mac_name; + const char *name, *ifindex, *interface, *mac_name; uint8_t *mac; char byte[3]; unsigned int i, j; @@ -253,13 +276,12 @@ static int udev_check_interface_ready(struct device_handler *handler, return -1; } - name_path = udev_device_get_property_value(dev, "ID_NET_NAME_PATH"); ifindex = udev_device_get_property_value(dev, "IFINDEX"); interface = udev_device_get_property_value(dev, "INTERFACE"); mac_name = udev_device_get_property_value(dev, "ID_NET_NAME_MAC"); /* Physical interfaces should have all of these properties */ - if (!name_path || !ifindex || !interface || !mac_name) { + if (!ifindex || !interface || !mac_name) { pb_debug("%s: interface %s missing properties\n", __func__, name); return -1;