lkml.org 
[lkml]   [2010]   [Jul]   [20]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 12/16] blkfront: Fix blkfront backend switch race (bdev open)
    Date
    From: Daniel Stodden <daniel.stodden@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@citrix.com>
    Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@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


    \
     
     \ /
      Last update: 2010-07-20 22:45    [W:0.026 / U:29.632 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site