Re: [PATCH V4 07/17] nvdimm/label: Add region label delete support

2026-01-11 Thread Neeraj Kumar

On 19/11/25 12:50PM, Dave Jiang wrote:



On 11/19/25 12:52 AM, Neeraj Kumar wrote:

Create export routine nd_region_label_delete() used for deleting
region label from LSA. It will be used later from CXL subsystem

Signed-off-by: Neeraj Kumar 


Just one small thing below, otherwise
Reviewed-by: Dave Jiang 


---
 drivers/nvdimm/label.c  | 76 ++---
 drivers/nvdimm/label.h  |  1 +
 drivers/nvdimm/namespace_devs.c | 12 ++
 drivers/nvdimm/nd.h |  6 +++
 include/linux/libnvdimm.h   |  1 +
 5 files changed, 90 insertions(+), 6 deletions(-)







+int nd_region_label_delete(struct nd_region *nd_region)
+{
+   int rc;
+
+   nvdimm_bus_lock(&nd_region->dev);


You can use the new nvdimm_bus guard() now.

guard(nvdimm_bus)(&nd_region->dev);

DJ


Hi Dave, Thanks for RB tag, I have fixed it in V5.


Regards,
Neeraj


Re: [PATCH V4 07/17] nvdimm/label: Add region label delete support

2026-01-09 Thread Neeraj Kumar

On 17/12/25 03:05PM, Jonathan Cameron wrote:

On Wed, 19 Nov 2025 13:22:45 +0530
Neeraj Kumar  wrote:


Create export routine nd_region_label_delete() used for deleting
region label from LSA. It will be used later from CXL subsystem

Signed-off-by: Neeraj Kumar 

A few minor things inline.

Reviewed-by: Jonathan Cameron 


---
 drivers/nvdimm/label.c  | 76 ++---
 drivers/nvdimm/label.h  |  1 +
 drivers/nvdimm/namespace_devs.c | 12 ++
 drivers/nvdimm/nd.h |  6 +++
 include/linux/libnvdimm.h   |  1 +
 5 files changed, 90 insertions(+), 6 deletions(-)

diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c
index e90e48672da3..da55ecd95e2f 100644
--- a/drivers/nvdimm/label.c
+++ b/drivers/nvdimm/label.c
@@ -1225,7 +1225,8 @@ static int init_labels(struct nd_mapping *nd_mapping, int 
num_labels,
return max(num_labels, old_num_labels);
 }

-static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid)
+static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid,
+ enum label_type ltype)
 {
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
struct nd_label_ent *label_ent, *e;
@@ -1244,11 +1245,25 @@ static int del_labels(struct nd_mapping *nd_mapping, 
uuid_t *uuid)

mutex_lock(&nd_mapping->lock);
list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
-   if (label_ent->label)
+   if ((ltype == NS_LABEL_TYPE && !label_ent->label) ||
+   (ltype == RG_LABEL_TYPE && !label_ent->region_label))
continue;
active++;
-   if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
-   continue;
+
+   switch (ltype) {
+   case NS_LABEL_TYPE:
+   if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
+   continue;
+
+   break;
+   case RG_LABEL_TYPE:
+   if (!region_label_uuid_equal(label_ent->region_label,
+   uuid))


Align after equal( or just go a bit long on this line to improve readability.


Fixed it in V5




+   continue;
+
+   break;
+   }
+



@@ -1381,6 +1399,52 @@ int nd_pmem_region_label_update(struct nd_region 
*nd_region)
return 0;
 }

+int nd_pmem_region_label_delete(struct nd_region *nd_region)
+{
+   struct nd_interleave_set *nd_set = nd_region->nd_set;
+   struct nd_label_ent *label_ent;
+   int i, rc;
+
+   for (i = 0; i < nd_region->ndr_mappings; i++) {
+   struct nd_mapping *nd_mapping = &nd_region->mapping[i];
+   struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
+
+   /* Find non cxl format supported ndr_mappings */
+   if (!ndd->cxl) {
+   dev_info(&nd_region->dev, "Unsupported region label\n");
+   return -EINVAL;
+   }
+
+   /* Find if any NS label using this region */
+   guard(mutex)(&nd_mapping->lock);
+   list_for_each_entry(label_ent, &nd_mapping->labels, list) {
+   if (!label_ent->label)
+   continue;
+
+   /*
+* Check if any available NS labels has same
+* region_uuid in LSA
+*/
+   if (nsl_region_uuid_equal(label_ent->label,
+   &nd_set->uuid)) {
+   dev_dbg(&nd_region->dev,
+   "Region/Namespace label in use\n");
+   return -EBUSY;
+   }
+   }
+   }
+
+   for (i = 0; i < nd_region->ndr_mappings; i++) {
+   struct nd_mapping *nd_mapping = &nd_region->mapping[i];

Unless this gets more complex later, I'd not bother with this local variable.


Thanks Jonathan for review, i have fixed it in V5.


Regards,
Neeraj


Re: [PATCH V4 07/17] nvdimm/label: Add region label delete support

2025-12-17 Thread Jonathan Cameron
On Wed, 19 Nov 2025 13:22:45 +0530
Neeraj Kumar  wrote:

> Create export routine nd_region_label_delete() used for deleting
> region label from LSA. It will be used later from CXL subsystem
> 
> Signed-off-by: Neeraj Kumar 
A few minor things inline.

Reviewed-by: Jonathan Cameron 

> ---
>  drivers/nvdimm/label.c  | 76 ++---
>  drivers/nvdimm/label.h  |  1 +
>  drivers/nvdimm/namespace_devs.c | 12 ++
>  drivers/nvdimm/nd.h |  6 +++
>  include/linux/libnvdimm.h   |  1 +
>  5 files changed, 90 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c
> index e90e48672da3..da55ecd95e2f 100644
> --- a/drivers/nvdimm/label.c
> +++ b/drivers/nvdimm/label.c
> @@ -1225,7 +1225,8 @@ static int init_labels(struct nd_mapping *nd_mapping, 
> int num_labels,
>   return max(num_labels, old_num_labels);
>  }
>  
> -static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid)
> +static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid,
> +   enum label_type ltype)
>  {
>   struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
>   struct nd_label_ent *label_ent, *e;
> @@ -1244,11 +1245,25 @@ static int del_labels(struct nd_mapping *nd_mapping, 
> uuid_t *uuid)
>  
>   mutex_lock(&nd_mapping->lock);
>   list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
> - if (label_ent->label)
> + if ((ltype == NS_LABEL_TYPE && !label_ent->label) ||
> + (ltype == RG_LABEL_TYPE && !label_ent->region_label))
>   continue;
>   active++;
> - if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
> - continue;
> +
> + switch (ltype) {
> + case NS_LABEL_TYPE:
> + if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
> + continue;
> +
> + break;
> + case RG_LABEL_TYPE:
> + if (!region_label_uuid_equal(label_ent->region_label,
> + uuid))

Align after equal( or just go a bit long on this line to improve readability.

> + continue;
> +
> + break;
> + }
> +

> @@ -1381,6 +1399,52 @@ int nd_pmem_region_label_update(struct nd_region 
> *nd_region)
>   return 0;
>  }
>  
> +int nd_pmem_region_label_delete(struct nd_region *nd_region)
> +{
> + struct nd_interleave_set *nd_set = nd_region->nd_set;
> + struct nd_label_ent *label_ent;
> + int i, rc;
> +
> + for (i = 0; i < nd_region->ndr_mappings; i++) {
> + struct nd_mapping *nd_mapping = &nd_region->mapping[i];
> + struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
> +
> + /* Find non cxl format supported ndr_mappings */
> + if (!ndd->cxl) {
> + dev_info(&nd_region->dev, "Unsupported region label\n");
> + return -EINVAL;
> + }
> +
> + /* Find if any NS label using this region */
> + guard(mutex)(&nd_mapping->lock);
> + list_for_each_entry(label_ent, &nd_mapping->labels, list) {
> + if (!label_ent->label)
> + continue;
> +
> + /*
> +  * Check if any available NS labels has same
> +  * region_uuid in LSA
> +  */
> + if (nsl_region_uuid_equal(label_ent->label,
> + &nd_set->uuid)) {
> + dev_dbg(&nd_region->dev,
> + "Region/Namespace label in use\n");
> + return -EBUSY;
> + }
> + }
> + }
> +
> + for (i = 0; i < nd_region->ndr_mappings; i++) {
> + struct nd_mapping *nd_mapping = &nd_region->mapping[i];
Unless this gets more complex later, I'd not bother with this local variable.

> +
> + rc = del_labels(nd_mapping, &nd_set->uuid, RG_LABEL_TYPE);
> + if (rc)
> + return rc;
> + }
> +
> + return 0;
> +}

> diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c
> index 9450200b4470..9299a586bfce 100644
> --- a/drivers/nvdimm/namespace_devs.c
> +++ b/drivers/nvdimm/namespace_devs.c
> @@ -244,6 +244,18 @@ int nd_region_label_update(struct nd_region *nd_region)
>  }
>  EXPORT_SYMBOL_GPL(nd_region_label_update);
>  
> +int nd_region_label_delete(struct nd_region *nd_region)
> +{
> + int rc;
> +
> + nvdimm_bus_lock(&nd_region->dev);

Similar to earlier. Use the guard() for this to simplify things a little.

> + rc = nd_pmem_region_label_delete(nd_region);
> + nvdimm_bus_unlock(&nd_region->dev);
> +
> + return rc;
> +}
> +EXPORT_SYMBOL_GPL(nd_region_label_delete);



Re: [PATCH V4 07/17] nvdimm/label: Add region label delete support

2025-11-19 Thread Dave Jiang



On 11/19/25 12:52 AM, Neeraj Kumar wrote:
> Create export routine nd_region_label_delete() used for deleting
> region label from LSA. It will be used later from CXL subsystem
> 
> Signed-off-by: Neeraj Kumar 

Just one small thing below, otherwise
Reviewed-by: Dave Jiang 

> ---
>  drivers/nvdimm/label.c  | 76 ++---
>  drivers/nvdimm/label.h  |  1 +
>  drivers/nvdimm/namespace_devs.c | 12 ++
>  drivers/nvdimm/nd.h |  6 +++
>  include/linux/libnvdimm.h   |  1 +
>  5 files changed, 90 insertions(+), 6 deletions(-)
> 
> diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c
> index e90e48672da3..da55ecd95e2f 100644
> --- a/drivers/nvdimm/label.c
> +++ b/drivers/nvdimm/label.c
> @@ -1225,7 +1225,8 @@ static int init_labels(struct nd_mapping *nd_mapping, 
> int num_labels,
>   return max(num_labels, old_num_labels);
>  }
>  
> -static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid)
> +static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid,
> +   enum label_type ltype)
>  {
>   struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
>   struct nd_label_ent *label_ent, *e;
> @@ -1244,11 +1245,25 @@ static int del_labels(struct nd_mapping *nd_mapping, 
> uuid_t *uuid)
>  
>   mutex_lock(&nd_mapping->lock);
>   list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
> - if (label_ent->label)
> + if ((ltype == NS_LABEL_TYPE && !label_ent->label) ||
> + (ltype == RG_LABEL_TYPE && !label_ent->region_label))
>   continue;
>   active++;
> - if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
> - continue;
> +
> + switch (ltype) {
> + case NS_LABEL_TYPE:
> + if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
> + continue;
> +
> + break;
> + case RG_LABEL_TYPE:
> + if (!region_label_uuid_equal(label_ent->region_label,
> + uuid))
> + continue;
> +
> + break;
> + }
> +
>   active--;
>   slot = to_slot(ndd, label_ent);
>   nd_label_free_slot(ndd, slot);
> @@ -1257,10 +1272,12 @@ static int del_labels(struct nd_mapping *nd_mapping, 
> uuid_t *uuid)
>  
>   if (uuid_equal(&cxl_namespace_uuid, &label_ent->label_uuid))
>   label_ent->label = NULL;
> + else
> + label_ent->region_label = NULL;
>   }
>   list_splice_tail_init(&list, &nd_mapping->labels);
>  
> - if (active == 0) {
> + if ((ltype == NS_LABEL_TYPE) && (active == 0)) {
>   nd_mapping_free_labels(nd_mapping);
>   dev_dbg(ndd->dev, "no more active labels\n");
>   }
> @@ -1296,7 +1313,8 @@ int nd_pmem_namespace_label_update(struct nd_region 
> *nd_region,
>   int count = 0;
>  
>   if (size == 0) {
> - rc = del_labels(nd_mapping, nspm->uuid);
> + rc = del_labels(nd_mapping, nspm->uuid,
> + NS_LABEL_TYPE);
>   if (rc)
>   return rc;
>   continue;
> @@ -1381,6 +1399,52 @@ int nd_pmem_region_label_update(struct nd_region 
> *nd_region)
>   return 0;
>  }
>  
> +int nd_pmem_region_label_delete(struct nd_region *nd_region)
> +{
> + struct nd_interleave_set *nd_set = nd_region->nd_set;
> + struct nd_label_ent *label_ent;
> + int i, rc;
> +
> + for (i = 0; i < nd_region->ndr_mappings; i++) {
> + struct nd_mapping *nd_mapping = &nd_region->mapping[i];
> + struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
> +
> + /* Find non cxl format supported ndr_mappings */
> + if (!ndd->cxl) {
> + dev_info(&nd_region->dev, "Unsupported region label\n");
> + return -EINVAL;
> + }
> +
> + /* Find if any NS label using this region */
> + guard(mutex)(&nd_mapping->lock);
> + list_for_each_entry(label_ent, &nd_mapping->labels, list) {
> + if (!label_ent->label)
> + continue;
> +
> + /*
> +  * Check if any available NS labels has same
> +  * region_uuid in LSA
> +  */
> + if (nsl_region_uuid_equal(label_ent->label,
> + &nd_set->uuid)) {
> + dev_dbg(&nd_region->dev,
> + "Region/Namespace label in use\n");
> + return -EBUSY;
> + }
> + }
> + }
> +
> + for (i = 0; i < nd_region->ndr_mappi

[PATCH V4 07/17] nvdimm/label: Add region label delete support

2025-11-19 Thread Neeraj Kumar
Create export routine nd_region_label_delete() used for deleting
region label from LSA. It will be used later from CXL subsystem

Signed-off-by: Neeraj Kumar 
---
 drivers/nvdimm/label.c  | 76 ++---
 drivers/nvdimm/label.h  |  1 +
 drivers/nvdimm/namespace_devs.c | 12 ++
 drivers/nvdimm/nd.h |  6 +++
 include/linux/libnvdimm.h   |  1 +
 5 files changed, 90 insertions(+), 6 deletions(-)

diff --git a/drivers/nvdimm/label.c b/drivers/nvdimm/label.c
index e90e48672da3..da55ecd95e2f 100644
--- a/drivers/nvdimm/label.c
+++ b/drivers/nvdimm/label.c
@@ -1225,7 +1225,8 @@ static int init_labels(struct nd_mapping *nd_mapping, int 
num_labels,
return max(num_labels, old_num_labels);
 }
 
-static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid)
+static int del_labels(struct nd_mapping *nd_mapping, uuid_t *uuid,
+ enum label_type ltype)
 {
struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
struct nd_label_ent *label_ent, *e;
@@ -1244,11 +1245,25 @@ static int del_labels(struct nd_mapping *nd_mapping, 
uuid_t *uuid)
 
mutex_lock(&nd_mapping->lock);
list_for_each_entry_safe(label_ent, e, &nd_mapping->labels, list) {
-   if (label_ent->label)
+   if ((ltype == NS_LABEL_TYPE && !label_ent->label) ||
+   (ltype == RG_LABEL_TYPE && !label_ent->region_label))
continue;
active++;
-   if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
-   continue;
+
+   switch (ltype) {
+   case NS_LABEL_TYPE:
+   if (!nsl_uuid_equal(ndd, label_ent->label, uuid))
+   continue;
+
+   break;
+   case RG_LABEL_TYPE:
+   if (!region_label_uuid_equal(label_ent->region_label,
+   uuid))
+   continue;
+
+   break;
+   }
+
active--;
slot = to_slot(ndd, label_ent);
nd_label_free_slot(ndd, slot);
@@ -1257,10 +1272,12 @@ static int del_labels(struct nd_mapping *nd_mapping, 
uuid_t *uuid)
 
if (uuid_equal(&cxl_namespace_uuid, &label_ent->label_uuid))
label_ent->label = NULL;
+   else
+   label_ent->region_label = NULL;
}
list_splice_tail_init(&list, &nd_mapping->labels);
 
-   if (active == 0) {
+   if ((ltype == NS_LABEL_TYPE) && (active == 0)) {
nd_mapping_free_labels(nd_mapping);
dev_dbg(ndd->dev, "no more active labels\n");
}
@@ -1296,7 +1313,8 @@ int nd_pmem_namespace_label_update(struct nd_region 
*nd_region,
int count = 0;
 
if (size == 0) {
-   rc = del_labels(nd_mapping, nspm->uuid);
+   rc = del_labels(nd_mapping, nspm->uuid,
+   NS_LABEL_TYPE);
if (rc)
return rc;
continue;
@@ -1381,6 +1399,52 @@ int nd_pmem_region_label_update(struct nd_region 
*nd_region)
return 0;
 }
 
+int nd_pmem_region_label_delete(struct nd_region *nd_region)
+{
+   struct nd_interleave_set *nd_set = nd_region->nd_set;
+   struct nd_label_ent *label_ent;
+   int i, rc;
+
+   for (i = 0; i < nd_region->ndr_mappings; i++) {
+   struct nd_mapping *nd_mapping = &nd_region->mapping[i];
+   struct nvdimm_drvdata *ndd = to_ndd(nd_mapping);
+
+   /* Find non cxl format supported ndr_mappings */
+   if (!ndd->cxl) {
+   dev_info(&nd_region->dev, "Unsupported region label\n");
+   return -EINVAL;
+   }
+
+   /* Find if any NS label using this region */
+   guard(mutex)(&nd_mapping->lock);
+   list_for_each_entry(label_ent, &nd_mapping->labels, list) {
+   if (!label_ent->label)
+   continue;
+
+   /*
+* Check if any available NS labels has same
+* region_uuid in LSA
+*/
+   if (nsl_region_uuid_equal(label_ent->label,
+   &nd_set->uuid)) {
+   dev_dbg(&nd_region->dev,
+   "Region/Namespace label in use\n");
+   return -EBUSY;
+   }
+   }
+   }
+
+   for (i = 0; i < nd_region->ndr_mappings; i++) {
+   struct nd_mapping *nd_mapping = &nd_region->mapping[i];
+
+   rc = del_labels(nd_mapping, &nd_set->uuid, RG_LABEL_TYPE);
+   if (rc)
+