void blkback_close(blkif_t *blkif)
{
blkif_disconnect(blkif);
+
+ down(&blkback_dev_sem);
+
vbd_free(&blkif->vbd);
blkif->be->major = 0;
blkif->be->minor = 0;
blkif->remove_requested = 0;
-
- down(&blkback_dev_sem);
if (blkif->be->dev)
xenvbd_sysfs_delif(blkif->be->dev);
+
up(&blkback_dev_sem);
backend_release(blkif->be);
down(&blkback_dev_sem);
if (be->dev) {
- connect(be);
+ if (blkif->vbd.bdev &&
+ be->dev->state == XenbusStateConnected)
+ connect(be);
+
err = xenbus_rm(XBT_NIL, be->dev->nodename, "pause-done");
if (err)
xenbus_dev_error(be->dev, err, "removing pause-done");