Skip to content

Commit ab838b3

Browse files
committed
block: remove bdev_handle completely
We just need to use the holder to indicate whether a block device open was exclusive or not. We did use to do that before but had to give that up once we switched to struct bdev_handle. Before struct bdev_handle we only stashed stuff in file->private_data if this was an exclusive open but after struct bdev_handle we always set file->private_data to a struct bdev_handle and so we had to use bdev_handle->mode or bdev_handle->holder. Now that we don't use struct bdev_handle anymore we can revert back to the old behavior. Link: https://lore.kernel.org/r/20240123-vfs-bdev-file-v2-32-adbd023e19cc@kernel.org Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Christian Brauner <brauner@kernel.org>
1 parent 321de65 commit ab838b3

File tree

3 files changed

+34
-39
lines changed

3 files changed

+34
-39
lines changed

block/bdev.c

Lines changed: 24 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -717,6 +717,13 @@ int bdev_permission(dev_t dev, blk_mode_t mode, void *holder)
717717
if (mode & BLK_OPEN_RESTRICT_WRITES && !holder)
718718
return -EINVAL;
719719

720+
/*
721+
* We're using error pointers to indicate to ->release() when we
722+
* failed to open that block device. Also this doesn't make sense.
723+
*/
724+
if (WARN_ON_ONCE(IS_ERR(holder)))
725+
return -EINVAL;
726+
720727
return 0;
721728
}
722729

@@ -799,7 +806,7 @@ static void bdev_claim_write_access(struct block_device *bdev, blk_mode_t mode)
799806
bdev->bd_writers++;
800807
}
801808

