From: Ashish Samant Date: Sat, 24 Nov 2018 22:04:13 +0000 (-0800) Subject: Revert commit 8bd274934987 ("block: fix bdi vs gendisk lifetime mismatch") X-Git-Tag: v4.1.12-124.31.3~394 X-Git-Url: https://www.infradead.org/git/?a=commitdiff_plain;h=cdd844fd90aa1f9724858de0aa6e06c0774a0212;p=users%2Fjedix%2Flinux-maple.git Revert commit 8bd274934987 ("block: fix bdi vs gendisk lifetime mismatch") 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 Reviewed-by: Jianchao Wang Reviewed-by: Shan Hai Signed-off-by: Brian Maly --- diff --git a/block/genhd.c b/block/genhd.c index 24fcb43e61ee..60db28598670 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -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); diff --git a/include/linux/backing-dev.h b/include/linux/backing-dev.h index 3cf1f7409a7c..d87d8eced064 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -19,7 +19,6 @@ #include #include #include -#include 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); diff --git a/mm/backing-dev.c b/mm/backing-dev.c index d9ec4976f5f1..000e7b3b9896 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -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);