Re: [PATCH 5/9] block: introduce holder ops

Ming Lei
2023-05-16T11:12:25Z

On Fri, May 05, 2023 at 01:51:28PM -0400, Christoph Hellwig wrote:
> Add a new blk_holder_ops structure, which is passed to blkdev_get_by_* and
> installed in the block_device for exclusive claims. It will be used to
> allow the block layer to call back into the user of the block device for
> thing like notification of a removed device or a device resize.
>
> Signed-off-by: Christoph Hellwig <hch@lst.de>
> ---

...

> @@ -542,7 +543,8 @@ static void bd_clear_claiming(struct block_device *whole, void *holder)
> * 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, void *holder)
> +static void bd_finish_claiming(struct block_device *bdev, void *holder,
> + const struct blk_holder_ops *hops)
> {
> struct block_device *whole = bdev_whole(bdev);
>
> @@ -555,7 +557,10 @@ static void bd_finish_claiming(struct block_device *bdev, void *holder)
> whole->bd_holders++;
> whole->bd_holder = bd_may_claim;
> bdev->bd_holders++;
> + mutex_lock(&bdev->bd_holder_lock);
> bdev->bd_holder = holder;
> + bdev->bd_holder_ops = hops;
> + mutex_unlock(&bdev->bd_holder_lock);
> bd_clear_claiming(whole, holder);
> mutex_unlock(&bdev_lock);
> }

I guess the holder ops may be override in case of multiple claim, can
this be one problem from the holder ops user viewpoint? Or
warn_on_once(bdev->bd_holder_ops && bdev->bd_holder_ops != hops) is needed here?

Thanks,
Ming