On Wed, 19 Nov 2025 13:22:45 +0530 Neeraj Kumar <[email protected]> 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 <[email protected]> A few minor things inline. Reviewed-by: Jonathan Cameron <[email protected]> > --- > 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);

