[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 2/6] xen-blkfront: handle backend CLOSED without CLOSING
On 25/09/12 18:53, David Vrabel wrote: > On 21/09/12 17:04, David Vrabel wrote: >> From: David Vrabel <david.vrabel@xxxxxxxxxx> >> >> Backend drivers shouldn't transistion to CLOSED unless the frontend is >> CLOSED. If a backend does transition to CLOSED too soon then the >> frontend may not see the CLOSING state and will not properly shutdown. >> >> So, treat an unexpected backend CLOSED state the same as CLOSING. > > Didn't handle the frontend block device being mounted. Updated patch here. Konrad, can you ack this updated patch if you're happy with it. Thanks. David > 8<--------------------------------- > xen-blkfront: handle backend CLOSED without CLOSING > > Backend drivers shouldn't transistion to CLOSED unless the frontend is > CLOSED. If a backend does transition to CLOSED too soon then the > frontend may not see the CLOSING state and will not properly shutdown. > > So, treat an unexpected backend CLOSED state the same as CLOSING. > > If the backend is CLOSED then the frontend can't talk to it so go to > CLOSED immediately without waiting for the block device to be closed > or unmounted. > > Signed-off-by: David Vrabel <david.vrabel@xxxxxxxxxx> > --- > drivers/block/xen-blkfront.c | 13 +++++++++---- > 1 files changed, 9 insertions(+), 4 deletions(-) > > diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c > index 2c2d2e5..c1f5f38 100644 > --- a/drivers/block/xen-blkfront.c > +++ b/drivers/block/xen-blkfront.c > @@ -1143,7 +1143,8 @@ static int blkfront_resume(struct xenbus_device *dev) > } > > static void > -blkfront_closing(struct blkfront_info *info) > +blkfront_closing(struct blkfront_info *info, > + enum xenbus_state backend_state) > { > struct xenbus_device *xbdev = info->xbdev; > struct block_device *bdev = NULL; > @@ -1167,7 +1168,8 @@ blkfront_closing(struct blkfront_info *info) > > mutex_lock(&bdev->bd_mutex); > > - if (bdev->bd_openers) { > + /* If the backend is already CLOSED, close now. */ > + if (bdev->bd_openers && backend_state != XenbusStateClosed) { > xenbus_dev_error(xbdev, -EBUSY, > "Device in use; refusing to close"); > xenbus_switch_state(xbdev, XenbusStateClosing); > @@ -1340,15 +1342,18 @@ static void blkback_changed(struct xenbus_device *dev, > case XenbusStateReconfiguring: > case XenbusStateReconfigured: > case XenbusStateUnknown: > - case XenbusStateClosed: > break; > > case XenbusStateConnected: > blkfront_connect(info); > break; > > + case XenbusStateClosed: > + if (dev->state == XenbusStateClosed) > + break; > + /* Missed the backend's Closing state -- fallthrough */ > case XenbusStateClosing: > - blkfront_closing(info); > + blkfront_closing(info, backend_state); > break; > } > } _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |