# HG changeset patch # User Daniel Stodden # Date 1272506749 25200 # Node ID 5e73c8d7aaf5bff5caa7d431184ffed8e837997a # Parent 6a52e76a65073a521d531d875d141b1e89a38954 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: Daniel Stodden diff -r 6a52e76a6507 -r 5e73c8d7aaf5 drivers/block/xen-blkfront.c --- a/drivers/block/xen-blkfront.c Wed Apr 28 19:05:49 2010 -0700 +++ b/drivers/block/xen-blkfront.c Wed Apr 28 19:05:49 2010 -0700 @@ -1100,12 +1100,23 @@ static int blkif_open(struct block_device *bdev, fmode_t mode) { - struct blkfront_info *info = bdev->bd_disk->private_data; + struct gendisk *disk = bdev->bd_disk; + struct blkfront_info *info = disk->private_data; + int err = 0; - if (!info->xbdev) - return -ENODEV; - info->users++; - return 0; + mutex_lock(&info->mutex); + /* + * Let the bdev deal with a gendisk deleted under its feet. + */ + if (!info->gd) + err = -ERESTARTSYS; + + mutex_unlock(&info->mutex); + + if (!err) + ++info->users; + + return err; } static int blkif_release(struct gendisk *disk, fmode_t mode)