From: Jan Kara <jack@suse.cz>
To: Christian Brauner <brauner@kernel.org>
Cc: <linux-fsdevel@vger.kernel.org>, <linux-block@vger.kernel.org>,
Christoph Hellwig <hch@infradead.org>, Jan Kara <jack@suse.cz>,
Christoph Hellwig <hch@lst.de>
Subject: [PATCH 01/29] block: Provide bdev_open_* functions
Date: Wed, 27 Sep 2023 11:34:07 +0200 [thread overview]
Message-ID: <20230927093442.25915-1-jack@suse.cz> (raw)
In-Reply-To: <20230818123232.2269-1-jack@suse.cz>
Create struct bdev_handle that contains all parameters that need to be
passed to blkdev_put() and provide bdev_open_* functions that return
this structure instead of plain bdev pointer. This will eventually allow
us to pass one more argument to blkdev_put() (renamed to bdev_release())
without too much hassle.
Acked-by: Christoph Hellwig <hch@lst.de>
Reviewed-by: Christian Brauner <brauner@kernel.org>
Signed-off-by: Jan Kara <jack@suse.cz>
---
block/bdev.c | 48 ++++++++++++++++++++++++++++++++++++++++++
include/linux/blkdev.h | 10 +++++++++
2 files changed, 58 insertions(+)
diff --git a/block/bdev.c b/block/bdev.c
index f3b13aa1b7d4..bdc7d739882b 100644
--- a/block/bdev.c
+++ b/block/bdev.c
@@ -829,6 +829,25 @@ struct block_device *blkdev_get_by_dev(dev_t dev, blk_mode_t mode, void *holder,
}
EXPORT_SYMBOL(blkdev_get_by_dev);
+struct bdev_handle *bdev_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
+ const struct blk_holder_ops *hops)
+{
+ struct bdev_handle *handle = kmalloc(sizeof(*handle), GFP_KERNEL);
+ struct block_device *bdev;
+
+ if (!handle)
+ return ERR_PTR(-ENOMEM);
+ bdev = blkdev_get_by_dev(dev, mode, holder, hops);
+ if (IS_ERR(bdev)) {
+ kfree(handle);
+ return ERR_CAST(bdev);
+ }
+ handle->bdev = bdev;
+ handle->holder = holder;
+ return handle;
+}
+EXPORT_SYMBOL(bdev_open_by_dev);
+
/**
* blkdev_get_by_path - open a block device by name
* @path: path to the block device to open
@@ -867,6 +886,28 @@ struct block_device *blkdev_get_by_path(const char *path, blk_mode_t mode,
}
EXPORT_SYMBOL(blkdev_get_by_path);
+struct bdev_handle *bdev_open_by_path(const char *path, blk_mode_t mode,
+ void *holder, const struct blk_holder_ops *hops)
+{
+ struct bdev_handle *handle;
+ dev_t dev;
+ int error;
+
+ error = lookup_bdev(path, &dev);
+ if (error)
+ return ERR_PTR(error);
+
+ handle = bdev_open_by_dev(dev, mode, holder, hops);
+ if (!IS_ERR(handle) && (mode & BLK_OPEN_WRITE) &&
+ bdev_read_only(handle->bdev)) {
+ bdev_release(handle);
+ return ERR_PTR(-EACCES);
+ }
+
+ return handle;
+}
+EXPORT_SYMBOL(bdev_open_by_path);
+
void blkdev_put(struct block_device *bdev, void *holder)
{
struct gendisk *disk = bdev->bd_disk;
@@ -903,6 +944,13 @@ void blkdev_put(struct block_device *bdev, void *holder)
}
EXPORT_SYMBOL(blkdev_put);
+void bdev_release(struct bdev_handle *handle)
+{
+ blkdev_put(handle->bdev, handle->holder);
+ kfree(handle);
+}
+EXPORT_SYMBOL(bdev_release);
+
/**
* lookup_bdev() - Look up a struct block_device by name.
* @pathname: Name of the block device in the filesystem.
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
index eef450f25982..03d3adc3ff34 100644
--- a/include/linux/blkdev.h
+++ b/include/linux/blkdev.h
@@ -1479,14 +1479,24 @@ extern const struct blk_holder_ops fs_holder_ops;
#define sb_open_mode(flags) \
(BLK_OPEN_READ | (((flags) & SB_RDONLY) ? 0 : BLK_OPEN_WRITE))
+struct bdev_handle {
+ struct block_device *bdev;
+ void *holder;
+};
+
struct block_device *blkdev_get_by_dev(dev_t dev, blk_mode_t mode, void *holder,
const struct blk_holder_ops *hops);
struct block_device *blkdev_get_by_path(const char *path, blk_mode_t mode,
void *holder, const struct blk_holder_ops *hops);
+struct bdev_handle *bdev_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
+ const struct blk_holder_ops *hops);
+struct bdev_handle *bdev_open_by_path(const char *path, blk_mode_t mode,
+ void *holder, const struct blk_holder_ops *hops);
int bd_prepare_to_claim(struct block_device *bdev, void *holder,
const struct blk_holder_ops *hops);
void bd_abort_claiming(struct block_device *bdev, void *holder);
void blkdev_put(struct block_device *bdev, void *holder);
+void bdev_release(struct bdev_handle *handle);
/* just for blk-cgroup, don't use elsewhere */
struct block_device *blkdev_get_no_open(dev_t dev);
--
2.35.3
next prev parent reply other threads:[~2023-09-27 9:34 UTC|newest]
Thread overview: 111+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-08-23 10:48 [PATCH v3 0/29] block: Make blkdev_get_by_*() return handle Jan Kara
2023-08-23 10:48 ` [PATCH 01/29] block: Provide bdev_open_* functions Jan Kara
2023-08-25 11:44 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 02/29] block: Use bdev_open_by_dev() in blkdev_open() Jan Kara
2023-08-25 2:28 ` Al Viro
2023-08-25 9:45 ` Jan Kara
2023-08-25 13:29 ` Christian Brauner
2023-08-28 16:46 ` Jan Kara
2023-08-29 11:03 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 03/29] block: Use bdev_open_by_dev() in disk_scan_partitions() and blkdev_bszset() Jan Kara
2023-08-25 11:45 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 04/29] drdb: Convert to use bdev_open_by_path() Jan Kara
2023-08-25 11:47 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 05/29] pktcdvd: Convert to bdev_open_by_dev() Jan Kara
2023-08-25 11:53 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 06/29] rnbd-srv: Convert to use bdev_open_by_path() Jan Kara
2023-08-25 11:55 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 07/29] xen/blkback: Convert to bdev_open_by_dev() Jan Kara
2023-08-25 11:56 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 08/29] zram: Convert to use bdev_open_by_dev() Jan Kara
2023-08-25 11:57 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 09/29] bcache: Convert to bdev_open_by_path() Jan Kara
2023-08-25 12:06 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 10/29] dm: Convert to bdev_open_by_dev() Jan Kara
2023-08-25 12:08 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 11/29] md: " Jan Kara
2023-08-25 12:09 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 12/29] mtd: block2mtd: Convert to bdev_open_by_dev/path() Jan Kara
2023-08-25 12:11 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 13/29] nvmet: Convert to bdev_open_by_path() Jan Kara
2023-08-23 19:36 ` Chaitanya Kulkarni
2023-08-25 12:12 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 14/29] s390/dasd: " Jan Kara
2023-08-25 12:14 ` Christian Brauner
2023-09-27 21:43 ` Stefan Haberland
2023-10-02 11:24 ` Jan Kara
2023-08-23 10:48 ` [PATCH 15/29] scsi: target: " Jan Kara
2023-08-25 12:15 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 16/29] PM: hibernate: Convert to bdev_open_by_dev() Jan Kara
2023-08-25 12:17 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 17/29] PM: hibernate: Drop unused snapshot_test argument Jan Kara
2023-08-25 12:18 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 18/29] mm/swap: Convert to use bdev_open_by_dev() Jan Kara
2023-08-25 12:19 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 19/29] fs: Convert to bdev_open_by_dev() Jan Kara
2023-08-25 12:20 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 20/29] btrfs: Convert to bdev_open_by_path() Jan Kara
2023-08-25 12:26 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 21/29] erofs: Convert to use bdev_open_by_path() Jan Kara
2023-08-25 12:27 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 22/29] ext4: Convert to bdev_open_by_dev() Jan Kara
2023-08-25 12:29 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 23/29] f2fs: Convert to bdev_open_by_dev/path() Jan Kara
2023-08-25 12:30 ` Christian Brauner
2023-08-28 12:57 ` Chao Yu
2023-08-28 16:35 ` Jan Kara
2023-08-23 10:48 ` [PATCH 24/29] jfs: Convert to bdev_open_by_dev() Jan Kara
2023-08-25 12:31 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 25/29] nfs/blocklayout: Convert to use bdev_open_by_dev/path() Jan Kara
2023-08-25 12:33 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 26/29] ocfs2: Convert to use bdev_open_by_dev() Jan Kara
2023-08-25 12:34 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 27/29] reiserfs: Convert to bdev_open_by_dev/path() Jan Kara
2023-08-25 12:35 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 28/29] xfs: Convert to bdev_open_by_path() Jan Kara
2023-08-23 22:11 ` Dave Chinner
2023-08-24 10:28 ` Jan Kara
2023-08-24 20:29 ` Jan Kara
2023-08-24 23:06 ` Dave Chinner
2023-08-25 12:38 ` Christian Brauner
2023-08-23 10:48 ` [PATCH 29/29] block: Remove blkdev_get_by_*() functions Jan Kara
2023-08-25 12:42 ` Christian Brauner
2023-08-25 13:32 ` [PATCH v3 0/29] block: Make blkdev_get_by_*() return handle Christian Brauner
2023-08-28 17:07 ` Jan Kara
2023-08-29 11:02 ` Christian Brauner
2023-09-27 9:34 ` [PATCH v4 " Jan Kara
2023-09-27 9:34 ` Jan Kara [this message]
2023-09-27 9:34 ` [PATCH 02/29] block: Use bdev_open_by_dev() in blkdev_open() Jan Kara
2023-09-27 9:34 ` [PATCH 03/29] block: Use bdev_open_by_dev() in disk_scan_partitions() and blkdev_bszset() Jan Kara
2023-09-27 9:34 ` [PATCH 04/29] drdb: Convert to use bdev_open_by_path() Jan Kara
2023-09-27 9:34 ` [PATCH 05/29] pktcdvd: Convert to bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 06/29] rnbd-srv: Convert to use bdev_open_by_path() Jan Kara
2023-09-27 9:34 ` [PATCH 07/29] xen/blkback: Convert to bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 08/29] zram: Convert to use bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 09/29] bcache: Convert to bdev_open_by_path() Jan Kara
2023-09-27 9:34 ` [PATCH 10/29] dm: Convert to bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 11/29] md: " Jan Kara
2023-09-27 9:34 ` [PATCH 12/29] mtd: block2mtd: Convert to bdev_open_by_dev/path() Jan Kara
2023-09-27 9:34 ` [PATCH 13/29] nvmet: Convert to bdev_open_by_path() Jan Kara
2023-09-27 9:34 ` [PATCH 14/29] s390/dasd: " Jan Kara
2023-09-27 9:34 ` [PATCH 15/29] scsi: target: " Jan Kara
2023-09-27 15:36 ` Martin K. Petersen
2023-09-27 9:34 ` [PATCH 16/29] PM: hibernate: Convert to bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 17/29] PM: hibernate: Drop unused snapshot_test argument Jan Kara
2023-09-27 9:34 ` [PATCH 18/29] mm/swap: Convert to use bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 19/29] fs: Convert to bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 20/29] btrfs: Convert to bdev_open_by_path() Jan Kara
2023-09-27 9:34 ` [PATCH 21/29] erofs: Convert to use bdev_open_by_path() Jan Kara
2023-09-27 9:34 ` [PATCH 22/29] ext4: Convert to bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 23/29] f2fs: Convert to bdev_open_by_dev/path() Jan Kara
2023-09-27 9:34 ` [PATCH 24/29] jfs: Convert to bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 25/29] nfs/blocklayout: Convert to use bdev_open_by_dev/path() Jan Kara
2023-09-27 9:34 ` [PATCH 26/29] ocfs2: Convert to use bdev_open_by_dev() Jan Kara
2023-09-27 9:34 ` [PATCH 27/29] reiserfs: Convert to bdev_open_by_dev/path() Jan Kara
2023-09-27 9:34 ` [PATCH 28/29] xfs: Convert to bdev_open_by_path() Jan Kara
2023-09-27 15:40 ` Darrick J. Wong
2023-09-27 9:34 ` [PATCH 29/29] block: Remove blkdev_get_by_*() functions Jan Kara
2023-09-27 14:19 ` [PATCH v4 0/29] block: Make blkdev_get_by_*() return handle Jens Axboe
2023-09-27 16:21 ` Christian Brauner
2023-10-02 7:57 ` Jan Kara
-- strict thread matches above, loose matches on Subject: below --
2023-08-11 11:04 [PATCH v2 " Jan Kara
2023-08-11 11:04 ` [PATCH 01/29] block: Provide bdev_open_* functions 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=20230927093442.25915-1-jack@suse.cz \
--to=jack@suse.cz \
--cc=brauner@kernel.org \
--cc=hch@infradead.org \
--cc=hch@lst.de \
--cc=linux-block@vger.kernel.org \
--cc=linux-fsdevel@vger.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).