From 8e9548839b13e5d0683e6a6c3ccfeb26e54f2bf9 Mon Sep 17 00:00:00 2001 From: Ahmad Fatoum Date: Mon, 14 Oct 2019 08:39:18 +0200 Subject: fs: devfs-core: have device_find_partition search symlinks The barebox,environment binding documentation notes following for the device-path property's second string: > can be the label for MTD partitions, the number for DOS > partitions (beginning with 0) or the name for GPT partitions. This doesn't work currently because the named partitions are realized as symlinks and those aren't searched by device_find_partition. Fix this by having symlinks feature an appropriate partname if the cdev they link at has one and then have device_find_partition search those as well. Signed-off-by: Ahmad Fatoum Signed-off-by: Sascha Hauer --- fs/devfs-core.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) (limited to 'fs') diff --git a/fs/devfs-core.c b/fs/devfs-core.c index 2b93a951f2..258bb2dbaa 100644 --- a/fs/devfs-core.c +++ b/fs/devfs-core.c @@ -122,10 +122,17 @@ struct cdev *device_find_partition(struct device_d *dev, const char *name) struct device_d *child; list_for_each_entry(cdev, &dev->cdevs, devices_list) { + struct cdev *cdevl; + if (!cdev->partname) continue; if (!strcmp(cdev->partname, name)) return cdev; + + list_for_each_entry(cdevl, &cdev->links, link_entry) { + if (!strcmp(cdevl->partname, name)) + return cdev_readlink(cdevl); + } } device_for_each_child(dev, child) { @@ -252,6 +259,20 @@ int devfs_create_link(struct cdev *cdev, const char *name) new = xzalloc(sizeof(*new)); new->name = xstrdup(name); new->link = cdev; + + if (cdev->partname) { + size_t partnameoff = 0; + + if (cdev->master) { + size_t masterlen = strlen(cdev->master->name); + + if (!strncmp(name, cdev->master->name, masterlen)) + partnameoff += masterlen + 1; + } + + new->partname = xstrdup(name + partnameoff); + } + INIT_LIST_HEAD(&new->links); list_add_tail(&new->list, &cdev_list); list_add_tail(&new->link_entry, &cdev->links); -- cgit v1.2.3