On Wed, May 11, 2022 at 10:21:24AM +0200, Michael Olbrich wrote:
> Signed-off-by: Michael Olbrich <m.olbr...@pengutronix.de>
> ---
> 
> changes in v3:
> uuid comparison fixed:
>  - compare the correct uuids
>  - don't crash when no uuid is present
> 
> changes in v4:
> use strcasecmp() to make the uuid check case insensitive.
> 
>  src/libdt.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++----
>  1 file changed, 69 insertions(+), 5 deletions(-)
> 
> diff --git a/src/libdt.c b/src/libdt.c
> index 48c31931e8a1..4076d9a2f4a3 100644
> --- a/src/libdt.c
> +++ b/src/libdt.c
> @@ -2358,6 +2358,52 @@ out:
>       return dev;
>  }
>  
> +static struct udev_device *of_find_device_by_uuid(const char *uuid)
> +{
> +     struct udev *udev;
> +     struct udev_enumerate *enumerate;
> +     struct udev_list_entry *devices, *dev_list_entry;
> +     int ret = 0;
> +
> +     udev = udev_new();

According to the udev docs, I think this should be udev_unref()ed
somewhere, see for example in of_find_mtd_device() above.

Hmm… looking through the existing code there are more places which could
profit from an udev_unref()…

> +     if (!udev) {
> +               fprintf(stderr, "Can't create udev\n");
> +               return NULL;
> +     }
> +
> +     enumerate = udev_enumerate_new(udev);
> +     udev_enumerate_add_match_subsystem(enumerate, "block");
> +     udev_enumerate_scan_devices(enumerate);
> +     devices = udev_enumerate_get_list_entry(enumerate);
> +     udev_list_entry_foreach(dev_list_entry, devices) {
> +             const char *path, *devtype, *outpath, *dev_uuid;
> +             struct udev_device *device;
> +
> +             path = udev_list_entry_get_name(dev_list_entry);
> +             device = udev_device_new_from_syspath(udev, path);
> +

Same for a udev_device_unref(), somewhere…?

 - Roland

> +             /* distinguish device (disk) from partitions */
> +             devtype = udev_device_get_devtype(device);
> +             if (!devtype)
> +                     continue;
> +             if (!strcmp(devtype, "disk")) {
> +                     dev_uuid = udev_device_get_property_value(device, 
> "ID_PART_TABLE_UUID");
> +                     if (dev_uuid && !strcasecmp(dev_uuid, uuid)) {
> +                             outpath = udev_device_get_devnode(device);
> +                             return device;
> +                     }
> +             } else if (!strcmp(devtype, "partition")) {
> +                     dev_uuid = udev_device_get_property_value(device, 
> "ID_PART_ENTRY_UUID");
> +                     if (dev_uuid && !strcasecmp(dev_uuid, uuid)) {
> +                             outpath = udev_device_get_devnode(device);
> +                             return device;
> +                     }
> +             }
> +
> +     }
> +     return NULL;
> +}
> +
>  /*
>   * of_get_devicepath - get information how to access device corresponding to 
> a device_node
>   * @partition_node:  The device_node which shall be accessed
> @@ -2443,11 +2489,29 @@ int of_get_devicepath(struct device_node 
> *partition_node, char **devpath, off_t
>       if (!strcmp(node->name, "partitions"))
>               node = node->parent;
>  
> -     dev = of_find_device_by_node_path(node->full_name);
> -     if (!dev) {
> -             fprintf(stderr, "%s: cannot find device from node %s\n", 
> __func__,
> -                             node->full_name);
> -             return -ENODEV;
> +     if (of_device_is_compatible(node, "barebox,storage-by-uuid")) {
> +             const char *uuid;
> +
> +             ret = of_property_read_string(node, "uuid", &uuid);
> +             if (ret) {
> +                     fprintf(stderr, "%s: missing uuid property for %s\n", 
> __func__,
> +                                     node->full_name);
> +                     return -ENODEV;
> +             }
> +             dev = of_find_device_by_uuid(uuid);
> +             if (!dev) {
> +                     fprintf(stderr, "%s: cannot find device for uuid %s\n", 
> __func__,
> +                             uuid);
> +                     return -ENODEV;
> +             }
> +     }
> +     else {
> +             dev = of_find_device_by_node_path(node->full_name);
> +             if (!dev) {
> +                     fprintf(stderr, "%s: cannot find device from node 
> %s\n", __func__,
> +                                     node->full_name);
> +                     return -ENODEV;
> +             }
>       }
>  
>       mtd = of_find_mtd_device(dev);
> -- 
> 2.30.2
> 
> 
> 

-- 
Roland Hieber, Pengutronix e.K.          | r.hie...@pengutronix.de     |
Steuerwalder Str. 21                     | https://www.pengutronix.de/ |
31137 Hildesheim, Germany                | Phone: +49-5121-206917-0    |
Amtsgericht Hildesheim, HRA 2686         | Fax:   +49-5121-206917-5555 |

Reply via email to