block: Convert fifo_time from ulong to u64
authorJan Kara <jack@suse.cz>
Tue, 28 Jun 2016 07:03:59 +0000 (09:03 +0200)
committerJens Axboe <axboe@fb.com>
Tue, 28 Jun 2016 14:21:44 +0000 (08:21 -0600)
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: 9a7f38c42c2b92391d9dabaf9f51df7cfe5608e4
Signed-off-by: Jan Kara <jack@suse.cz>
Signed-off-by: Jens Axboe <axboe@fb.com>
block/deadline-iosched.c
include/linux/blkdev.h

index d0dd7882d8c7fa7ffe80ea2e9a6ad3c0f5e97a68..26a9d3c8057a21ca9c447da852eb8e8b16b94634 100644 (file)
@@ -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
         */
        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);
                        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!
         */
-       if (time_after_eq(jiffies, rq->fifo_time))
+       if (time_after_eq(jiffies, (unsigned long)rq->fifo_time))
                return 1;
 
        return 0;
index 9746d223494c4cd985ebd53ae644ff9ccaae7058..d116d3b52c732aa966555d0e71042baee7ed650d 100644 (file)
@@ -90,7 +90,7 @@ struct request {
        struct list_head queuelist;
        union {
                struct call_single_data csd;
-               unsigned long fifo_time;
+               u64 fifo_time;
        };
 
        struct request_queue *q;