From patchwork Wed May 4 12:34:44 2016 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: =?utf-8?q?Matias_Bj=C3=B8rling?= X-Patchwork-Id: 9013611 Return-Path: X-Original-To: patchwork-linux-block@patchwork.kernel.org Delivered-To: patchwork-parsemail@patchwork2.web.kernel.org Received: from mail.kernel.org (mail.kernel.org [198.145.29.136]) by patchwork2.web.kernel.org (Postfix) with ESMTP id 842A6BF29F for ; Wed, 4 May 2016 12:35:21 +0000 (UTC) Received: from mail.kernel.org (localhost [127.0.0.1]) by mail.kernel.org (Postfix) with ESMTP id 9CCA0203A1 for ; Wed, 4 May 2016 12:35:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 7FEE62013A for ; Wed, 4 May 2016 12:35:18 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1753355AbcEDMe5 (ORCPT ); Wed, 4 May 2016 08:34:57 -0400 Received: from mail-wm0-f47.google.com ([74.125.82.47]:37208 "EHLO mail-wm0-f47.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1752728AbcEDMey (ORCPT ); Wed, 4 May 2016 08:34:54 -0400 Received: by mail-wm0-f47.google.com with SMTP id a17so91573195wme.0 for ; Wed, 04 May 2016 05:34:54 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=bjorling.me; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kCvCFLtHBYyV3bV93TWHNMpmmxrYujOrKs3QH+kO2NI=; b=EQFdJ/t8j0Axyzc9Ji9vHRCfmiW0pSyYwvxknE82/GFbGn9iJNQqlCnClAhhOKkg7X OGyCe0RqsCzEJEENVNqrEkppp+u4i56zQ1vFqgdCbag21i++LbH2NheBpl/flo6zQg3g gXMbtdjOKj3qW4Kv0bXm0blHwTK8k7xHYjPy4= X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=kCvCFLtHBYyV3bV93TWHNMpmmxrYujOrKs3QH+kO2NI=; b=ci7/tHNrVNuTAZ0gQ1obnIRoIpN1IrellQLfJfOlMSPuRsQ2L820kD0LH7tXQJUY9W VDB58S0d5+5CmIJTuxLL3Dbrj9rXjFWgC9kdh72GlC0nxtxDvS7NkBMsirus1052pFsP wA5j/zZqdTRSThPwcowg9no8hP69rhxJWiP5xKZU6aPj4DX8QxqyBXTIbP3YVqmSr+q9 b8/164Evh7Jm+rqunr4sHuR9Biodaw4L65LdY6nBo1ITN7Hkn3rIwvfrD1L/1uJb+30Y OSNCj4pTjvm5CLRKpoxz5docEleA+kIgGSzG7XfK3nFwqLovTW7L1bVXzZLCllEVmIHx u81g== X-Gm-Message-State: AOPr4FUFQ8dlW4XCPreAc+HNJNtqSp+r/q/w5y8ievR1B8dlyS4cVtOoygIDE7Lle4eqVg== X-Received: by 10.194.61.134 with SMTP id p6mr8084064wjr.67.1462365293263; Wed, 04 May 2016 05:34:53 -0700 (PDT) Received: from Macroninja.cnexlabs.com (6164211-cl69.boa.fiberby.dk. [193.106.164.211]) by smtp.gmail.com with ESMTPSA id gr4sm3994024wjd.23.2016.05.04.05.34.52 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 04 May 2016 05:34:52 -0700 (PDT) From: =?UTF-8?q?Matias=20Bj=C3=B8rling?= To: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org Cc: =?UTF-8?q?Matias=20Bj=C3=B8rling?= Subject: [PATCH 1/2] lightnvm: remove mgt targets on mgt removal Date: Wed, 4 May 2016 14:34:44 +0200 Message-Id: <1462365285-627-1-git-send-email-m@bjorling.me> X-Mailer: git-send-email 2.1.4 MIME-Version: 1.0 Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org X-Spam-Status: No, score=-8.9 required=5.0 tests=BAYES_00,DKIM_SIGNED, RCVD_IN_DNSWL_HI,RP_MATCHES_RCVD,T_DKIM_INVALID,UNPARSEABLE_RELAY autolearn=unavailable version=3.3.1 X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on mail.kernel.org X-Virus-Scanned: ClamAV using ClamSMTP Targets associated with a device manager are not freed on device removal. They have to be manually removed before shutdown. Make sure any outstanding targets are freed upon shutdown. Signed-off-by: Matias Bjørling --- drivers/lightnvm/core.c | 69 ++++++++++++++++++++++++++++++------------------ include/linux/lightnvm.h | 1 + 2 files changed, 44 insertions(+), 26 deletions(-) diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c index 1873a3b..d3af771 100644 --- a/drivers/lightnvm/core.c +++ b/drivers/lightnvm/core.c @@ -596,13 +596,52 @@ err_fmtype: return ret; } +static void nvm_remove_target(struct nvm_target *t) +{ + struct nvm_tgt_type *tt = t->type; + struct gendisk *tdisk = t->disk; + struct request_queue *q = tdisk->queue; + + lockdep_assert_held(&nvm_lock); + + del_gendisk(tdisk); + blk_cleanup_queue(q); + + if (tt->exit) + tt->exit(tdisk->private_data); + + put_disk(tdisk); + + list_del(&t->list); + kfree(t); +} + +static void nvm_free_mgr(struct nvm_dev *dev) +{ + struct nvm_target *tgt, *tmp; + + if (!dev->mt) + return; + + down_write(&nvm_lock); + list_for_each_entry_safe(tgt, tmp, &nvm_targets, list) { + if (tgt->dev != dev) + continue; + + nvm_remove_target(tgt); + } + up_write(&nvm_lock); + + dev->mt->unregister_mgr(dev); + dev->mt = NULL; +} + static void nvm_free(struct nvm_dev *dev) { if (!dev) return; - if (dev->mt) - dev->mt->unregister_mgr(dev); + nvm_free_mgr(dev); kfree(dev->lptbl); kfree(dev->lun_map); @@ -808,6 +847,7 @@ static int nvm_create_target(struct nvm_dev *dev, t->type = tt; t->disk = tdisk; + t->dev = dev; down_write(&nvm_lock); list_add_tail(&t->list, &nvm_targets); @@ -823,26 +863,6 @@ err_t: return -ENOMEM; } -static void nvm_remove_target(struct nvm_target *t) -{ - struct nvm_tgt_type *tt = t->type; - struct gendisk *tdisk = t->disk; - struct request_queue *q = tdisk->queue; - - lockdep_assert_held(&nvm_lock); - - del_gendisk(tdisk); - blk_cleanup_queue(q); - - if (tt->exit) - tt->exit(tdisk->private_data); - - put_disk(tdisk); - - list_del(&t->list); - kfree(t); -} - static int __nvm_configure_create(struct nvm_ioctl_create *create) { struct nvm_dev *dev; @@ -1231,10 +1251,7 @@ static long nvm_ioctl_dev_factory(struct file *file, void __user *arg) return -EINVAL; } - if (dev->mt) { - dev->mt->unregister_mgr(dev); - dev->mt = NULL; - } + nvm_free_mgr(dev); if (dev->identity.cap & NVM_ID_DCAP_BBLKMGMT) return nvm_dev_factory(dev, fact.flags); diff --git a/include/linux/lightnvm.h b/include/linux/lightnvm.h index 0e8e019..cde31ff 100644 --- a/include/linux/lightnvm.h +++ b/include/linux/lightnvm.h @@ -200,6 +200,7 @@ struct nvm_id { struct nvm_target { struct list_head list; + struct nvm_dev *dev; struct nvm_tgt_type *type; struct gendisk *disk; };