forked from Minki/linux
swim: dequeue in-flight request
swim processes requests one-by-one synchronously and can easily be converted to dequeuing model. Convert it. [ Impact: dequeue in-flight request ] Signed-off-by: Tejun Heo <tj@kernel.org> Cc: Laurent Vivier <Laurent@lvivier.info> Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
This commit is contained in:
parent
9e31bebee2
commit
06b0608e2b
@ -514,7 +514,7 @@ static int floppy_read_sectors(struct floppy_state *fs,
|
||||
ret = swim_read_sector(fs, side, track, sector,
|
||||
buffer);
|
||||
if (try-- == 0)
|
||||
return -1;
|
||||
return -EIO;
|
||||
} while (ret != 512);
|
||||
|
||||
buffer += ret;
|
||||
@ -528,38 +528,37 @@ static void redo_fd_request(struct request_queue *q)
|
||||
struct request *req;
|
||||
struct floppy_state *fs;
|
||||
|
||||
while ((req = elv_next_request(q))) {
|
||||
req = elv_next_request(q);
|
||||
if (req)
|
||||
blkdev_dequeue_request(req);
|
||||
|
||||
while (req) {
|
||||
int err = -EIO;
|
||||
|
||||
fs = req->rq_disk->private_data;
|
||||
if (blk_rq_pos(req) >= fs->total_secs) {
|
||||
__blk_end_request_cur(req, -EIO);
|
||||
continue;
|
||||
}
|
||||
if (!fs->disk_in) {
|
||||
__blk_end_request_cur(req, -EIO);
|
||||
continue;
|
||||
}
|
||||
if (rq_data_dir(req) == WRITE) {
|
||||
if (fs->write_protected) {
|
||||
__blk_end_request_cur(req, -EIO);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (blk_rq_pos(req) >= fs->total_secs)
|
||||
goto done;
|
||||
if (!fs->disk_in)
|
||||
goto done;
|
||||
if (rq_data_dir(req) == WRITE && fs->write_protected)
|
||||
goto done;
|
||||
|
||||
switch (rq_data_dir(req)) {
|
||||
case WRITE:
|
||||
/* NOT IMPLEMENTED */
|
||||
__blk_end_request_cur(req, -EIO);
|
||||
break;
|
||||
case READ:
|
||||
if (floppy_read_sectors(fs, blk_rq_pos(req),
|
||||
blk_rq_cur_sectors(req),
|
||||
req->buffer)) {
|
||||
__blk_end_request_cur(req, -EIO);
|
||||
continue;
|
||||
}
|
||||
__blk_end_request_cur(req, 0);
|
||||
err = floppy_read_sectors(fs, blk_rq_pos(req),
|
||||
blk_rq_cur_sectors(req),
|
||||
req->buffer);
|
||||
break;
|
||||
}
|
||||
done:
|
||||
if (!__blk_end_request_cur(req, err)) {
|
||||
req = elv_next_request(q);
|
||||
if (req)
|
||||
blkdev_dequeue_request(req);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user