From mboxrd@z Thu Jan 1 00:00:00 1970 Delivery-date: Tue, 10 May 2022 08:57:42 +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 1noJoU-007wYo-He for lore@lore.pengutronix.de; Tue, 10 May 2022 08:57:42 +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 1noJoS-00065g-Im; Tue, 10 May 2022 08:57:40 +0200 Received: from drehscheibe.grey.stw.pengutronix.de ([2a0a:edc0:0:c01:1d::a2]) by metis.ext.pengutronix.de with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1noJoO-00063s-SJ; Tue, 10 May 2022 08:57:36 +0200 Received: from [2a0a:edc0:0:1101:1d::39] (helo=dude03.red.stw.pengutronix.de) by drehscheibe.grey.stw.pengutronix.de with esmtp (Exim 4.94.2) (envelope-from ) id 1noJoP-001RKU-H2; Tue, 10 May 2022 08:57:36 +0200 Received: from mol by dude03.red.stw.pengutronix.de with local (Exim 4.94.2) (envelope-from ) id 1noJoN-00EeJf-Fm; Tue, 10 May 2022 08:57:35 +0200 From: Michael Olbrich To: oss-tools@pengutronix.de Date: Tue, 10 May 2022 08:57:27 +0200 Message-Id: <20220510065728.3489540-3-m.olbrich@pengutronix.de> X-Mailer: git-send-email 2.30.2 In-Reply-To: <20220510065728.3489540-1-m.olbrich@pengutronix.de> References: <20220510065728.3489540-1-m.olbrich@pengutronix.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit Subject: [OSS-Tools] [PATCH v3 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: Michael Olbrich 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 Signed-off-by: Michael Olbrich --- uuid comparison fixed: - compare the correct uuids - don't crash when no uuid is present src/libdt.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 69 insertions(+), 5 deletions(-) diff --git a/src/libdt.c b/src/libdt.c index 48c31931e8a1..f2c7c49ebcde 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(); + 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); + + /* 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 && !strcmp(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 && !strcmp(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