Prev: [PATCH 08/16] blkfront: Fix backtrace in del_gendisk
Next: [PATCH 05/16] xen/blkfront: avoid compiler warning from missing cases
From: Jeremy Fitzhardinge on 20 Jul 2010 16:50 From: Daniel Stodden <daniel.stodden(a)citrix.com> 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 <daniel.stodden(a)citrix.com> Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge(a)citrix.com> --- drivers/block/xen-blkfront.c | 25 ++++++++++++++++++++----- 1 files changed, 20 insertions(+), 5 deletions(-) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 1046a58..974d59a 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c @@ -1118,12 +1118,27 @@ 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; + struct gendisk *disk = bdev->bd_disk; + struct blkfront_info *info; + int err = 0; - if (!info->xbdev) - return -ENODEV; - info->users++; - return 0; + info = disk->private_data; + if (!info) + /* xbdev gone */ + return -ERESTARTSYS; + + mutex_lock(&info->mutex); + + if (!info->gd) + /* xbdev is closed */ + err = -ERESTARTSYS; + + mutex_unlock(&info->mutex); + + if (!err) + ++info->users; + + return err; } static int blkif_release(struct gendisk *disk, fmode_t mode) -- 1.7.1.1 -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo(a)vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/ |