Re: [PATCH 2/6] xen-blkfront: handle backend CLOSED without CLOSING

From: David Vrabel
Date: Mon Oct 01 2012 - 13:19:18 EST


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;
> }
> }
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/