]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/block/swim.c
lguest: use native_set_* macros, which properly handle 64-bit entries when PAE is...
[karo-tx-linux.git] / drivers / block / swim.c
index 97ef4266c4c7e34947983fb00361440cdbcd4d4c..cf7877fb8a7d721b0ddbff0c0cced731e8c3e9fc 100644 (file)
@@ -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,31 @@ static void redo_fd_request(struct request_queue *q)
        struct request *req;
        struct floppy_state *fs;
 
-       while ((req = elv_next_request(q))) {
+       req = blk_fetch_request(q);
+       while (req) {
+               int err = -EIO;
 
                fs = req->rq_disk->private_data;
-               if (req->sector < 0 || req->sector >= 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, req->sector,
-                                               req->current_nr_sectors,
-                                               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 = blk_fetch_request(q);
        }
 }