Skip to content

Commit

Permalink
mg_disk: fix queue hang / infinite retry on !fs requests
Browse files Browse the repository at this point in the history
Both request functions in mg_disk simply return when they encounter a
!fs request, which means the request will never be cleared from the
queue causing queue hang and indefinite retry of the request.  Fix it.

While at it, flatten condition checks and add unlikely to !fs tests.

[ Impact: fix possible queue hang / infinite retry of !fs requests ]

Signed-off-by: Tejun Heo <tj@kernel.org>
Cc: unsik Kim <donari75@gmail.com>
Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
  • Loading branch information
Tejun Heo authored and Jens Axboe committed May 11, 2009
1 parent 8f6205c commit 9a8d23d
Showing 1 changed file with 13 additions and 11 deletions.
24 changes: 13 additions & 11 deletions drivers/block/mg_disk.c
Original file line number Diff line number Diff line change
Expand Up @@ -672,16 +672,16 @@ static void mg_request_poll(struct request_queue *q)

while ((req = elv_next_request(q)) != NULL) {
host = req->rq_disk->private_data;
if (blk_fs_request(req)) {
switch (rq_data_dir(req)) {
case READ:
mg_read(req);
break;
case WRITE:
mg_write(req);
break;
}

if (unlikely(!blk_fs_request(req))) {
__blk_end_request_cur(req, -EIO);
continue;
}

if (rq_data_dir(req) == READ)
mg_read(req);
else
mg_write(req);
}
}

Expand Down Expand Up @@ -766,8 +766,10 @@ static void mg_request(struct request_queue *q)
continue;
}

if (!blk_fs_request(req))
return;
if (unlikely(!blk_fs_request(req))) {
__blk_end_request_cur(req, -EIO);
continue;
}

if (!mg_issue_req(req, host, sect_num, sect_cnt))
return;
Expand Down

0 comments on commit 9a8d23d

Please sign in to comment.