Message ID | 3329bf2fa25695934b392944ff977ae95dc8c02d.1717031992.git.daniel@makrotopia.org |
---|---|
State | Superseded |
Headers | show |
Series | nvmem: implement block NVMEM provider | expand |
Hi Daniel, On 5/30/24 04:13, Daniel Golle wrote: > Let block partitions to be represented by a firmware node and hence > allow them to being referenced e.g. for use with blk-nvmem. > > Signed-off-by: Daniel Golle <daniel@makrotopia.org> > --- > block/partitions/core.c | 41 +++++++++++++++++++++++++++++++++++++++++ > 1 file changed, 41 insertions(+) > > diff --git a/block/partitions/core.c b/block/partitions/core.c > index ab76e64f0f6c..93d109409905 100644 > --- a/block/partitions/core.c > +++ b/block/partitions/core.c > @@ -10,6 +10,8 @@ > #include <linux/ctype.h> > #include <linux/vmalloc.h> > #include <linux/raid/detect.h> > +#include <linux/property.h> > + > #include "check.h" > > static int (*const check_part[])(struct parsed_partitions *) = { > @@ -281,6 +283,43 @@ static ssize_t whole_disk_show(struct device *dev, > } > static const DEVICE_ATTR(whole_disk, 0444, whole_disk_show, NULL); > > +static struct fwnode_handle *find_partition_fwnode(struct block_device *bdev) > +{ > + struct fwnode_handle *fw_parts, *fw_part; > + struct device *ddev = disk_to_dev(bdev->bd_disk); > + const char *partname, *uuid; > + u32 partno; > + > + fw_parts = device_get_named_child_node(ddev, "partitions"); > + if (!fw_parts) > + fw_parts = device_get_named_child_node(ddev->parent, "partitions"); Could you please explain why you try to get the node from the device and the parent when it is not available? I think this should go into the commit description. > + > + if (!fw_parts) > + return NULL; > + > + fwnode_for_each_child_node(fw_parts, fw_part) { > + if (!fwnode_property_read_string(fw_part, "uuid", &uuid) && > + (!bdev->bd_meta_info || strncmp(uuid, > + bdev->bd_meta_info->uuid, > + PARTITION_META_INFO_UUIDLTH))) I think you should check that the uuid provided in the device tree is not longer than PARTITION_META_INFO_UUIDLTH. Same for the volume name. > + continue; > + > + if (!fwnode_property_read_string(fw_part, "partname", &partname) && > + (!bdev->bd_meta_info || strncmp(partname, > + bdev->bd_meta_info->volname, > + PARTITION_META_INFO_VOLNAMELTH))) > + continue; > + > + if (!fwnode_property_read_u32(fw_part, "partno", &partno) && > + bdev_partno(bdev) != partno) > + continue; > + > + return fw_part; > + } > + > + return NULL; > +} > + > /* > * Must be called either with open_mutex held, before a disk can be opened or > * after all disk users are gone. > @@ -355,6 +394,8 @@ static struct block_device *add_partition(struct gendisk *disk, int partno, > goto out_put; > } > > + device_set_node(pdev, find_partition_fwnode(bdev)); > + > /* delay uevent until 'holders' subdir is created */ > dev_set_uevent_suppress(pdev, 1); > err = device_add(pdev); Hauke
diff --git a/block/partitions/core.c b/block/partitions/core.c index ab76e64f0f6c..93d109409905 100644 --- a/block/partitions/core.c +++ b/block/partitions/core.c @@ -10,6 +10,8 @@ #include <linux/ctype.h> #include <linux/vmalloc.h> #include <linux/raid/detect.h> +#include <linux/property.h> + #include "check.h" static int (*const check_part[])(struct parsed_partitions *) = { @@ -281,6 +283,43 @@ static ssize_t whole_disk_show(struct device *dev, } static const DEVICE_ATTR(whole_disk, 0444, whole_disk_show, NULL); +static struct fwnode_handle *find_partition_fwnode(struct block_device *bdev) +{ + struct fwnode_handle *fw_parts, *fw_part; + struct device *ddev = disk_to_dev(bdev->bd_disk); + const char *partname, *uuid; + u32 partno; + + fw_parts = device_get_named_child_node(ddev, "partitions"); + if (!fw_parts) + fw_parts = device_get_named_child_node(ddev->parent, "partitions"); + + if (!fw_parts) + return NULL; + + fwnode_for_each_child_node(fw_parts, fw_part) { + if (!fwnode_property_read_string(fw_part, "uuid", &uuid) && + (!bdev->bd_meta_info || strncmp(uuid, + bdev->bd_meta_info->uuid, + PARTITION_META_INFO_UUIDLTH))) + continue; + + if (!fwnode_property_read_string(fw_part, "partname", &partname) && + (!bdev->bd_meta_info || strncmp(partname, + bdev->bd_meta_info->volname, + PARTITION_META_INFO_VOLNAMELTH))) + continue; + + if (!fwnode_property_read_u32(fw_part, "partno", &partno) && + bdev_partno(bdev) != partno) + continue; + + return fw_part; + } + + return NULL; +} + /* * Must be called either with open_mutex held, before a disk can be opened or * after all disk users are gone. @@ -355,6 +394,8 @@ static struct block_device *add_partition(struct gendisk *disk, int partno, goto out_put; } + device_set_node(pdev, find_partition_fwnode(bdev)); + /* delay uevent until 'holders' subdir is created */ dev_set_uevent_suppress(pdev, 1); err = device_add(pdev);
Let block partitions to be represented by a firmware node and hence allow them to being referenced e.g. for use with blk-nvmem. Signed-off-by: Daniel Golle <daniel@makrotopia.org> --- block/partitions/core.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+)