Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1758950AbcDEPOI (ORCPT ); Tue, 5 Apr 2016 11:14:08 -0400 Received: from mx2.suse.de ([195.135.220.15]:55607 "EHLO mx2.suse.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1758293AbcDEPOG (ORCPT ); Tue, 5 Apr 2016 11:14:06 -0400 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Tue, 05 Apr 2016 17:14:04 +0200 From: Johannes Thumshirn To: =?UTF-8?Q?Matias_Bj=C3=B8rling?= Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, linux-block-owner@vger.kernel.org Subject: Re: [PATCH 5/5] lightnvm: avoid memory leak when lun_map kcalloc fails In-Reply-To: <1459868131-15133-6-git-send-email-m@bjorling.me> References: <1459868131-15133-1-git-send-email-m@bjorling.me> <1459868131-15133-6-git-send-email-m@bjorling.me> Message-ID: <76c2b3dbd424963c24b7b8f7ff479fd8@suse.de> User-Agent: Roundcube Webmail Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2860 Lines: 102 On 2016-04-05 16:55, Matias Bjørling wrote: > A memory leak occurs if the lower page table is initialized and the > following dev->lun_map fails on allocation. > > Rearrange the initialization of lower page table to allow dev->lun_map > to fail gracefully without memory leak. > > Reported-by: Dan Carpenter > Signed-off-by: Matias Bjørling > --- > drivers/lightnvm/core.c | 51 > ++++++++++++++++++++++++++++--------------------- > 1 file changed, 29 insertions(+), 22 deletions(-) > > diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c > index 4cadbe0..fd5a9f3 100644 > --- a/drivers/lightnvm/core.c > +++ b/drivers/lightnvm/core.c > @@ -504,6 +504,7 @@ static int nvm_core_init(struct nvm_dev *dev) > { > struct nvm_id *id = &dev->identity; > struct nvm_id_group *grp = &id->groups[0]; > + int ret; > > /* device values */ > dev->nr_chnls = grp->num_ch; > @@ -522,33 +523,16 @@ static int nvm_core_init(struct nvm_dev *dev) > dev->plane_mode = NVM_PLANE_SINGLE; > dev->max_rq_size = dev->ops->max_phys_sect * dev->sec_size; > > - if (grp->mtype != 0) { > - pr_err("nvm: memory type not supported\n"); > - return -EINVAL; > - } > - > - switch (grp->fmtype) { > - case NVM_ID_FMTYPE_SLC: > - if (nvm_init_slc_tbl(dev, grp)) > - return -ENOMEM; > - break; > - case NVM_ID_FMTYPE_MLC: > - if (nvm_init_mlc_tbl(dev, grp)) > - return -ENOMEM; > - break; > - default: > - pr_err("nvm: flash type not supported\n"); > - return -EINVAL; > - } > - > - if (!dev->lps_per_blk) > - pr_info("nvm: lower page programming table missing\n"); > - > if (grp->mpos & 0x020202) > dev->plane_mode = NVM_PLANE_DOUBLE; > if (grp->mpos & 0x040404) > dev->plane_mode = NVM_PLANE_QUAD; > > + if (grp->mtype != 0) { > + pr_err("nvm: memory type not supported\n"); > + return -EINVAL; > + } > + > /* calculated values */ > dev->sec_per_pl = dev->sec_per_pg * dev->nr_planes; > dev->sec_per_blk = dev->sec_per_pl * dev->pgs_per_blk; > @@ -560,11 +544,34 @@ static int nvm_core_init(struct nvm_dev *dev) > sizeof(unsigned long), GFP_KERNEL); > if (!dev->lun_map) > return -ENOMEM; > + > + switch (grp->fmtype) { > + case NVM_ID_FMTYPE_SLC: > + if (nvm_init_slc_tbl(dev, grp)) { > + ret = -ENOMEM; > + goto err_fmtype; > + } > + break; > + case NVM_ID_FMTYPE_MLC: > + if (nvm_init_mlc_tbl(dev, grp)) { > + ret = -ENOMEM; > + goto err_fmtype; > + } > + break; > + default: > + pr_err("nvm: flash type not supported\n"); > + ret = -EINVAL; > + goto err_fmtype; > + } > + > INIT_LIST_HEAD(&dev->online_targets); > mutex_init(&dev->mlock); > spin_lock_init(&dev->lock); > > return 0; > +err_fmtype: > + kfree(dev->lun_map); > + return ret; > } > > static void nvm_free(struct nvm_dev *dev) Reviewed-by: Johannes Thumshirn