From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Sun, 15 May 2022 22:41:01 +0200 Received: from metis.ext.pengutronix.de ([2001:67c:670:201:290:27ff:fe1d:cc33]) by lore.white.stw.pengutronix.de with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1nqL2z-00Ea4I-6Y for lore@lore.pengutronix.de; Sun, 15 May 2022 22:41:01 +0200 Received: from localhost ([127.0.0.1] helo=metis.ext.pengutronix.de) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1nqL2x-0004Wo-HF; Sun, 15 May 2022 22:40:59 +0200 Received: from ptx.hi.pengutronix.de ([2001:67c:670:100:1d::c0]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1nqL2t-0004WE-Rz; Sun, 15 May 2022 22:40:55 +0200 Received: from rhi by ptx.hi.pengutronix.de with local (Exim 4.92) (envelope-from ) id 1nqL2t-0001dj-I1; Sun, 15 May 2022 22:40:55 +0200 Date: Sun, 15 May 2022 22:40:55 +0200 From: Roland Hieber To: Michael Olbrich Message-ID: <20220515204055.lwdfnjegiapbzc3m@pengutronix.de> References: <20220511082125.4187531-1-m.olbrich@pengutronix.de> <20220511082125.4187531-3-m.olbrich@pengutronix.de> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <20220511082125.4187531-3-m.olbrich@pengutronix.de> User-Agent: NeoMutt/20180716 Subject: Re: [OSS-Tools] [PATCH v4 2/3] libdt: add support for barebox, storage-by-uuid X-BeenThere: oss-tools@pengutronix.de X-Mailman-Version: 2.1.29 Precedence: list List-Id: Pengutronix Public Open-Source-Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: oss-tools@pengutronix.de Sender: "OSS-Tools" X-SA-Exim-Connect-IP: 127.0.0.1 X-SA-Exim-Mail-From: oss-tools-bounces@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false On Wed, May 11, 2022 at 10:21:24AM +0200, Michael Olbrich wrote: > Signed-off-by: Michael Olbrich > --- > > 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.hieber@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 |