提交 2d75ce08 编写于 作者: T Tejun Heo 提交者: Jens Axboe

xsysace: dequeue in-flight request

xsysace already tracks in-flight request using ace->req.  Converting
to dequeueing model is mostly a matter of adding dequeueing call after
request fetching.  The only tricky part is handling CF removal which
should complete both in flight and on queue requests.  Convert to
dequeueing model.

While at it, remove explicit blk_rq_cur_bytes() and use
__blk_end_request_cur() instead.

[ Impact: dequeue in-flight request ]
Signed-off-by: NTejun Heo <tj@kernel.org>
Cc: Grant Likely <grant.likely@secretlab.ca>
Signed-off-by: NJens Axboe <jens.axboe@oracle.com>
上级 f4bd4b90
...@@ -466,7 +466,8 @@ struct request *ace_get_next_request(struct request_queue * q) ...@@ -466,7 +466,8 @@ struct request *ace_get_next_request(struct request_queue * q)
while ((req = elv_next_request(q)) != NULL) { while ((req = elv_next_request(q)) != NULL) {
if (blk_fs_request(req)) if (blk_fs_request(req))
break; break;
__blk_end_request_cur(req, -EIO); blkdev_dequeue_request(req);
__blk_end_request_all(req, -EIO);
} }
return req; return req;
} }
...@@ -492,9 +493,15 @@ static void ace_fsm_dostate(struct ace_device *ace) ...@@ -492,9 +493,15 @@ static void ace_fsm_dostate(struct ace_device *ace)
set_capacity(ace->gd, 0); set_capacity(ace->gd, 0);
dev_info(ace->dev, "No CF in slot\n"); dev_info(ace->dev, "No CF in slot\n");
/* Drop all pending requests */ /* Drop all in-flight and pending requests */
while ((req = elv_next_request(ace->queue)) != NULL) if (ace->req) {
__blk_end_request_cur(req, -EIO); __blk_end_request_all(ace->req, -EIO);
ace->req = NULL;
}
while ((req = elv_next_request(ace->queue)) != NULL) {
blkdev_dequeue_request(req);
__blk_end_request_all(req, -EIO);
}
/* Drop back to IDLE state and notify waiters */ /* Drop back to IDLE state and notify waiters */
ace->fsm_state = ACE_FSM_STATE_IDLE; ace->fsm_state = ACE_FSM_STATE_IDLE;
...@@ -642,6 +649,7 @@ static void ace_fsm_dostate(struct ace_device *ace) ...@@ -642,6 +649,7 @@ static void ace_fsm_dostate(struct ace_device *ace)
ace->fsm_state = ACE_FSM_STATE_IDLE; ace->fsm_state = ACE_FSM_STATE_IDLE;
break; break;
} }
blkdev_dequeue_request(req);
/* Okay, it's a data request, set it up for transfer */ /* Okay, it's a data request, set it up for transfer */
dev_dbg(ace->dev, dev_dbg(ace->dev,
...@@ -718,8 +726,7 @@ static void ace_fsm_dostate(struct ace_device *ace) ...@@ -718,8 +726,7 @@ static void ace_fsm_dostate(struct ace_device *ace)
} }
/* bio finished; is there another one? */ /* bio finished; is there another one? */
if (__blk_end_request(ace->req, 0, if (__blk_end_request_cur(ace->req, 0)) {
blk_rq_cur_bytes(ace->req))) {
/* dev_dbg(ace->dev, "next block; h=%u c=%u\n", /* dev_dbg(ace->dev, "next block; h=%u c=%u\n",
* blk_rq_sectors(ace->req), * blk_rq_sectors(ace->req),
* blk_rq_cur_sectors(ace->req)); * blk_rq_cur_sectors(ace->req));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册