From: Christoph Hellwig <hch@lst.de>
To: Jens Axboe <axboe@kernel.dk>
Cc: Tejun Heo <tj@kernel.org>, Josef Bacik <josef@toxicpanda.com>,
Coly Li <colyli@suse.de>, Mike Snitzer <snitzer@redhat.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Jan Kara <jack@suse.cz>,
Johannes Thumshirn <johannes.thumshirn@wdc.com>,
dm-devel@redhat.com, Jan Kara <jack@suse.com>,
linux-block@vger.kernel.org, linux-bcache@vger.kernel.org,
linux-mtd@lists.infradead.org, linux-fsdevel@vger.kernel.org,
linux-mm@kvack.org
Subject: [PATCH 26/44] block: simplify the block device claiming interface
Date: Thu, 26 Nov 2020 14:04:04 +0100 [thread overview]
Message-ID: <20201126130422.92945-27-hch@lst.de> (raw)
In-Reply-To: <20201126130422.92945-1-hch@lst.de>
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 <hch@lst.de>
Reviewed-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Reviewed-by: Jan Kara <jack@suse.cz>
Acked-by: Tejun Heo <tj@kernel.org>
---
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, fmode_t mode,
struct file *file;
struct inode *inode;
struct address_space *mapping;
- struct block_device *claimed_bdev = NULL;
int error;
loff_t size;
bool partscan;
@@ -1088,8 +1087,7 @@ static int loop_configure(struct loop_device *lo, fmode_t mode,
* here to avoid changing device under exclusive owner.
*/
if (!(mode & FMODE_EXCL)) {
- claimed_bdev = bdev_whole(bdev);
- error = bd_prepare_to_claim(bdev, claimed_bdev, loop_configure);
+ error = 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;
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 73f45ae1d3d50c..f180ac0e87844f 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 = 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 = bdev_whole(bdev);
- err = bd_prepare_to_claim(bdev, claimed_bdev,
- truncate_bdev_range);
+ int err = 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);
@@ -974,7 +970,6 @@ static bool bd_may_claim(struct block_device *bdev, struct 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 another
@@ -984,9 +979,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 = bdev_whole(bdev);
+
+ if (WARN_ON_ONCE(!holder))
+ return -EINVAL;
retry:
spin_lock(&bdev_lock);
/* if someone else claimed, fail */
@@ -1026,15 +1024,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 exlusively
* open by the holder and wake up all waiters for exclusive open to finish.
*/
-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 = bdev_whole(bdev);
+
spin_lock(&bdev_lock);
BUG_ON(!bd_may_claim(bdev, whole, holder));
/*
@@ -1059,11 +1057,10 @@ static void bd_finish_claiming(struct block_device *bdev,
* also used when exclusive open is not actually desired and we just needed
* to block other exclusive openers for a while.
*/
-void bd_abort_claiming(struct block_device *bdev, struct block_device *whole,
- 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);
@@ -1480,7 +1477,6 @@ void blkdev_put_no_open(struct block_device *bdev)
*/
struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
{
- struct block_device *claiming;
bool unblock_events = true;
struct block_device *bdev;
struct gendisk *disk;
@@ -1503,15 +1499,9 @@ struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
disk = bdev->bd_disk;
if (mode & FMODE_EXCL) {
- WARN_ON_ONCE(!holder);
-
- ret = -ENOMEM;
- claiming = bdget_disk(disk, 0);
- if (!claiming)
- goto put_blkdev;
- ret = bd_prepare_to_claim(bdev, claiming, holder);
+ ret = bd_prepare_to_claim(bdev, holder);
if (ret)
- goto put_claiming;
+ goto put_blkdev;
}
disk_block_events(disk);
@@ -1521,7 +1511,7 @@ struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
if (ret)
goto abort_claiming;
if (mode & FMODE_EXCL) {
- bd_finish_claiming(bdev, claiming, holder);
+ bd_finish_claiming(bdev, holder);
/*
* Block event polling for write claims if requested. Any write
@@ -1540,18 +1530,13 @@ struct block_device *blkdev_get_by_dev(dev_t dev, fmode_t mode, void *holder)
if (unblock_events)
disk_unblock_events(disk);
- if (mode & FMODE_EXCL)
- bdput(claiming);
return bdev;
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_blkdev:
blkdev_put_no_open(bdev);
if (ret == -ERESTARTSYS)
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index 5d48b92f5e4348..43a25d855e049a 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1988,10 +1988,8 @@ void blkdev_show(struct seq_file *seqf, off_t offset);
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 *holder);
-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 *whole,
- 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);
/* just for blk-cgroup, don't use elsewhere */
--
2.29.2
next prev parent reply other threads:[~2020-11-26 13:32 UTC|newest]
Thread overview: 89+ messages / expand[flat|nested] mbox.gz Atom feed top
2020-11-26 13:03 merge struct block_device and struct hd_struct v3 Christoph Hellwig
2020-11-26 13:03 ` [PATCH 01/44] blk-cgroup: fix a hd_struct leak in blkcg_fill_root_iostats Christoph Hellwig
2020-11-26 13:03 ` [PATCH 02/44] filemap: consistently use ->f_mapping over ->i_mapping Christoph Hellwig
2020-11-26 13:03 ` [PATCH 03/44] fs: remove get_super_thawed and get_super_exclusive_thawed Christoph Hellwig
2020-11-26 13:03 ` [PATCH 04/44] fs: simplify freeze_bdev/thaw_bdev Christoph Hellwig
2020-11-26 14:13 ` Jan Kara
2020-11-26 13:03 ` [PATCH 05/44] mtip32xx: remove the call to fsync_bdev on removal Christoph Hellwig
2020-11-26 13:03 ` [PATCH 06/44] zram: do not call set_blocksize Christoph Hellwig
2020-11-26 13:03 ` [PATCH 07/44] loop: " Christoph Hellwig
2020-11-26 13:03 ` [PATCH 08/44] dm: simplify flush_bio initialization in __send_empty_flush Christoph Hellwig
2020-11-26 13:03 ` [PATCH 09/44] dm: remove the block_device reference in struct mapped_device Christoph Hellwig
2020-11-27 10:36 ` Hannes Reinecke
2020-11-26 13:03 ` [PATCH 10/44] block: remove a duplicate __disk_get_part prototype Christoph Hellwig
2020-11-27 10:36 ` Hannes Reinecke
2020-11-26 13:03 ` [PATCH 11/44] block: remove a superflous check in blkpg_do_ioctl Christoph Hellwig
2020-11-27 10:37 ` Hannes Reinecke
2020-11-26 13:03 ` [PATCH 12/44] block: add a bdev_kobj helper Christoph Hellwig
2020-11-26 14:47 ` David Sterba
2020-11-27 12:03 ` Hannes Reinecke
2020-11-26 13:03 ` [PATCH 13/44] block: use disk_part_iter_exit in disk_part_iter_next Christoph Hellwig
2020-11-27 12:04 ` Hannes Reinecke
2020-11-26 13:03 ` [PATCH 14/44] block: use put_device in put_disk Christoph Hellwig
2020-11-26 13:03 ` [PATCH 15/44] block: change the hash used for looking up block devices Christoph Hellwig
2020-11-26 13:03 ` [PATCH 16/44] init: refactor name_to_dev_t Christoph Hellwig
2020-11-26 13:03 ` [PATCH 17/44] init: refactor devt_from_partuuid Christoph Hellwig
2020-11-26 13:03 ` [PATCH 18/44] init: cleanup match_dev_by_uuid and match_dev_by_label Christoph Hellwig
2020-11-26 13:03 ` [PATCH 19/44] block: refactor __blkdev_put Christoph Hellwig
2020-11-26 13:03 ` [PATCH 20/44] block: refactor blkdev_get Christoph Hellwig
2020-11-26 14:55 ` Jan Kara
2020-11-26 13:03 ` [PATCH 21/44] block: move bdput() to the callers of __blkdev_get Christoph Hellwig
2020-11-26 15:05 ` Jan Kara
2020-11-26 13:04 ` [PATCH 22/44] block: opencode devcgroup_inode_permission Christoph Hellwig
2020-11-26 15:07 ` Jan Kara
2020-11-26 13:04 ` [PATCH 23/44] block: remove i_bdev Christoph Hellwig
2020-11-26 15:45 ` Jan Kara
2020-11-26 13:04 ` [PATCH 24/44] block: simplify bdev/disk lookup in blkdev_get Christoph Hellwig
2020-11-26 16:33 ` Jan Kara
2020-11-26 17:42 ` Christoph Hellwig
2020-11-26 13:04 ` [PATCH 25/44] block: remove ->bd_contains Christoph Hellwig
2020-11-26 13:04 ` Christoph Hellwig [this message]
2020-11-26 13:04 ` [PATCH 27/44] block: simplify part_to_disk Christoph Hellwig
2020-11-26 16:36 ` Jan Kara
2020-11-26 13:04 ` [PATCH 28/44] block: initialize struct block_device in bdev_alloc Christoph Hellwig
2020-11-26 16:37 ` Jan Kara
2020-11-26 13:04 ` [PATCH 29/44] block: remove the nr_sects field in struct hd_struct Christoph Hellwig
2020-11-26 16:50 ` Jan Kara
2020-11-26 17:52 ` Christoph Hellwig
2020-11-26 18:04 ` Jan Kara
2020-11-27 9:41 ` Christoph Hellwig
2020-11-26 13:04 ` [PATCH 30/44] block: move disk stat accounting to struct block_device Christoph Hellwig
2020-11-26 16:53 ` Jan Kara
2020-11-26 13:04 ` [PATCH 31/44] block: move the start_sect field " Christoph Hellwig
2020-11-26 16:56 ` Jan Kara
2020-11-26 18:02 ` Christoph Hellwig
2020-11-26 13:04 ` [PATCH 32/44] block: move the partition_meta_info " Christoph Hellwig
2020-11-26 16:58 ` Jan Kara
2020-11-26 13:04 ` [PATCH 33/44] block: move holder_dir " Christoph Hellwig
2020-11-26 17:00 ` Jan Kara
2020-11-26 13:04 ` [PATCH 34/44] block: move make_it_fail " Christoph Hellwig
2020-11-26 17:01 ` Jan Kara
2020-11-26 13:04 ` [PATCH 35/44] block: move the policy field " Christoph Hellwig
2020-11-26 17:03 ` Jan Kara
2020-11-26 13:04 ` [PATCH 36/44] block: allocate struct hd_struct as part of struct bdev_inode Christoph Hellwig
2020-11-26 17:35 ` Jan Kara
2020-11-26 18:00 ` Jan Kara
2020-11-26 18:02 ` Christoph Hellwig
2020-11-26 13:04 ` [PATCH 37/44] block: switch partition lookup to use struct block_device Christoph Hellwig
2020-11-26 17:45 ` Jan Kara
2020-11-26 18:22 ` Jan Kara
2020-11-27 9:48 ` Christoph Hellwig
2020-11-27 12:45 ` Jan Kara
2020-11-27 15:36 ` Christoph Hellwig
2020-11-27 17:26 ` Jan Kara
2020-11-26 13:04 ` [PATCH 38/44] block: remove the partno field from struct hd_struct Christoph Hellwig
2020-11-26 17:46 ` Jan Kara
2020-11-26 13:04 ` [PATCH 39/44] block: pass a block_device to blk_alloc_devt Christoph Hellwig
2020-11-26 17:47 ` Jan Kara
2020-11-26 13:04 ` [PATCH 40/44] block: pass a block_device to invalidate_partition Christoph Hellwig
2020-11-26 17:49 ` Jan Kara
2020-11-26 13:04 ` [PATCH 41/44] block: switch disk_part_iter_* to use a struct block_device Christoph Hellwig
2020-11-27 12:53 ` Jan Kara
2020-11-27 15:24 ` Christoph Hellwig
2020-11-27 17:30 ` Jan Kara
2020-11-26 13:04 ` [PATCH 42/44] f2fs: remove a few bd_part checks Christoph Hellwig
2020-11-26 13:04 ` [PATCH 43/44] block: merge struct block_device and struct hd_struct Christoph Hellwig
2020-11-27 13:19 ` Jan Kara
2020-11-27 15:47 ` Christoph Hellwig
2020-11-26 13:04 ` [PATCH 44/44] block: stop using bdget_disk for partition 0 Christoph Hellwig
2020-11-27 13:22 ` Jan Kara
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20201126130422.92945-27-hch@lst.de \
--to=hch@lst.de \
--cc=axboe@kernel.dk \
--cc=colyli@suse.de \
--cc=dm-devel@redhat.com \
--cc=gregkh@linuxfoundation.org \
--cc=jack@suse.com \
--cc=jack@suse.cz \
--cc=johannes.thumshirn@wdc.com \
--cc=josef@toxicpanda.com \
--cc=linux-bcache@vger.kernel.org \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.kernel.org \
--cc=linux-mm@kvack.org \
--cc=linux-mtd@lists.infradead.org \
--cc=snitzer@redhat.com \
--cc=tj@kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).