|
@@ -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);
|
|
|
+ }
|
|
|
}
|
|
|
}
|
|
|
|