On 22/09/25 02:37PM, Dave Jiang wrote: > >> +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 ns_region_cnt = 0; >> + 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)) >> + ns_region_cnt++; > >Why not just return -EBUSY here immediately? It seems the code returns -EBUSY as long as there's 1 or more below. > >> + } >> + } >> + >> + if (ns_region_cnt) { >> + 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) >> + return rc; >> + } > >Can this be folded into the for loop above or does it a full pass to check before starting the label deletion process? > >DJ Yes, if we use "return -EBUSY" in first loop itself then we can call del_labels() I will fix this in next patch-set Regards, Neeraj