On Mon, Jan 28, 2019 at 08:30:14AM +0800, Wei Yang wrote: >In init_active_labels(), it iterates on ndr_mappings to create its >corresponding labels. When there is an error, it is supposed to release >those labels created. But current implementation doesn't handle this >well in two aspects: > > * when error happens during ndd check, labels are not released > * just labels on current nd_mapping released, previous ones are lost > >This patch extracts labels releasing code to error branch and release >labels on all nd_mapping besides only current one. By goto error branch >on error, it release all labels allocated.
Is my understanding correct? > >Signed-off-by: Wei Yang <[email protected]> >--- > drivers/nvdimm/namespace_devs.c | 19 ++++++++++++------- > 1 file changed, 12 insertions(+), 7 deletions(-) > >diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c >index 9471b9ca04f5..234c0c79726a 100644 >--- a/drivers/nvdimm/namespace_devs.c >+++ b/drivers/nvdimm/namespace_devs.c >@@ -2451,7 +2451,7 @@ static struct device **create_namespaces(struct >nd_region *nd_region) > > static int init_active_labels(struct nd_region *nd_region) > { >- int i; >+ int i, errno = -ENOMEM; > > for (i = 0; i < nd_region->ndr_mappings; i++) { > struct nd_mapping *nd_mapping = &nd_region->mapping[i]; >@@ -2476,7 +2476,8 @@ static int init_active_labels(struct nd_region >*nd_region) > dev_name(&nd_mapping->nvdimm->dev), > test_bit(NDD_LOCKED, &nvdimm->flags) > ? "locked" : "disabled"); >- return -ENXIO; >+ errno = -ENXIO; >+ goto error; > } > nd_mapping->ndd = ndd; > atomic_inc(&nvdimm->busy); >@@ -2500,16 +2501,20 @@ static int init_active_labels(struct nd_region >*nd_region) > mutex_unlock(&nd_mapping->lock); > } > >- if (j >= count) >- continue; >+ if (j < count) >+ goto error; >+ } >+ >+ return 0; > >+error: >+ for (; i >= 0; i--) { >+ struct nd_mapping *nd_mapping = &nd_region->mapping[i]; > mutex_lock(&nd_mapping->lock); > nd_mapping_free_labels(nd_mapping); > mutex_unlock(&nd_mapping->lock); >- return -ENOMEM; > } >- >- return 0; >+ return errno; > } > > int nd_region_register_namespaces(struct nd_region *nd_region, int *err) >-- >2.19.1 -- Wei Yang Help you, Help me _______________________________________________ Linux-nvdimm mailing list [email protected] https://lists.01.org/mailman/listinfo/linux-nvdimm
