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

Commit 9828c2c6 authored by Jan Kara's avatar Jan Kara Committed by Jens Axboe
Browse files

block: Convert fifo_time from ulong to u64



Currently rq->fifo_time is unsigned long but CFQ stores nanosecond
timestamp in it which would overflow on 32-bit archs. Convert it to u64
to avoid the overflow. Since the rq->fifo_time is unioned with struct
call_single_data(), this does not change the size of struct request in
any way.

We have to slightly fixup block/deadline-iosched.c so that comparison
happens in the right types.

Fixes: 9a7f38c4
Signed-off-by: default avatarJan Kara <jack@suse.cz>
Signed-off-by: default avatarJens Axboe <axboe@fb.com>
parent 59a37f8b
Loading
Loading
Loading
Loading
+3 −2
Original line number Original line Diff line number Diff line
@@ -173,7 +173,8 @@ deadline_merged_requests(struct request_queue *q, struct request *req,
	 * and move into next position (next will be deleted) in fifo
	 * and move into next position (next will be deleted) in fifo
	 */
	 */
	if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) {
	if (!list_empty(&req->queuelist) && !list_empty(&next->queuelist)) {
		if (time_before(next->fifo_time, req->fifo_time)) {
		if (time_before((unsigned long)next->fifo_time,
				(unsigned long)req->fifo_time)) {
			list_move(&req->queuelist, &next->queuelist);
			list_move(&req->queuelist, &next->queuelist);
			req->fifo_time = next->fifo_time;
			req->fifo_time = next->fifo_time;
		}
		}
@@ -227,7 +228,7 @@ static inline int deadline_check_fifo(struct deadline_data *dd, int ddir)
	/*
	/*
	 * rq is expired!
	 * rq is expired!
	 */
	 */
	if (time_after_eq(jiffies, rq->fifo_time))
	if (time_after_eq(jiffies, (unsigned long)rq->fifo_time))
		return 1;
		return 1;


	return 0;
	return 0;
+1 −1
Original line number Original line Diff line number Diff line
@@ -90,7 +90,7 @@ struct request {
	struct list_head queuelist;
	struct list_head queuelist;
	union {
	union {
		struct call_single_data csd;
		struct call_single_data csd;
		unsigned long fifo_time;
		u64 fifo_time;
	};
	};


	struct request_queue *q;
	struct request_queue *q;