mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-29 11:11:45 -04:00
block: Dynamically allocate and refcount backing_dev_info
Instead of storing backing_dev_info inside struct request_queue, allocate it dynamically, reference count it, and free it when the last reference is dropped. Currently only request_queue holds the reference but in the following patch we add other users referencing backing_dev_info. Signed-off-by: Jan Kara <[email protected]> Signed-off-by: Jens Axboe <[email protected]>
This commit is contained in:
parent
dc3b17cc8b
commit
d03f6cdc1f
6 changed files with 50 additions and 11 deletions
|
|
@ -237,6 +237,7 @@ static __init int bdi_class_init(void)
|
|||
|
||||
bdi_class->dev_groups = bdi_dev_groups;
|
||||
bdi_debug_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
postcore_initcall(bdi_class_init);
|
||||
|
|
@ -776,6 +777,7 @@ int bdi_init(struct backing_dev_info *bdi)
|
|||
|
||||
bdi->dev = NULL;
|
||||
|
||||
kref_init(&bdi->refcnt);
|
||||
bdi->min_ratio = 0;
|
||||
bdi->max_ratio = 100;
|
||||
bdi->max_prop_frac = FPROP_FRAC_BASE;
|
||||
|
|
@ -791,6 +793,22 @@ int bdi_init(struct backing_dev_info *bdi)
|
|||
}
|
||||
EXPORT_SYMBOL(bdi_init);
|
||||
|
||||
struct backing_dev_info *bdi_alloc_node(gfp_t gfp_mask, int node_id)
|
||||
{
|
||||
struct backing_dev_info *bdi;
|
||||
|
||||
bdi = kmalloc_node(sizeof(struct backing_dev_info),
|
||||
gfp_mask | __GFP_ZERO, node_id);
|
||||
if (!bdi)
|
||||
return NULL;
|
||||
|
||||
if (bdi_init(bdi)) {
|
||||
kfree(bdi);
|
||||
return NULL;
|
||||
}
|
||||
return bdi;
|
||||
}
|
||||
|
||||
int bdi_register(struct backing_dev_info *bdi, struct device *parent,
|
||||
const char *fmt, ...)
|
||||
{
|
||||
|
|
@ -871,12 +889,26 @@ void bdi_unregister(struct backing_dev_info *bdi)
|
|||
}
|
||||
}
|
||||
|
||||
void bdi_exit(struct backing_dev_info *bdi)
|
||||
static void bdi_exit(struct backing_dev_info *bdi)
|
||||
{
|
||||
WARN_ON_ONCE(bdi->dev);
|
||||
wb_exit(&bdi->wb);
|
||||
}
|
||||
|
||||
static void release_bdi(struct kref *ref)
|
||||
{
|
||||
struct backing_dev_info *bdi =
|
||||
container_of(ref, struct backing_dev_info, refcnt);
|
||||
|
||||
bdi_exit(bdi);
|
||||
kfree(bdi);
|
||||
}
|
||||
|
||||
void bdi_put(struct backing_dev_info *bdi)
|
||||
{
|
||||
kref_put(&bdi->refcnt, release_bdi);
|
||||
}
|
||||
|
||||
void bdi_destroy(struct backing_dev_info *bdi)
|
||||
{
|
||||
bdi_unregister(bdi);
|
||||
|
|
|
|||
Loading…
Reference in a new issue