From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-16.6 required=3.0 tests=BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id A08D6C825A0 for ; Tue, 24 Nov 2020 13:29:43 +0000 (UTC) Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.kernel.org (Postfix) with ESMTP id 1F9082083E for ; Tue, 24 Nov 2020 13:29:43 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="NA6mVSQj" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 1F9082083E Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=lst.de Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=owner-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix) id 296926B00EC; Tue, 24 Nov 2020 08:28:57 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 224026B00ED; Tue, 24 Nov 2020 08:28:57 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 071686B00EE; Tue, 24 Nov 2020 08:28:57 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0250.hostedemail.com [216.40.44.250]) by kanga.kvack.org (Postfix) with ESMTP id DFB776B00EC for ; Tue, 24 Nov 2020 08:28:56 -0500 (EST) Received: from smtpin26.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay03.hostedemail.com (Postfix) with ESMTP id A409C8249980 for ; Tue, 24 Nov 2020 13:28:56 +0000 (UTC) X-FDA: 77519392272.26.boy34_48012732736e Received: from filter.hostedemail.com (10.5.16.251.rfc1918.com [10.5.16.251]) by smtpin26.hostedemail.com (Postfix) with ESMTP id 85F811804B669 for ; Tue, 24 Nov 2020 13:28:56 +0000 (UTC) X-HE-Tag: boy34_48012732736e X-Filterd-Recvd-Size: 9968 Received: from casper.infradead.org (casper.infradead.org [90.155.50.34]) by imf27.hostedemail.com (Postfix) with ESMTP for ; Tue, 24 Nov 2020 13:28:55 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:MIME-Version: References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender:Reply-To: Content-Type:Content-ID:Content-Description; bh=dD7vTx4/xk9jtZI+HJvoO9Sft1DpGXtKTJgwao3L0Ug=; b=NA6mVSQjl/XbMhhE63L+5FK3EO XqJlkW1j6OinCBKUFr1IoSYH4717NtYwnS1tRjL9im3rXM5fUusOVhXh09uOgXBbRD3zOjP20pslw cnDzz+hN6iDvKTMbpUmY91qDbb5BIjDIRnwwoXlTQS3S+QFSWtf5Iq8BoLeRNK7SadrkegH3Gp721 PHhF3hLrhKekdA9iGxEp+/LczQ46y1dEyxriI4j2p6TmOPRhHaUEb8WMRApq1jyePEekIGQ2Rg8oC sp0tD0+qmxTJX6EPlq+O5JKk6RY2pAHeOwWdWdli2LbyYaxur4IkswdoS5RPrXkorvoiIrVm12TrC sLEj4t1w==; Received: from [2001:4bb8:180:5443:c70:4a89:bc61:3] (helo=localhost) by casper.infradead.org with esmtpsa (Exim 4.92.3 #3 (Red Hat Linux)) id 1khYN5-0006d2-N4; Tue, 24 Nov 2020 13:28:40 +0000 From: Christoph Hellwig To: Jens Axboe Cc: Tejun Heo , Josef Bacik , Konrad Rzeszutek Wilk , Coly Li , Mike Snitzer , Greg Kroah-Hartman , Jan Kara , Johannes Thumshirn , dm-devel@redhat.com, Richard Weinberger , Jan Kara , linux-block@vger.kernel.org, xen-devel@lists.xenproject.org, linux-bcache@vger.kernel.org, linux-mtd@lists.infradead.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org Subject: [PATCH 27/45] block: simplify the block device claiming interface Date: Tue, 24 Nov 2020 14:27:33 +0100 Message-Id: <20201124132751.3747337-28-hch@lst.de> X-Mailer: git-send-email 2.29.2 In-Reply-To: <20201124132751.3747337-1-hch@lst.de> References: <20201124132751.3747337-1-hch@lst.de> MIME-Version: 1.0 X-SRS-Rewrite: SMTP reverse-path rewritten from by casper.infradead.org. See http://www.infradead.org/rpr.html Content-Transfer-Encoding: quoted-printable X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: Stop passing the whole device as a separate argument given that it can be trivially deducted and cleanup the !holder debug check. Signed-off-by: Christoph Hellwig Reviewed-by: Greg Kroah-Hartman Reviewed-by: Jan Kara --- drivers/block/loop.c | 12 +++++----- fs/block_dev.c | 51 +++++++++++++++--------------------------- include/linux/blkdev.h | 6 ++--- 3 files changed, 25 insertions(+), 44 deletions(-) diff --git a/drivers/block/loop.c b/drivers/block/loop.c index c0df88b3300c41..d643c67be6acea 100644 --- a/drivers/block/loop.c +++ b/drivers/block/loop.c @@ -1069,7 +1069,6 @@ static int loop_configure(struct loop_device *lo, f= mode_t mode, struct file *file; struct inode *inode; struct address_space *mapping; - struct block_device *claimed_bdev =3D NULL; int error; loff_t size; bool partscan; @@ -1088,8 +1087,7 @@ static int loop_configure(struct loop_device *lo, f= mode_t mode, * here to avoid changing device under exclusive owner. */ if (!(mode & FMODE_EXCL)) { - claimed_bdev =3D bdev_whole(bdev); - error =3D bd_prepare_to_claim(bdev, claimed_bdev, loop_configure); + error =3D bd_prepare_to_claim(bdev, loop_configure); if (error) goto out_putf; } @@ -1176,15 +1174,15 @@ static int loop_configure(struct loop_device *lo,= fmode_t mode, mutex_unlock(&loop_ctl_mutex); if (partscan) loop_reread_partitions(lo, bdev); - if (claimed_bdev) - bd_abort_claiming(bdev, claimed_bdev, loop_configure); + if (!(mode & FMODE_EXCL)) + bd_abort_claiming(bdev, loop_configure); return 0; =20 out_unlock: mutex_unlock(&loop_ctl_mutex); out_bdev: - if (claimed_bdev) - bd_abort_claiming(bdev, claimed_bdev, loop_configure); + if (!(mode & FMODE_EXCL)) + bd_abort_claiming(bdev, loop_configure); out_putf: fput(file); out: diff --git a/fs/block_dev.c b/fs/block_dev.c index e8d7de5fae00a9..43a0fda982c879 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -110,24 +110,20 @@ EXPORT_SYMBOL(invalidate_bdev); int truncate_bdev_range(struct block_device *bdev, fmode_t mode, loff_t lstart, loff_t lend) { - struct block_device *claimed_bdev =3D NULL; - int err; - /* * If we don't hold exclusive handle for the device, upgrade to it * while we discard the buffer cache to avoid discarding buffers * under live filesystem. */ if (!(mode & FMODE_EXCL)) { - claimed_bdev =3D bdev_whole(bdev); - err =3D bd_prepare_to_claim(bdev, claimed_bdev, - truncate_bdev_range); + int err =3D bd_prepare_to_claim(bdev, truncate_bdev_range); if (err) return err; } + truncate_inode_pages_range(bdev->bd_inode->i_mapping, lstart, lend); - if (claimed_bdev) - bd_abort_claiming(bdev, claimed_bdev, truncate_bdev_range); + if (!(mode & FMODE_EXCL)) + bd_abort_claiming(bdev, truncate_bdev_range); return 0; } EXPORT_SYMBOL(truncate_bdev_range); @@ -973,7 +969,6 @@ static bool bd_may_claim(struct block_device *bdev, s= truct block_device *whole, /** * bd_prepare_to_claim - claim a block device * @bdev: block device of interest - * @whole: the whole device containing @bdev, may equal @bdev * @holder: holder trying to claim @bdev * * Claim @bdev. This function fails if @bdev is already claimed by anot= her @@ -983,9 +978,12 @@ static bool bd_may_claim(struct block_device *bdev, = struct block_device *whole, * RETURNS: * 0 if @bdev can be claimed, -EBUSY otherwise. */ -int bd_prepare_to_claim(struct block_device *bdev, struct block_device *= whole, - void *holder) +int bd_prepare_to_claim(struct block_device *bdev, void *holder) { + struct block_device *whole =3D bdev_whole(bdev); + + if (WARN_ON_ONCE(!holder)) + return -EINVAL; retry: spin_lock(&bdev_lock); /* if someone else claimed, fail */ @@ -1025,15 +1023,15 @@ static void bd_clear_claiming(struct block_device= *whole, void *holder) /** * bd_finish_claiming - finish claiming of a block device * @bdev: block device of interest - * @whole: whole block device * @holder: holder that has claimed @bdev * * Finish exclusive open of a block device. Mark the device as exlusivel= y * open by the holder and wake up all waiters for exclusive open to fini= sh. */ -static void bd_finish_claiming(struct block_device *bdev, - struct block_device *whole, void *holder) +static void bd_finish_claiming(struct block_device *bdev, void *holder) { + struct block_device *whole =3D bdev_whole(bdev); + spin_lock(&bdev_lock); BUG_ON(!bd_may_claim(bdev, whole, holder)); /* @@ -1058,11 +1056,10 @@ static void bd_finish_claiming(struct block_devic= e *bdev, * also used when exclusive open is not actually desired and we just nee= ded * to block other exclusive openers for a while. */ -void bd_abort_claiming(struct block_device *bdev, struct block_device *w= hole, - void *holder) +void bd_abort_claiming(struct block_device *bdev, void *holder) { spin_lock(&bdev_lock); - bd_clear_claiming(whole, holder); + bd_clear_claiming(bdev_whole(bdev), holder); spin_unlock(&bdev_lock); } EXPORT_SYMBOL(bd_abort_claiming); @@ -1473,7 +1470,6 @@ static struct block_device *get_bdev_disk_and_modul= e(dev_t dev) */ struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *ho= lder) { - struct block_device *claiming; bool unblock_events =3D true; struct block_device *bdev; struct gendisk *disk; @@ -1496,15 +1492,9 @@ struct block_device *blkdev_get_by_dev(dev_t dev, = fmode_t mode, void *holder) disk =3D bdev->bd_disk; =20 if (mode & FMODE_EXCL) { - WARN_ON_ONCE(!holder); -=09 - ret =3D -ENOMEM; - claiming =3D bdget_disk(disk, 0); - if (!claiming) - goto put_disk; - ret =3D bd_prepare_to_claim(bdev, claiming, holder); + ret =3D bd_prepare_to_claim(bdev, holder); if (ret) - goto put_claiming; + goto put_disk; } =20 disk_block_events(disk); @@ -1514,7 +1504,7 @@ struct block_device *blkdev_get_by_dev(dev_t dev, f= mode_t mode, void *holder) if (ret) goto abort_claiming; if (mode & FMODE_EXCL) { - bd_finish_claiming(bdev, claiming, holder); + bd_finish_claiming(bdev, holder); =20 /* * Block event polling for write claims if requested. Any write @@ -1533,18 +1523,13 @@ struct block_device *blkdev_get_by_dev(dev_t dev,= fmode_t mode, void *holder) =20 if (unblock_events) disk_unblock_events(disk); - if (mode & FMODE_EXCL) - bdput(claiming); return bdev; =20 abort_claiming: if (mode & FMODE_EXCL) - bd_abort_claiming(bdev, claiming, holder); + bd_abort_claiming(bdev, holder); mutex_unlock(&bdev->bd_mutex); disk_unblock_events(disk); -put_claiming: - if (mode & FMODE_EXCL) - bdput(claiming); put_disk: module_put(disk->fops->owner); put_disk(disk); diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 48e5a8393cd793..db1b11d6d07568 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1988,10 +1988,8 @@ void blkdev_show(struct seq_file *seqf, off_t offs= et); struct block_device *blkdev_get_by_path(const char *path, fmode_t mode, void *holder); struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *ho= lder); -int bd_prepare_to_claim(struct block_device *bdev, struct block_device *= whole, - void *holder); -void bd_abort_claiming(struct block_device *bdev, struct block_device *w= hole, - void *holder); +int bd_prepare_to_claim(struct block_device *bdev, void *holder); +void bd_abort_claiming(struct block_device *bdev, void *holder); void blkdev_put(struct block_device *bdev, fmode_t mode); =20 struct block_device *bdev_alloc(struct gendisk *disk, u8 partno); --=20 2.29.2