+ /* Search for LVM logical volumes if we see an LVM member */
+ if (strncmp(type, "LVM2_member", strlen("LVM2_member")) == 0) {
+ lvm_vg_search(udev->handler);
+ return 0;
+ }
+
+ /* We may see multipath devices; they'll have the same uuid as an
+ * existing device, so only parse the first. */
+ uuid = udev_device_get_property_value(dev, "ID_FS_UUID");
+ if (uuid) {
+ ddev = device_lookup_by_uuid(udev->handler, uuid);
+ if (ddev) {
+ pb_log("SKIP: %s UUID [%s] already present (as %s)\n",
+ name, uuid, ddev->device->id);
+ return 0;
+ }
+ }
+
+ /* Use DM_NAME for logical volumes, or the device name otherwise */
+ ddev = discover_device_create(udev->handler, uuid, devname ?: name);
+
+ if (devname) {
+ /*
+ * For logical volumes udev_device_get_devnode() returns a path
+ * of the form "/dev/dm-xx". These nodes names are not
+ * persistent and are opaque to the user. Instead use the more
+ * recognisable "/dev/mapper/lv-name" node if it is available.
+ */
+ devlinks = talloc_strdup(ddev,
+ udev_device_get_property_value(dev, "DEVLINKS"));
+ link = devlinks ? strtok_r(devlinks, " ", &saveptr) : NULL;
+ while (link) {
+ if (strncmp(link, "/dev/mapper/",
+ strlen("/dev/mapper/")) == 0) {
+ node = link;
+ break;
+ }
+ link = strtok_r(NULL, " ", &saveptr);
+ }
+ }
+
+ ddev->device_path = talloc_strdup(ddev, node);
+ talloc_free(devlinks);
+
+ if (uuid)
+ ddev->uuid = talloc_strdup(ddev, uuid);
+ prop = udev_device_get_property_value(dev, "ID_FS_LABEL");
+ if (prop)
+ ddev->label = talloc_strdup(ddev, prop);
+
+ 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;