# HG changeset patch # User Daniel Stodden # Date 1267198064 28800 # Node ID 96525ab0393ab7cab181de757a495f57284ccd01 # Parent fcefa69c0dbf52a86a9037ad14f81d3252f387ff blkfront: Clean up closing transition. Just gained enough locals to justify a proper subroutine. Signed-off-by: Daniel Stodden Cc: stable@xxxxxxxxxx diff -r fcefa69c0dbf -r 96525ab0393a drivers/block/xen-blkfront.c --- a/drivers/block/xen-blkfront.c Fri Feb 26 07:25:54 2010 -0800 +++ b/drivers/block/xen-blkfront.c Fri Feb 26 07:27:44 2010 -0800 @@ -954,6 +954,35 @@ xenbus_frontend_closed(dev); } +static void blkfront_close(struct blkfront_info *info) +{ + struct xenbus_device *dev = info->xbdev; + struct gendisk *gd = info->gd; + struct block_device *bd; + + if (!gd) { + xenbus_frontend_closed(dev); + return; + } + + bd = bdget_disk(gd, 0); + if (!bd) { + xenbus_dev_fatal(dev, -ENODEV, "bdget failed"); + return; + } + + mutex_lock(&bd->bd_mutex); + + if (info->users > 0) + xenbus_dev_error(dev, -EBUSY, + "Device in use; refusing to close"); + else + blkfront_closing(dev); + + mutex_unlock(&bd->bd_mutex); + bdput(bd); +} + /** * Callback received when the backend's state changes. */ @@ -961,7 +990,6 @@ enum xenbus_state backend_state) { struct blkfront_info *info = dev_get_drvdata(&dev->dev); - struct block_device *bd; dev_dbg(&dev->dev, "blkfront:blkback_changed to state %d.\n", backend_state); @@ -980,24 +1008,7 @@ break; case XenbusStateClosing: - if (info->gd == NULL) { - xenbus_frontend_closed(dev); - break; - } - bd = bdget_disk(info->gd, 0); - if (bd == NULL) { - xenbus_dev_fatal(dev, -ENODEV, "bdget failed"); - break; - } - - mutex_lock(&bd->bd_mutex); - if (info->users > 0) - xenbus_dev_error(dev, -EBUSY, - "Device in use; refusing to close"); - else - blkfront_closing(dev); - mutex_unlock(&bd->bd_mutex); - bdput(bd); + blkfront_close(info); break; } }