Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 06b0608e authored by Tejun Heo's avatar Tejun Heo Committed by Jens Axboe
Browse files

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: default avatarTejun Heo <tj@kernel.org>
Cc: Laurent Vivier <Laurent@lvivier.info>
Signed-off-by: default avatarJens Axboe <jens.axboe@oracle.com>
parent 9e31bebe
Loading
Loading
Loading
Loading
+23 −24
Original line number Diff line number Diff line
@@ -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),
			err = 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);
						  req->buffer);
			break;
		}
	done:
		if (!__blk_end_request_cur(req, err)) {
			req = elv_next_request(q);
			if (req)
				blkdev_dequeue_request(req);
		}
	}
}