Fix off-by-one in __pipe_get_pages()
[cascardo/linux.git] / block / blk-mq-sysfs.c
index ac5160e..01fb455 100644 (file)
@@ -208,12 +208,14 @@ static ssize_t blk_mq_hw_sysfs_dispatched_show(struct blk_mq_hw_ctx *hctx,
 
        page += sprintf(page, "%8u\t%lu\n", 0U, hctx->dispatched[0]);
 
-       for (i = 1; i < BLK_MQ_MAX_DISPATCH_ORDER; i++) {
-               unsigned long d = 1U << (i - 1);
+       for (i = 1; i < BLK_MQ_MAX_DISPATCH_ORDER - 1; i++) {
+               unsigned int d = 1U << (i - 1);
 
-               page += sprintf(page, "%8lu\t%lu\n", d, hctx->dispatched[i]);
+               page += sprintf(page, "%8u\t%lu\n", d, hctx->dispatched[i]);
        }
 
+       page += sprintf(page, "%8u+\t%lu\n", 1U << (i - 1),
+                                               hctx->dispatched[i]);
        return page - start_page;
 }
 
@@ -391,9 +393,8 @@ static int blk_mq_register_hctx(struct blk_mq_hw_ctx *hctx)
        return ret;
 }
 
-static void __blk_mq_unregister_disk(struct gendisk *disk)
+static void __blk_mq_unregister_dev(struct device *dev, struct request_queue *q)
 {
-       struct request_queue *q = disk->queue;
        struct blk_mq_hw_ctx *hctx;
        struct blk_mq_ctx *ctx;
        int i, j;
@@ -411,15 +412,15 @@ static void __blk_mq_unregister_disk(struct gendisk *disk)
        kobject_del(&q->mq_kobj);
        kobject_put(&q->mq_kobj);
 
-       kobject_put(&disk_to_dev(disk)->kobj);
+       kobject_put(&dev->kobj);
 
        q->mq_sysfs_init_done = false;
 }
 
-void blk_mq_unregister_disk(struct gendisk *disk)
+void blk_mq_unregister_dev(struct device *dev, struct request_queue *q)
 {
        blk_mq_disable_hotplug();
-       __blk_mq_unregister_disk(disk);
+       __blk_mq_unregister_dev(dev, q);
        blk_mq_enable_hotplug();
 }
 
@@ -441,10 +442,8 @@ static void blk_mq_sysfs_init(struct request_queue *q)
        }
 }
 
-int blk_mq_register_disk(struct gendisk *disk)
+int blk_mq_register_dev(struct device *dev, struct request_queue *q)
 {
-       struct device *dev = disk_to_dev(disk);
-       struct request_queue *q = disk->queue;
        struct blk_mq_hw_ctx *hctx;
        int ret, i;
 
@@ -465,7 +464,7 @@ int blk_mq_register_disk(struct gendisk *disk)
        }
 
        if (ret)
-               __blk_mq_unregister_disk(disk);
+               __blk_mq_unregister_dev(dev, q);
        else
                q->mq_sysfs_init_done = true;
 out:
@@ -473,7 +472,7 @@ out:
 
        return ret;
 }
-EXPORT_SYMBOL_GPL(blk_mq_register_disk);
+EXPORT_SYMBOL_GPL(blk_mq_register_dev);
 
 void blk_mq_sysfs_unregister(struct request_queue *q)
 {