block: fix oops in blk_queue_io_stat()
authorJens Axboe <jens.axboe@oracle.com>
Mon, 2 Feb 2009 07:42:32 +0000 (08:42 +0100)
committerJens Axboe <jens.axboe@oracle.com>
Mon, 2 Feb 2009 07:42:32 +0000 (08:42 +0100)
Some initial probe requests don't have disk->queue mapped yet, so we
can't rely on a non-NULL queue in blk_queue_io_stat(). Wrap it in
blk_do_io_stat().

Signed-off-by: Jens Axboe <jens.axboe@oracle.com>
block/blk-core.c
block/blk.h

index ca69f3d9410005f69e3fb360858a71f663c7ce41..29bcfac6c68853e4e562642dddadc4c8deb17231 100644 (file)
@@ -69,7 +69,7 @@ static void drive_stat_acct(struct request *rq, int new_io)
        int rw = rq_data_dir(rq);
        int cpu;
 
-       if (!blk_fs_request(rq) || !disk || !blk_queue_io_stat(disk->queue))
+       if (!blk_fs_request(rq) || !disk || !blk_do_io_stat(disk->queue))
                return;
 
        cpu = part_stat_lock();
@@ -1667,7 +1667,7 @@ static void blk_account_io_completion(struct request *req, unsigned int bytes)
 {
        struct gendisk *disk = req->rq_disk;
 
-       if (!disk || !blk_queue_io_stat(disk->queue))
+       if (!disk || !blk_do_io_stat(disk->queue))
                return;
 
        if (blk_fs_request(req)) {
@@ -1686,7 +1686,7 @@ static void blk_account_io_done(struct request *req)
 {
        struct gendisk *disk = req->rq_disk;
 
-       if (!disk || !blk_queue_io_stat(disk->queue))
+       if (!disk || !blk_do_io_stat(disk->queue))
                return;
 
        /*
index 6e1ed40534e97e78ff0263268b2826344f2207b7..0dce92c37496faf8b187741de6d169869019e9b7 100644 (file)
@@ -108,4 +108,12 @@ static inline int blk_cpu_to_group(int cpu)
 #endif
 }
 
+static inline int blk_do_io_stat(struct request_queue *q)
+{
+       if (q)
+               return blk_queue_io_stat(q);
+
+       return 0;
+}
+
 #endif