diff options
-rw-r--r-- | drivers/block/xen-blkfront.c | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index ca13df854639..6ba8891e8efe 100644 --- a/drivers/block/xen-blkfront.c +++ b/drivers/block/xen-blkfront.c | |||
@@ -2485,10 +2485,23 @@ static void blkback_changed(struct xenbus_device *dev, | |||
2485 | break; | 2485 | break; |
2486 | 2486 | ||
2487 | case XenbusStateConnected: | 2487 | case XenbusStateConnected: |
2488 | if (dev->state != XenbusStateInitialised) { | 2488 | /* |
2489 | * talk_to_blkback sets state to XenbusStateInitialised | ||
2490 | * and blkfront_connect sets it to XenbusStateConnected | ||
2491 | * (if connection went OK). | ||
2492 | * | ||
2493 | * If the backend (or toolstack) decides to poke at backend | ||
2494 | * state (and re-trigger the watch by setting the state repeatedly | ||
2495 | * to XenbusStateConnected (4)) we need to deal with this. | ||
2496 | * This is allowed as this is used to communicate to the guest | ||
2497 | * that the size of disk has changed! | ||
2498 | */ | ||
2499 | if ((dev->state != XenbusStateInitialised) && | ||
2500 | (dev->state != XenbusStateConnected)) { | ||
2489 | if (talk_to_blkback(dev, info)) | 2501 | if (talk_to_blkback(dev, info)) |
2490 | break; | 2502 | break; |
2491 | } | 2503 | } |
2504 | |||
2492 | blkfront_connect(info); | 2505 | blkfront_connect(info); |
2493 | break; | 2506 | break; |
2494 | 2507 | ||