802-
static void bdev_yield_write_access(struct file *bdev_file, blk_mode_t mode)
809+
static void bdev_yield_write_access(struct file *bdev_file)
803810
{
804811
struct block_device *bdev;
805812

@@ -808,7 +815,7 @@ static void bdev_yield_write_access(struct file *bdev_file, blk_mode_t mode)
808815

809816
bdev = file_bdev(bdev_file);
810817
/* Yield exclusive or shared write access. */
811-
if (mode & BLK_OPEN_WRITE) {
818+
if (bdev_file->f_mode & FMODE_WRITE) {
812819
if (bdev_writes_blocked(bdev))
813820
bdev_unblock_writes(bdev);
814821
else
@@ -836,25 +843,18 @@ static void bdev_yield_write_access(struct file *bdev_file, blk_mode_t mode)
836843
int bdev_open(struct block_device *bdev, blk_mode_t mode, void *holder,
837844
const struct blk_holder_ops *hops, struct file *bdev_file)
838845
{
839-
struct bdev_handle *handle;
840846
bool unblock_events = true;
841847
struct gendisk *disk = bdev->bd_disk;
842848
int ret;
843849

844-
handle = kmalloc(sizeof(struct bdev_handle), GFP_KERNEL);
845-
if (!handle)
846-
return -ENOMEM;
847-
848850
if (holder) {
849851
mode |= BLK_OPEN_EXCL;
850852
ret = bd_prepare_to_claim(bdev, holder, hops);
851853
if (ret)
852-
goto free_handle;
854+
return ret;
853855
} else {
854-
if (WARN_ON_ONCE(mode & BLK_OPEN_EXCL)) {
855-
ret = -EIO;
856-
goto free_handle;
857-
}
856+
if (WARN_ON_ONCE(mode & BLK_OPEN_EXCL))
857+
return -EIO;
858858
}
859859

860860
disk_block_events(disk);
@@ -895,16 +895,14 @@ int bdev_open(struct block_device *bdev, blk_mode_t mode, void *holder,
895895

896896
if (unblock_events)
897897
disk_unblock_events(disk);
898-
handle->holder = holder;
899-
handle->mode = mode;
900898

901899
bdev_file->f_flags |= O_LARGEFILE;
902900
bdev_file->f_mode |= FMODE_BUF_RASYNC | FMODE_CAN_ODIRECT;
903901
if (bdev_nowait(bdev))
904902
bdev_file->f_mode |= FMODE_NOWAIT;
905903
bdev_file->f_mapping = bdev->bd_inode->i_mapping;
906904
bdev_file->f_wb_err = filemap_sample_wb_err(bdev_file->f_mapping);
907-
bdev_file->private_data = handle;
905+
bdev_file->private_data = holder;
908906

909907
return 0;
910908
put_module:
@@ -914,8 +912,6 @@ int bdev_open(struct block_device *bdev, blk_mode_t mode, void *holder,
914912
bd_abort_claiming(bdev, holder);
915913
mutex_unlock(&disk->open_mutex);
916914
disk_unblock_events(disk);
917-
free_handle:
918-
kfree(handle);
919915
return ret;
920916
}
921917

@@ -976,7 +972,8 @@ struct file *bdev_file_open_by_dev(dev_t dev, blk_mode_t mode, void *holder,
976972

977973
ret = bdev_open(bdev, mode, holder, hops, bdev_file);
978974
if (ret) {
979-
blkdev_put_no_open(bdev);
975+
/* We failed to open the block device. Let ->release() know. */
976+
bdev_file->private_data = ERR_PTR(ret);
980977
fput(bdev_file);
981978
return ERR_PTR(ret);
982979
}
@@ -1011,9 +1008,13 @@ EXPORT_SYMBOL(bdev_file_open_by_path);
10111008
void bdev_release(struct file *bdev_file)
10121009
{
10131010
struct block_device *bdev = file_bdev(bdev_file);
1014-
struct bdev_handle *handle = bdev_file->private_data;
1011+
void *holder = bdev_file->private_data;
10151012
struct gendisk *disk = bdev->bd_disk;
10161013

1014+
/* We failed to open that block device. */
1015+
if (IS_ERR(holder))
1016+
goto put_no_open;
1017+
10171018
/*
10181019
* Sync early if it looks like we're the last one. If someone else
10191020
* opens the block device between now and the decrement of bd_openers
@@ -1025,10 +1026,10 @@ void bdev_release(struct file *bdev_file)
10251026
sync_blockdev(bdev);
10261027

10271028
mutex_lock(&disk->open_mutex);
1028-
bdev_yield_write_access(bdev_file, handle->mode);
1029+
bdev_yield_write_access(bdev_file);
10291030

1030-
if (handle->holder)
1031-
bd_end_claim(bdev, handle->holder);
1031+
if (holder)
1032+
bd_end_claim(bdev, holder);
10321033

10331034
/*
10341035
* Trigger event checking and tell drivers to flush MEDIA_CHANGE
@@ -1044,8 +1045,8 @@ void bdev_release(struct file *bdev_file)
10441045
mutex_unlock(&disk->open_mutex);
10451046

10461047
module_put(disk->fops->owner);
1048+
put_no_open:
10471049
blkdev_put_no_open(bdev);
1048-
kfree(handle);
10491050
}
10501051

10511052
/**

block/blk.h

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,6 @@ struct blk_flush_queue {
2525
struct request *flush_rq;
2626
};
2727

28-
struct bdev_handle {
29-
void *holder;
30-
blk_mode_t mode;
31-
};
32-
3328
bool is_flush_rq(struct request *req);
3429

3530
struct blk_flush_queue *blk_alloc_flush_queue(int node, int cmd_size,

block/fops.c

Lines changed: 10 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -569,18 +569,17 @@ static int blkdev_fsync(struct file *filp, loff_t start, loff_t end,
569569
blk_mode_t file_to_blk_mode(struct file *file)
570570
{
571571
blk_mode_t mode = 0;
572-
struct bdev_handle *handle = file->private_data;
573572

574573
if (file->f_mode & FMODE_READ)
575574
mode |= BLK_OPEN_READ;
576575
if (file->f_mode & FMODE_WRITE)
577576
mode |= BLK_OPEN_WRITE;
578577
/*
579-
* do_dentry_open() clears O_EXCL from f_flags, use handle->mode to
580-
* determine whether the open was exclusive for already open files.
578+
* do_dentry_open() clears O_EXCL from f_flags, use file->private_data
579+
* to determine whether the open was exclusive for already open files.
581580
*/
582-
if (handle)
583-
mode |= handle->mode & BLK_OPEN_EXCL;
581+
if (file->private_data)
582+
mode |= BLK_OPEN_EXCL;
584583
else if (file->f_flags & O_EXCL)
585584
mode |= BLK_OPEN_EXCL;
586585
if (file->f_flags & O_NDELAY)
@@ -601,29 +600,29 @@ static int blkdev_open(struct inode *inode, struct file *filp)
601600
{
602601
struct block_device *bdev;
603602
blk_mode_t mode;
604-
void *holder;
605603
int ret;
606604

607605
mode = file_to_blk_mode(filp);
608-
holder = mode & BLK_OPEN_EXCL ? filp : NULL;
609-
ret = bdev_permission(inode->i_rdev, mode, holder);
606+
/* Use the file as the holder. */
607+
if (mode & BLK_OPEN_EXCL)
608+
filp->private_data = filp;
609+
ret = bdev_permission(inode->i_rdev, mode, filp->private_data);
610610
if (ret)
611611
return ret;
612612

613613
bdev = blkdev_get_no_open(inode->i_rdev);
614614
if (!bdev)
615615
return -ENXIO;
616616

617-
ret = bdev_open(bdev, mode, holder, NULL, filp);
617+
ret = bdev_open(bdev, mode, filp->private_data, NULL, filp);
618618
if (ret)
619619
blkdev_put_no_open(bdev);
620620
return ret;
621621
}
622622

623623
static int blkdev_release(struct inode *inode, struct file *filp)
624624
{
625-
if (filp->private_data)
626-
bdev_release(filp);
625+
bdev_release(filp);
627626
return 0;
628627
}
629628

0 commit comments

Comments
 (0)