]> git.ozlabs.org Git - petitboot/commitdiff
discover: Check for devices with duplicate serial properties
authorJeremy Kerr <jk@ozlabs.org>
Tue, 24 Sep 2013 09:31:50 +0000 (17:31 +0800)
committerJeremy Kerr <jk@ozlabs.org>
Tue, 24 Sep 2013 09:31:50 +0000 (17:31 +0800)
If we have multipath devices present in the system, we'll end up with
duplicate mounts, parse results and boot options. This change adds a
check to see if we've encountered a device with this serial number
previously.

Signed-off-by: Jeremy Kerr <jk@ozlabs.org>
discover/device-handler.c
discover/device-handler.h
discover/udev.c

index 95d203920d6f72bf5176c2629e7d2f4aa430a447..251c517f884aaa0c2212898b2e71dd3ad37a8e9e 100644 (file)
@@ -103,6 +103,12 @@ static int device_match_id(struct discover_device *dev, const char *id)
        return !strcmp(dev->device->id, id);
 }
 
+static int device_match_serial(struct discover_device *dev, const char *serial)
+{
+       const char *val = discover_device_get_param(dev, "ID_SERIAL");
+       return val && !strcmp(val, serial);
+}
+
 static struct discover_device *device_lookup(
                struct device_handler *device_handler,
                int (match_fn)(struct discover_device *, const char *),
@@ -154,6 +160,13 @@ struct discover_device *device_lookup_by_id(
        return device_lookup(device_handler, device_match_id, id);
 }
 
+struct discover_device *device_lookup_by_serial(
+               struct device_handler *device_handler,
+               const char *serial)
+{
+       return device_lookup(device_handler, device_match_serial, serial);
+}
+
 void device_handler_destroy(struct device_handler *handler)
 {
        talloc_free(handler);
index 1d78a499f706102d6606d7077e8615523b6307d9..854be48dab48176e925e985eb56cf0a936fe48c6 100644 (file)
@@ -108,6 +108,9 @@ struct discover_device *device_lookup_by_label(struct device_handler *handler,
                const char *label);
 struct discover_device *device_lookup_by_id(struct device_handler *handler,
                const char *id);
+struct discover_device *device_lookup_by_serial(
+               struct device_handler *device_handler,
+               const char *serial);
 
 void discover_device_set_param(struct discover_device *device,
                const char *name, const char *value);
index 1c5cf71ff4fee7caf0949211ba4c0f7ee48afd37..e996e221228804d6a16a7a41aeb25463198800a8 100644 (file)
@@ -70,6 +70,7 @@ static int udev_handle_dev_add(struct pb_udev *udev, struct udev_device *dev)
 {
        struct discover_device *ddev;
        const char *typestr;
+       const char *serial;
        const char *path;
        const char *name;
 
@@ -104,6 +105,12 @@ static int udev_handle_dev_add(struct pb_udev *udev, struct udev_device *dev)
                return -1;
        }
 
+       /* we may also see multipath devices; same dev nodes (hence id), but
+        * different serial numbers */
+       serial = udev_device_get_property_value(dev, "ID_SERIAL");
+       if (serial && device_lookup_by_serial(udev->handler, serial))
+               return -1;
+
        ddev = discover_device_create(udev->handler, name);
 
        ddev->device_path = udev_device_get_devnode(dev);