Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 208284
b: refs/heads/master
c: b70f5fa
h: refs/heads/master
v: v3
  • Loading branch information
Daniel Stodden authored and Jens Axboe committed Aug 7, 2010
1 parent ee70c9b commit d697c3b
Show file tree
Hide file tree
Showing 2 changed files with 41 additions and 22 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: a66b5aebb7dc9e695dcb4b528906fd398b63f3d9
refs/heads/master: b70f5fa043b318659c936d8c3c696250e6528944
61 changes: 40 additions & 21 deletions trunk/drivers/block/xen-blkfront.c
Original file line number Diff line number Diff line change
Expand Up @@ -79,6 +79,7 @@ static const struct block_device_operations xlvbd_block_fops;
*/
struct blkfront_info
{
struct mutex mutex;
struct xenbus_device *xbdev;
struct gendisk *gd;
int vdevice;
Expand Down Expand Up @@ -804,7 +805,6 @@ static int talk_to_blkback(struct xenbus_device *dev,
return err;
}


/**
* Entry point to this code when a new device is created. Allocate the basic
* structures and the ring buffer for communication with the backend, and
Expand Down Expand Up @@ -836,6 +836,7 @@ static int blkfront_probe(struct xenbus_device *dev,
return -ENOMEM;
}

mutex_init(&info->mutex);
info->xbdev = dev;
info->vdevice = vdevice;
info->connected = BLKIF_STATE_DISCONNECTED;
Expand Down Expand Up @@ -951,6 +952,43 @@ static int blkfront_resume(struct xenbus_device *dev)
return err;
}

static void
blkfront_closing(struct blkfront_info *info)
{
struct xenbus_device *xbdev = info->xbdev;
struct block_device *bdev = NULL;

mutex_lock(&info->mutex);

if (xbdev->state == XenbusStateClosing) {
mutex_unlock(&info->mutex);
return;
}

if (info->gd)
bdev = bdget_disk(info->gd, 0);

mutex_unlock(&info->mutex);

if (!bdev) {
xenbus_frontend_closed(xbdev);
return;
}

mutex_lock(&bdev->bd_mutex);

if (info->users) {
xenbus_dev_error(xbdev, -EBUSY,
"Device in use; refusing to close");
xenbus_switch_state(xbdev, XenbusStateClosing);
} else {
xlvbd_release_gendisk(info);
xenbus_frontend_closed(xbdev);
}

mutex_unlock(&bdev->bd_mutex);
bdput(bdev);
}

/*
* Invoked when the backend is finally 'ready' (and has told produced
Expand Down Expand Up @@ -1034,7 +1072,6 @@ static void blkback_changed(struct xenbus_device *dev,
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);

Expand All @@ -1051,25 +1088,7 @@ static void blkback_changed(struct xenbus_device *dev,
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");

mutex_lock(&bd->bd_mutex);
if (info->users > 0)
xenbus_dev_error(dev, -EBUSY,
"Device in use; refusing to close");
else {
xlvbd_release_gendisk(info);
xenbus_frontend_closed(info->xbdev);
}

mutex_unlock(&bd->bd_mutex);
bdput(bd);
blkfront_closing(info);
break;
}
}
Expand Down

0 comments on commit d697c3b

Please sign in to comment.