[PATCH] xen-blkback: only set Closed state when resources have been released

From: Roger Pau Monne
Date: Thu Sep 13 2018 - 05:27:57 EST


Don't set the backend to Closed state until all the resources have
been released and the blkback instance is gone. Setting the backend
state to Closed will be done by xenbus_dev_remove after removing the
device instance.

Note that this requires disconnecting and allowing reconnection with
state Closing, since the Closed state will only be reached when
detaching the device.

Reported-by: Valentin Vidic <Valentin.Vidic@xxxxxxxxx>
Signed-off-by: Roger Pau Monnéroger.pau@xxxxxxxxxx>
---
drivers/block/xen-blkback/xenbus.c | 5 +++--
1 file changed, 3 insertions(+), 2 deletions(-)

diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c
index a4bc74e72c39..b0629f1b0511 100644
--- a/drivers/block/xen-blkback/xenbus.c
+++ b/drivers/block/xen-blkback/xenbus.c
@@ -770,7 +770,8 @@ static void frontend_changed(struct xenbus_device *dev,

switch (frontend_state) {
case XenbusStateInitialising:
- if (dev->state == XenbusStateClosed) {
+ if (dev->state == XenbusStateClosed ||
+ dev->state == XenbusStateClosing) {
pr_info("%s: prepare for reconnect\n", dev->nodename);
xenbus_switch_state(dev, XenbusStateInitWait);
}
@@ -809,12 +810,12 @@ static void frontend_changed(struct xenbus_device *dev,
break;

case XenbusStateClosing:
+ xen_blkif_disconnect(be->blkif);
xenbus_switch_state(dev, XenbusStateClosing);
break;

case XenbusStateClosed:
xen_blkif_disconnect(be->blkif);
- xenbus_switch_state(dev, XenbusStateClosed);
if (xenbus_dev_is_online(dev))
break;
/* fall through */
--
2.18.0