Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 7bcbd3ae authored by Linux Build Service Account's avatar Linux Build Service Account Committed by Gerrit - the friendly Code Review server
Browse files

Merge "block: Make blk_get_backing_dev_info() safe without open bdev"

parents c3759afd 84972a9a
Loading
Loading
Loading
Loading
+3 −5
Original line number Diff line number Diff line
@@ -110,14 +110,12 @@ void blk_queue_congestion_threshold(struct request_queue *q)
 * @bdev:	device
 *
 * Locates the passed device's request queue and returns the address of its
 * backing_dev_info.  This function can only be called if @bdev is opened
 * and the return value is never NULL.
 * backing_dev_info. The return value is never NULL however we may return
 * &noop_backing_dev_info if the bdev is not currently open.
 */
struct backing_dev_info *blk_get_backing_dev_info(struct block_device *bdev)
{
	struct request_queue *q = bdev_get_queue(bdev);

	return q->backing_dev_info;
	return bdev->bd_bdi;
}
EXPORT_SYMBOL(blk_get_backing_dev_info);

+7 −0
Original line number Diff line number Diff line
@@ -628,6 +628,8 @@ static void bdev_evict_inode(struct inode *inode)
	spin_lock(&bdev_lock);
	list_del_init(&bdev->bd_list);
	spin_unlock(&bdev_lock);
	if (bdev->bd_bdi != &noop_backing_dev_info)
		bdi_put(bdev->bd_bdi);
}

static const struct super_operations bdev_sops = {
@@ -730,6 +732,7 @@ struct block_device *bdget(dev_t dev)
		bdev->bd_contains = NULL;
		bdev->bd_super = NULL;
		bdev->bd_inode = inode;
		bdev->bd_bdi = &noop_backing_dev_info;
		bdev->bd_block_size = i_blocksize(inode);
		bdev->bd_part_count = 0;
		bdev->bd_invalidated = 0;
@@ -1285,6 +1288,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
		bdev->bd_disk = disk;
		bdev->bd_queue = disk->queue;
		bdev->bd_contains = bdev;
		if (bdev->bd_bdi == &noop_backing_dev_info)
			bdev->bd_bdi = bdi_get(disk->queue->backing_dev_info);

		if (!partno) {
			ret = -ENXIO;
@@ -1380,6 +1385,8 @@ static int __blkdev_get(struct block_device *bdev, fmode_t mode, int for_part)
	bdev->bd_disk = NULL;
	bdev->bd_part = NULL;
	bdev->bd_queue = NULL;
	bdi_put(bdev->bd_bdi);
	bdev->bd_bdi = &noop_backing_dev_info;
	if (bdev != bdev->bd_contains)
		__blkdev_put(bdev->bd_contains, mode, 1);
	bdev->bd_contains = NULL;
+1 −0
Original line number Diff line number Diff line
@@ -475,6 +475,7 @@ struct block_device {
	int			bd_invalidated;
	struct gendisk *	bd_disk;
	struct request_queue *  bd_queue;
	struct backing_dev_info *bd_bdi;
	struct list_head	bd_list;
	/*
	 * Private data.  You must have bd_claim'ed the block_device