Message ID | 162766356450.3223041.1183118139023841447.stgit@dwillia2-desk3.amr.corp.intel.com (mailing list archive) |
---|---|
State | Accepted |
Commit | d9cee9f85b22fab88d2b76d2e92b18e3d0e6aa8c |
Headers | show |
Series | libnvdimm/region: Fix label activation vs errors | expand |
Dan Williams <dan.j.williams@intel.com> writes: > There are a few scenarios where init_active_labels() can return without > registering deactivate_labels() to run when the region is disabled. In > particular label error injection creates scenarios where a DIMM is > disabled, but labels on other DIMMs in the region become activated. > > Arrange for init_active_labels() to always register deactivate_labels(). > > Reported-by: Krzysztof Kensicki <krzysztof.kensicki@intel.com> > Fixes: bf9bccc14c05 ("libnvdimm: pmem label sets and namespace instantiation.") > Signed-off-by: Dan Williams <dan.j.williams@intel.com> Reviewed-by: Jeff Moyer <jmoyer@redhat.com> > --- > drivers/nvdimm/namespace_devs.c | 17 +++++++++++------ > 1 file changed, 11 insertions(+), 6 deletions(-) > > diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c > index 2403b71b601e..745478213ff2 100644 > --- a/drivers/nvdimm/namespace_devs.c > +++ b/drivers/nvdimm/namespace_devs.c > @@ -2527,7 +2527,7 @@ static void deactivate_labels(void *region) > > static int init_active_labels(struct nd_region *nd_region) > { > - int i; > + int i, rc = 0; > > for (i = 0; i < nd_region->ndr_mappings; i++) { > struct nd_mapping *nd_mapping = &nd_region->mapping[i]; > @@ -2546,13 +2546,14 @@ static int init_active_labels(struct nd_region *nd_region) > else if (test_bit(NDD_LABELING, &nvdimm->flags)) > /* fail, labels needed to disambiguate dpa */; > else > - return 0; > + continue; > > dev_err(&nd_region->dev, "%s: is %s, failing probe\n", > dev_name(&nd_mapping->nvdimm->dev), > test_bit(NDD_LOCKED, &nvdimm->flags) > ? "locked" : "disabled"); > - return -ENXIO; > + rc = -ENXIO; > + goto out; > } > nd_mapping->ndd = ndd; > atomic_inc(&nvdimm->busy); > @@ -2586,13 +2587,17 @@ static int init_active_labels(struct nd_region *nd_region) > break; > } > > - if (i < nd_region->ndr_mappings) { > + if (i < nd_region->ndr_mappings) > + rc = -ENOMEM; > + > +out: > + if (rc) { > deactivate_labels(nd_region); > - return -ENOMEM; > + return rc; > } > > return devm_add_action_or_reset(&nd_region->dev, deactivate_labels, > - nd_region); > + nd_region); > } > > int nd_region_register_namespaces(struct nd_region *nd_region, int *err)
diff --git a/drivers/nvdimm/namespace_devs.c b/drivers/nvdimm/namespace_devs.c index 2403b71b601e..745478213ff2 100644 --- a/drivers/nvdimm/namespace_devs.c +++ b/drivers/nvdimm/namespace_devs.c @@ -2527,7 +2527,7 @@ static void deactivate_labels(void *region) static int init_active_labels(struct nd_region *nd_region) { - int i; + int i, rc = 0; for (i = 0; i < nd_region->ndr_mappings; i++) { struct nd_mapping *nd_mapping = &nd_region->mapping[i]; @@ -2546,13 +2546,14 @@ static int init_active_labels(struct nd_region *nd_region) else if (test_bit(NDD_LABELING, &nvdimm->flags)) /* fail, labels needed to disambiguate dpa */; else - return 0; + continue; dev_err(&nd_region->dev, "%s: is %s, failing probe\n", dev_name(&nd_mapping->nvdimm->dev), test_bit(NDD_LOCKED, &nvdimm->flags) ? "locked" : "disabled"); - return -ENXIO; + rc = -ENXIO; + goto out; } nd_mapping->ndd = ndd; atomic_inc(&nvdimm->busy); @@ -2586,13 +2587,17 @@ static int init_active_labels(struct nd_region *nd_region) break; } - if (i < nd_region->ndr_mappings) { + if (i < nd_region->ndr_mappings) + rc = -ENOMEM; + +out: + if (rc) { deactivate_labels(nd_region); - return -ENOMEM; + return rc; } return devm_add_action_or_reset(&nd_region->dev, deactivate_labels, - nd_region); + nd_region); } int nd_region_register_namespaces(struct nd_region *nd_region, int *err)
There are a few scenarios where init_active_labels() can return without registering deactivate_labels() to run when the region is disabled. In particular label error injection creates scenarios where a DIMM is disabled, but labels on other DIMMs in the region become activated. Arrange for init_active_labels() to always register deactivate_labels(). Reported-by: Krzysztof Kensicki <krzysztof.kensicki@intel.com> Fixes: bf9bccc14c05 ("libnvdimm: pmem label sets and namespace instantiation.") Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- drivers/nvdimm/namespace_devs.c | 17 +++++++++++------ 1 file changed, 11 insertions(+), 6 deletions(-)