Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751681AbdIULN6 (ORCPT ); Thu, 21 Sep 2017 07:13:58 -0400 Received: from mail-wm0-f42.google.com ([74.125.82.42]:48947 "EHLO mail-wm0-f42.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751531AbdIULN4 (ORCPT ); Thu, 21 Sep 2017 07:13:56 -0400 X-Google-Smtp-Source: AOwi7QCRqJgu3m7qbX039y4Kd+y6nvO2wDUdnwZU3cpNdj9hZzvracoWN0sMs6hu79EKNwetzYAwdA== Subject: Re: [PATCH V2] lightnvm: prevent bd removal if busy To: =?UTF-8?Q?Javier_Gonz=c3=a1lez?= , Rakesh Pandit Cc: linux-block@vger.kernel.org, linux-kernel@vger.kernel.org References: <20170910190712.GA7010@hercules.tuxera.com> From: =?UTF-8?Q?Matias_Bj=c3=b8rling?= Message-ID: <041e9eb6-aaf5-14a4-5c8e-98efbc446262@lightnvm.io> Date: Thu, 21 Sep 2017 13:13:53 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.2.1 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 2746 Lines: 74 On 09/12/2017 03:22 PM, Javier González wrote: >> On 10 Sep 2017, at 21.07, Rakesh Pandit wrote: >> >> When a virtual block device is formatted and mounted after creating >> with "nvme lnvm create... -t pblk", a removal from "nvm lnvm remove" >> would result in this: >> >> 446416.309757] bdi-block not registered >> [446416.309773] ------------[ cut here ]------------ >> [446416.309780] WARNING: CPU: 3 PID: 4319 at fs/fs-writeback.c:2159 __mark_inode_dirty+0x268/0x340 >> >> Ideally removal should return -EBUSY as block device is mounted after >> formatting. This patch tries to address this checking if whole device >> or any partition of it already mounted or not before removal. >> >> Whole device is checked using "bd_super" member of block device. This >> member is always set once block device has been mounted using a >> filesystem. Another member "bd_part_count" takes care of checking any >> if any partitions are under use. "bd_part_count" is only updated >> under locks when partitions are opened or closed (first open and last >> release). This at least does take care sending -EBUSY if removal is >> being attempted while whole block device or any partition is mounted. >> >> Signed-off-by: Rakesh Pandit >> --- >> >> V2: Take a different approach. Instead of checking bd_openers use >> bd_super and bd_part_count. This should address the removal of bdevs >> which are mounted from removal. >> >> drivers/lightnvm/core.c | 14 ++++++++++++++ >> 1 file changed, 14 insertions(+) >> >> diff --git a/drivers/lightnvm/core.c b/drivers/lightnvm/core.c >> index c39f87d..9f9a137 100644 >> --- a/drivers/lightnvm/core.c >> +++ b/drivers/lightnvm/core.c >> @@ -373,6 +373,7 @@ static void __nvm_remove_target(struct nvm_target *t) >> static int nvm_remove_tgt(struct nvm_dev *dev, struct nvm_ioctl_remove *remove) >> { >> struct nvm_target *t; >> + struct block_device *bdev; >> >> mutex_lock(&dev->mlock); >> t = nvm_find_target(dev, remove->tgtname); >> @@ -380,6 +381,19 @@ static int nvm_remove_tgt(struct nvm_dev *dev, struct nvm_ioctl_remove *remove) >> mutex_unlock(&dev->mlock); >> return 1; >> } >> + bdev = bdget_disk(t->disk, 0); >> + if (!bdev) { >> + pr_err("nvm: removal failed, allocating bd failed\n"); >> + mutex_unlock(&dev->mlock); >> + return -ENOMEM; >> + } >> + if (bdev->bd_super || bdev->bd_part_count) { >> + pr_err("nvm: removal failed, block device busy\n"); >> + bdput(bdev); >> + mutex_unlock(&dev->mlock); >> + return -EBUSY; >> + } >> + bdput(bdev); >> __nvm_remove_target(t); >> mutex_unlock(&dev->mlock); >> >> -- >> 2.7.4 > > Looks good. > > Reviewed-by: Javier González > Thanks Rakesh. I pulled it in for 4.15.