Commit 13961743 authored by Daniel Stodden's avatar Daniel Stodden Committed by Jens Axboe
Browse files

blkfront: Fix blkfront backend switch race (bdev open)



We need not mind if users grab a late handle on a closing disk. We
probably even should not. But we have to make sure it's not a dead
one already

Let the bdev deal with a gendisk deleted under its feet. Takes the
info mutex to decide a race against backend closing.

Signed-off-by: default avatarDaniel Stodden <daniel.stodden@citrix.com>
Signed-off-by: default avatarJeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent b70f5fa0
Loading
Loading
Loading
Loading
+24 −7
Original line number Diff line number Diff line
@@ -1118,16 +1118,33 @@ static int blkfront_is_ready(struct xenbus_device *dev)

static int blkif_open(struct block_device *bdev, fmode_t mode)
{
	struct blkfront_info *info = bdev->bd_disk->private_data;

	if (!info->xbdev)
		return -ENODEV;
	struct gendisk *disk = bdev->bd_disk;
	struct blkfront_info *info;
	int err = 0;

	lock_kernel();
	info->users++;
	unlock_kernel();

	return 0;
	info = disk->private_data;
	if (!info) {
		/* xbdev gone */
		err = -ERESTARTSYS;
		goto out;
	}

	mutex_lock(&info->mutex);

	if (!info->gd)
		/* xbdev is closed */
		err = -ERESTARTSYS;

	mutex_unlock(&info->mutex);

	if (!err)
		++info->users;

	unlock_kernel();
out:
	return err;
}

static int blkif_release(struct gendisk *disk, fmode_t mode)