diff options
-rw-r--r-- | block/genhd.c | 2 | ||||
-rw-r--r-- | include/linux/backing-dev.h | 2 | ||||
-rw-r--r-- | mm/backing-dev.c | 19 |
3 files changed, 22 insertions, 1 deletions
diff --git a/block/genhd.c b/block/genhd.c index 38d4ba122a43..548e9e698610 100644 --- a/block/genhd.c +++ b/block/genhd.c @@ -611,7 +611,7 @@ void add_disk(struct gendisk *disk) /* Register BDI before referencing it from bdev */ bdi = &disk->queue->backing_dev_info; - bdi_register_dev(bdi, disk_devt(disk)); + bdi_register_owner(bdi, disk_to_dev(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 e488e9459a93..f0069a94d9cc 100644 --- a/include/linux/backing-dev.h +++ b/include/linux/backing-dev.h @@ -100,6 +100,7 @@ struct backing_dev_info { struct list_head work_list; struct device *dev; + struct device *owner; struct timer_list laptop_mode_wb_timer; @@ -116,6 +117,7 @@ __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); void bdi_unregister(struct backing_dev_info *bdi); int __must_check bdi_setup_and_register(struct backing_dev_info *, char *, unsigned int); void bdi_start_writeback(struct backing_dev_info *bdi, long nr_pages, diff --git a/mm/backing-dev.c b/mm/backing-dev.c index afc8593327d6..5df7b79513ea 100644 --- a/mm/backing-dev.c +++ b/mm/backing-dev.c @@ -350,6 +350,20 @@ 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 */ @@ -418,6 +432,11 @@ void bdi_unregister(struct backing_dev_info *bdi) device_unregister(dev); } + + if (bdi->owner) { + put_device(bdi->owner); + bdi->owner = NULL; + } } EXPORT_SYMBOL(bdi_unregister); |