Message ID | afa870ec6ac1027561d1c002205ab1e05358a46c.1719368448.git.daniel@makrotopia.org (mailing list archive) |
---|---|
State | Superseded |
Headers | show |
Series | block: preparations for NVMEM provider | expand |
On 6/25/24 8:50 PM, Daniel Golle wrote: > diff --git a/block/partitions/core.c b/block/partitions/core.c > index ab76e64f0f6c..f88829e254e6 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,42 @@ 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; That last if check should to inside the previous one. > + fwnode_for_each_child_node(fw_parts, fw_part) { > + if (!fwnode_property_read_string(fw_part, "uuid", &uuid) && > + (!bdev->bd_meta_info || strlen(uuid) > PARTITION_META_INFO_UUIDLTH || > + 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 || strlen(uuid) > PARTITION_META_INFO_VOLNAMELTH || > + strncmp(partname, bdev->bd_meta_info->volname, > + PARTITION_META_INFO_VOLNAMELTH))) > + continue; This is pretty hard to make sense of...
On Wed, Jun 26, 2024 at 01:43:49PM -0600, Jens Axboe wrote: > On 6/25/24 8:50 PM, Daniel Golle wrote: > > diff --git a/block/partitions/core.c b/block/partitions/core.c > > index ab76e64f0f6c..f88829e254e6 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,42 @@ 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; > > That last if check should to inside the previous one. Actually the previous one should have been removed entirely. I somehow forgot to 'git add' that change. > > > + fwnode_for_each_child_node(fw_parts, fw_part) { > > + if (!fwnode_property_read_string(fw_part, "uuid", &uuid) && > > + (!bdev->bd_meta_info || strlen(uuid) > PARTITION_META_INFO_UUIDLTH || > > + 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 || strlen(uuid) > PARTITION_META_INFO_VOLNAMELTH || > > + strncmp(partname, bdev->bd_meta_info->volname, > > + PARTITION_META_INFO_VOLNAMELTH))) > > + continue; > > This is pretty hard to make sense of... I'll add comments explaining it. Or should I use another syntax, e.g. several nested if-clauses, instead?
On 6/26/24 1:58 PM, Daniel Golle wrote: > On Wed, Jun 26, 2024 at 01:43:49PM -0600, Jens Axboe wrote: >> On 6/25/24 8:50 PM, Daniel Golle wrote: >>> diff --git a/block/partitions/core.c b/block/partitions/core.c >>> index ab76e64f0f6c..f88829e254e6 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,42 @@ 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; >> >> That last if check should to inside the previous one. > > Actually the previous one should have been removed entirely. I somehow > forgot to 'git add' that change. > >> >>> + fwnode_for_each_child_node(fw_parts, fw_part) { >>> + if (!fwnode_property_read_string(fw_part, "uuid", &uuid) && >>> + (!bdev->bd_meta_info || strlen(uuid) > PARTITION_META_INFO_UUIDLTH || >>> + 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 || strlen(uuid) > PARTITION_META_INFO_VOLNAMELTH || >>> + strncmp(partname, bdev->bd_meta_info->volname, >>> + PARTITION_META_INFO_VOLNAMELTH))) >>> + continue; >> >> This is pretty hard to make sense of... > > I'll add comments explaining it. Or should I use another syntax, e.g. several > nested if-clauses, instead? Maybe some kind of helpers for these instead, with comments? Nobody can read the above.
diff --git a/block/partitions/core.c b/block/partitions/core.c index ab76e64f0f6c..f88829e254e6 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,42 @@ 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 || strlen(uuid) > PARTITION_META_INFO_UUIDLTH || + 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 || strlen(uuid) > PARTITION_META_INFO_VOLNAMELTH || + 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 +393,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 | 40 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+)