[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH] blkfront:finish requests in io-ring with EIO
Subject: [PATCH] blkfront:finished the requests in io-ring with EIO to avoid stucking with state of D. The sequence of xenwatch of blkfront and xenbus_frontend, when the
tdb path of backend is gone, desided that the backend closing-> frontend closing->backend closed->frontend closed normaly or remove started by xenbus. --- drivers/block/xen-blkfront.c | 23 +++++++++++++++++++++++
1 file changed, 23 insertions(+) diff --git a/drivers/block/xen-blkfront.c b/drivers/block/xen-blkfront.c index 9ea8c25..6582592 100644 --- a/drivers/block/xen-blkfront.c
+++ b/drivers/block/xen-blkfront.c @@ -653,6 +653,26 @@ static void blkif_restart_queue(struct work_struct *work) spin_unlock_irq(&blkif_io_lock);
} +static void finish_requests_sync(struct blkfront_info *info) +{ + RING_IDX rc, rp; + struct blkif_request *ring_req;
+ struct request *req; + + rc = (info->ring.sring)->req_prod; + rp = info->ring.req_prod_pvt;
+ + while(rc != cp) { + unsigned long id; + + ring_req = RING_GET_REQUEST(&info->ring, rc);
+ id = ring_req->id; + req = info->shadow[id].request; + __blk_end_srequest_all(req, -EIO);
+ rc++; + } +} + static void blkif_free(struct blkfront_info *info, int suspend)
{ /* Prevent new requests being issued until we fix things up. */ @@ -664,6 +684,9 @@ static void blkif_free(struct blkfront_info *info, int suspend)
blk_stop_queue(info->rq); /* No more gnttab callback work. */ gnttab_cancel_free_callback(&info->callback);
+ /* Finished request in io-ring with EIO */ + finish_requests_sync(info); + spin_unlock_irq(&blkif_io_lock);
/* Flush gnttab callback work. Must be done with no locks held. */ -- 1.8.3.1 Attachment:
0001-blkfront-finished-the-requests-in-io-ring-with-EIO-t.patch _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |