From 8c85c0472c15ef6734414922d525bcafe1a46918 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Wed, 24 Nov 2010 22:08:20 -0800 Subject: [PATCH] --- yaml --- r: 251213 b: refs/heads/master c: 313d7b003ceceb797e8c0d18ab085ed0638b4aff h: refs/heads/master i: 251211: 9b0c1db2da4d6ed621c7460d8e74b9cf7898e346 v: v3 --- [refs] | 2 +- trunk/drivers/xen/blkback/xenbus.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/[refs] b/[refs] index 016770946b4b..b321acbb4055 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: a81135d90bf176e6139c352c7b96c03d00131836 +refs/heads/master: 313d7b003ceceb797e8c0d18ab085ed0638b4aff diff --git a/trunk/drivers/xen/blkback/xenbus.c b/trunk/drivers/xen/blkback/xenbus.c index a0534fc6a428..031bc3d7eec3 100644 --- a/trunk/drivers/xen/blkback/xenbus.c +++ b/trunk/drivers/xen/blkback/xenbus.c @@ -382,6 +382,11 @@ static void frontend_changed(struct xenbus_device *dev, if (dev->state == XenbusStateConnected) break; + /* Enforce precondition before potential leak point. + * blkif_disconnect() is idempotent. + */ + blkif_disconnect(be->blkif); + err = connect_ring(be); if (err) break; @@ -399,6 +404,7 @@ static void frontend_changed(struct xenbus_device *dev, break; /* fall through if not online */ case XenbusStateUnknown: + /* implies blkif_disconnect() via blkback_remove() */ device_unregister(&dev->dev); break;