Re: [RFC PATCH 12/20] nvdimm/namespace_label: Skip region label during namespace creation
From: Jonathan Cameron
Date: Mon Jun 23 2025 - 05:18:05 EST
On Tue, 17 Jun 2025 18:09:36 +0530
Neeraj Kumar <s.neeraj@xxxxxxxxxxx> wrote:
> During namespace creation skip presence of region label if present.
> Also preserve region label into labels list if present.
>
> Signed-off-by: Neeraj Kumar <s.neeraj@xxxxxxxxxxx>
> ---
> drivers/nvdimm/namespace_devs.c | 48 +++++++++++++++++++++++++++++----
> 1 file changed, 43 insertions(+), 5 deletions(-)
>
> diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
> index b081661b7aaa..ca8f8546170c 100644
> --- a/drivers/nvdimm/namespace_devs.c
> +++ b/drivers/nvdimm/namespace_devs.c
> @@ -1976,6 +1976,10 @@ static struct device **scan_labels(struct nd_region *nd_region)
> if (!nd_label)
> continue;
>
> + /* skip region labels if present */
> + if (is_region_label(ndd, nd_label))
> + continue;
> +
> /* skip labels that describe extents outside of the region */
> if (nsl_get_dpa(ndd, &nd_label->ns_label) < nd_mapping->start ||
> nsl_get_dpa(ndd, &nd_label->ns_label) > map_end)
> @@ -2014,9 +2018,29 @@ static struct device **scan_labels(struct nd_region *nd_region)
>
> if (count == 0) {
> struct nd_namespace_pmem *nspm;
> + for (i = 0; i < nd_region->ndr_mappings; i++) {
> + struct nd_label_ent *le, *e;
> + LIST_HEAD(list);
>
> - /* Publish a zero-sized namespace for userspace to configure. */
> - nd_mapping_free_labels(nd_mapping);
> + nd_mapping = &nd_region->mapping[i];
> + if (list_empty(&nd_mapping->labels))
> + continue;
> +
> + list_for_each_entry_safe(le, e, &nd_mapping->labels,
> + list) {
> + struct nd_lsa_label *nd_label = le->label;
> +
> + /* preserve region labels if present */
> + if (is_region_label(ndd, nd_label))
> + list_move_tail(&le->list, &list);
> + }
> +
> + /* Publish a zero-sized namespace for userspace
Comment syntax as before looks to be inconsistent with file.
> + * to configure.
> + */
> + nd_mapping_free_labels(nd_mapping);
> + list_splice_init(&list, &nd_mapping->labels);
> + }
> nspm = kzalloc(sizeof(*nspm), GFP_KERNEL);
> if (!nspm)
> goto err;
> @@ -2028,7 +2052,7 @@ static struct device **scan_labels(struct nd_region *nd_region)
> } else if (is_memory(&nd_region->dev)) {
> /* clean unselected labels */
> for (i = 0; i < nd_region->ndr_mappings; i++) {
> - struct list_head *l, *e;
> + struct nd_label_ent *le, *e;
> LIST_HEAD(list);
> int j;
>
> @@ -2039,10 +2063,24 @@ static struct device **scan_labels(struct nd_region *nd_region)
> }
>
> j = count;
> - list_for_each_safe(l, e, &nd_mapping->labels) {
> + list_for_each_entry_safe(le, e, &nd_mapping->labels,
> + list) {
> + struct nd_lsa_label *nd_label = le->label;
> +
> + /* preserve region labels */
> + if (is_region_label(ndd, nd_label)) {
> + list_move_tail(&le->list, &list);
> + continue;
> + }
> +
> + /* Once preserving selected ns label done
Comment syntax.
> + * break out of loop
> + */
> if (!j--)
> break;
> - list_move_tail(l, &list);
> +
> + /* preserve selected ns label */
> + list_move_tail(&le->list, &list);
> }
> nd_mapping_free_labels(nd_mapping);
> list_splice_init(&list, &nd_mapping->labels);