94e0190082
Allow a wider audience to test this pending series. Use about to be submitted v3 which factors out block notification support. Apart from dropping the no longer needed (and problematic) fallback for for the 'partitions' node being present at the device parent there are no intended functional changes. As opening a block device as file is not supported yet in Kernel v6.6, use the previous method as backporting seems a bit too involving. Fixes: #15642 Signed-off-by: Daniel Golle <daniel@makrotopia.org>
75 lines
2.2 KiB
Diff
75 lines
2.2 KiB
Diff
From 7f4c9c534aabe1315669e076d3fe0af0fd374cda Mon Sep 17 00:00:00 2001
|
|
From: Daniel Golle <daniel@makrotopia.org>
|
|
Date: Thu, 30 May 2024 03:13:19 +0100
|
|
Subject: [PATCH 2/9] block: partitions: populate fwnode
|
|
|
|
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(+)
|
|
|
|
--- 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 *) = {
|
|
@@ -292,6 +294,40 @@ static ssize_t whole_disk_show(struct de
|
|
}
|
|
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)
|
|
+ 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->bd_partno != 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.
|
|
@@ -374,6 +410,8 @@ static struct block_device *add_partitio
|
|
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);
|