+ if (process_run_simple(handler, pb_system_apps.vgscan, "-qq", NULL))
+ pb_log("%s: Failed to execute vgscan\n", __func__);
+
+ if (process_run_simple(handler, pb_system_apps.vgchange, "-ay", "-qq",
+ NULL))
+ pb_log("%s: Failed to execute vgchange\n", __func__);
+}
+
+static int udev_handle_block_add(struct pb_udev *udev, struct udev_device *dev,
+ const char *name)
+{
+ char *devlinks = NULL, *link, *saveptr = NULL;
+ struct discover_device *ddev;
+ unsigned int i = 0;
+ const char *typestr;
+ const char *uuid;
+ const char *path;
+ const char *node;
+ const char *prop;
+ const char *type;
+ const char *devname;
+ const char *ignored_types[] = {
+ "linux_raid_member",
+ "swap",
+ NULL,
+ };
+ bool cdrom, usb;
+
+ typestr = udev_device_get_devtype(dev);
+ if (!typestr) {
+ pb_debug("udev_device_get_devtype failed\n");
+ return -1;
+ }
+
+ if (!(!strcmp(typestr, "disk") || !strcmp(typestr, "partition"))) {
+ pb_log("SKIP %s: invalid type %s\n", name, typestr);
+ return 0;
+ }
+
+ node = udev_device_get_devnode(dev);
+ path = udev_device_get_devpath(dev);
+ 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
+ * petitboot-compatible tray behaviour */
+ cdrom_init(node);
+ if (!cdrom_media_present(node)) {
+ pb_log("SKIP: %s: no media present\n", name);
+ return 0;
+ }
+ }
+
+ /* Ignore any device mapper devices that aren't logical volumes */
+ 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;
+ }
+
+ type = udev_device_get_property_value(dev, "ID_FS_TYPE");
+ if (!type) {
+ pb_log("SKIP: %s: no ID_FS_TYPE property\n", name);
+ return 0;
+ }
+
+ while (ignored_types[i]) {
+ if (!strncmp(type, ignored_types[i], strlen(ignored_types[i]))) {
+ pb_log("SKIP: %s: ignore '%s' filesystem\n", name, type);
+ return 0;
+ }
+ i++;
+ }
+
+ /* 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;
+ }