From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mga18.intel.com (mga18.intel.com [134.134.136.126]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id D1DA4211C573E for ; Thu, 31 Jan 2019 22:42:59 -0800 (PST) Date: Fri, 1 Feb 2019 14:42:28 +0800 From: Wei Yang Subject: Re: [PATCH 1/5] libnvdimm, namespace: release labels properly on error Message-ID: <20190201064228.GA29739@richard> References: <20190128003018.4087-1-richardw.yang@linux.intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <20190128003018.4087-1-richardw.yang@linux.intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: Wei Yang Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" To: Wei Yang Cc: zwisler@kernel.org, linux-nvdimm@lists.01.org List-ID: 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 >--- > 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 Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm