]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
Revert commit 8bd274934987 ("block: fix bdi vs gendisk lifetime mismatch")
authorAshish Samant <ashish.samant@oracle.com>
Sat, 24 Nov 2018 22:04:13 +0000 (14:04 -0800)
committerBrian Maly <brian.maly@oracle.com>
Tue, 27 Nov 2018 19:35:37 +0000 (14:35 -0500)
Orabug: 28968102

8bd274934987 adds a new element at the end of struct backing_dev_info.
struct backing_dev_info is embedded inside struct request_queue
and is usually allocated during request_queue allocation. However, some
out of tree modules also allocate this struct separately using
sizeof() or via direct inclusion in their own structs. This patch
essentially breaks KABI for such modules and can cause a mismatch in the
size of the allocated struct and lead to kernel crashes.

Signed-off-by: Ashish Samant <ashish.samant@oracle.com>
Reviewed-by: Jianchao Wang <jianchao.w.wang@oracle.com>
Reviewed-by: Shan Hai <shan.hai@oracle.com>
Signed-off-by: Brian Maly <brian.maly@oracle.com>
block/genhd.c
include/linux/backing-dev.h
mm/backing-dev.c

index 24fcb43e61ee6a60a166974d2d425d02a603b971..60db28598670da7a802997810f91ca9a9f33c83e 100644 (file)
@@ -612,7 +612,7 @@ void add_disk(struct gendisk *disk)
 
        /* Register BDI before referencing it from bdev */
        bdi = &disk->queue->backing_dev_info;
-       bdi_register_owner(bdi, disk_to_dev(disk));
+       bdi_register_dev(bdi, disk_devt(disk));
 
        blk_register_region(disk_devt(disk), disk->minors, NULL,
                            exact_match, exact_lock, disk);
index 3cf1f7409a7c7f54a275a0866dd4863180d3b8a0..d87d8eced06407c59c6d231f9e707bdcc398ce52 100644 (file)
@@ -19,7 +19,6 @@
 #include <linux/atomic.h>
 #include <linux/sysctl.h>
 #include <linux/workqueue.h>
-#include <linux/uek_kabi.h>
 
 struct page;
 struct device;
@@ -106,7 +105,6 @@ struct backing_dev_info {
        struct dentry *debug_dir;
        struct dentry *debug_stats;
 #endif
-       UEK_KABI_EXTEND(struct device *owner)
 };
 
 struct backing_dev_info *inode_to_bdi(struct inode *inode);
@@ -118,7 +116,6 @@ __printf(3, 4)
 int bdi_register(struct backing_dev_info *bdi, struct device *parent,
                const char *fmt, ...);
 int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev);
-int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner);
 int __must_check bdi_setup_and_register(struct backing_dev_info *, char *);
 void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages,
                        enum wb_reason reason);
index d9ec4976f5f171cedf6b30627e4f6c8e1f8118b3..000e7b3b9896f2a9479687befd2442c43193614e 100644 (file)
@@ -332,20 +332,6 @@ int bdi_register_dev(struct backing_dev_info *bdi, dev_t dev)
 }
 EXPORT_SYMBOL(bdi_register_dev);
 
-int bdi_register_owner(struct backing_dev_info *bdi, struct device *owner)
-{
-       int rc;
-
-       rc = bdi_register(bdi, NULL, "%u:%u", MAJOR(owner->devt),
-                         MINOR(owner->devt));
-       if (rc)
-               return rc;
-       bdi->owner = owner;
-       get_device(owner);
-       return 0;
-}
-EXPORT_SYMBOL(bdi_register_owner);
-
 /*
  * Remove bdi from the global list and shutdown any threads we have running
  */
@@ -451,11 +437,6 @@ void bdi_destroy(struct backing_dev_info *bdi)
                bdi->dev = NULL;
        }
 
-       if (bdi->owner) {
-               put_device(bdi->owner);
-               bdi->owner = NULL;
-       }
-
        for (i = 0; i < NR_BDI_STAT_ITEMS; i++)
                percpu_counter_destroy(&bdi->bdi_stat[i]);
        fprop_local_destroy_percpu(&bdi->completions);