block: fix oops on !disk->queue and sysfs discard alignment display
authorJens Axboe <jaxboe@fusionio.com>
Thu, 26 May 2011 19:01:38 +0000 (21:01 +0200)
committerJens Axboe <jaxboe@fusionio.com>
Thu, 26 May 2011 19:01:38 +0000 (21:01 +0200)
Eric Dumazet reports:

----

At boot, I have a crash in part_discard_alignment_show+0x1b/0x50

CR2 : 000006ac

fault in : mov    0x2c(%rcx),%edx

I suspect commit 23ceb5b7719e9276d4 (block: Remove extra
discard_alignment from hd_struct) being in fault

----

Not quite known how ->queue can be NULL while the sysfs entry
exists, but lets play it safe and check for a NULL queue.
The rest of the sysfs show strategies in check.c do not dereference
disk->queue.

Reported-by: Eric Dumazet <eric.dumazet@gmail.com>
Signed-off-by: Jens Axboe <jaxboe@fusionio.com>
fs/partitions/check.c

index 8ed4d3433199fb233913c3f2e6e88afc149c062c..f82e762eeca277683a49b23e4ce9534d29a672de 100644 (file)
@@ -256,10 +256,12 @@ ssize_t part_discard_alignment_show(struct device *dev,
 {
        struct hd_struct *p = dev_to_part(dev);
        struct gendisk *disk = dev_to_disk(dev);
+       unsigned int alignment = 0;
 
-       return sprintf(buf, "%u\n",
-                       queue_limit_discard_alignment(&disk->queue->limits,
-                                                       p->start_sect));
+       if (disk->queue)
+               alignment = queue_limit_discard_alignment(&disk->queue->limits,
+                                                               p->start_sect);
+       return sprintf(buf, "%u\n", alignment);
 }
 
 ssize_t part_stat_show(struct device *dev,