|
@@ -46,8 +46,7 @@
|
|
|
|
|
|
#include "mtdcore.h"
|
|
#include "mtdcore.h"
|
|
|
|
|
|
-static struct backing_dev_info mtd_bdi = {
|
|
|
|
-};
|
|
|
|
|
|
+static struct backing_dev_info *mtd_bdi;
|
|
|
|
|
|
#ifdef CONFIG_PM_SLEEP
|
|
#ifdef CONFIG_PM_SLEEP
|
|
|
|
|
|
@@ -500,7 +499,7 @@ int add_mtd_device(struct mtd_info *mtd)
|
|
if (WARN_ONCE(mtd->backing_dev_info, "MTD already registered\n"))
|
|
if (WARN_ONCE(mtd->backing_dev_info, "MTD already registered\n"))
|
|
return -EEXIST;
|
|
return -EEXIST;
|
|
|
|
|
|
- mtd->backing_dev_info = &mtd_bdi;
|
|
|
|
|
|
+ mtd->backing_dev_info = mtd_bdi;
|
|
|
|
|
|
BUG_ON(mtd->writesize == 0);
|
|
BUG_ON(mtd->writesize == 0);
|
|
mutex_lock(&mtd_table_mutex);
|
|
mutex_lock(&mtd_table_mutex);
|
|
@@ -1771,18 +1770,20 @@ static const struct file_operations mtd_proc_ops = {
|
|
/*====================================================================*/
|
|
/*====================================================================*/
|
|
/* Init code */
|
|
/* Init code */
|
|
|
|
|
|
-static int __init mtd_bdi_init(struct backing_dev_info *bdi, const char *name)
|
|
|
|
|
|
+static struct backing_dev_info * __init mtd_bdi_init(char *name)
|
|
{
|
|
{
|
|
|
|
+ struct backing_dev_info *bdi;
|
|
int ret;
|
|
int ret;
|
|
|
|
|
|
- ret = bdi_init(bdi);
|
|
|
|
- if (!ret)
|
|
|
|
- ret = bdi_register(bdi, NULL, "%s", name);
|
|
|
|
|
|
+ bdi = kzalloc(sizeof(*bdi), GFP_KERNEL);
|
|
|
|
+ if (!bdi)
|
|
|
|
+ return ERR_PTR(-ENOMEM);
|
|
|
|
|
|
|
|
+ ret = bdi_setup_and_register(bdi, name);
|
|
if (ret)
|
|
if (ret)
|
|
- bdi_destroy(bdi);
|
|
|
|
|
|
+ kfree(bdi);
|
|
|
|
|
|
- return ret;
|
|
|
|
|
|
+ return ret ? ERR_PTR(ret) : bdi;
|
|
}
|
|
}
|
|
|
|
|
|
static struct proc_dir_entry *proc_mtd;
|
|
static struct proc_dir_entry *proc_mtd;
|
|
@@ -1795,9 +1796,11 @@ static int __init init_mtd(void)
|
|
if (ret)
|
|
if (ret)
|
|
goto err_reg;
|
|
goto err_reg;
|
|
|
|
|
|
- ret = mtd_bdi_init(&mtd_bdi, "mtd");
|
|
|
|
- if (ret)
|
|
|
|
|
|
+ mtd_bdi = mtd_bdi_init("mtd");
|
|
|
|
+ if (IS_ERR(mtd_bdi)) {
|
|
|
|
+ ret = PTR_ERR(mtd_bdi);
|
|
goto err_bdi;
|
|
goto err_bdi;
|
|
|
|
+ }
|
|
|
|
|
|
proc_mtd = proc_create("mtd", 0, NULL, &mtd_proc_ops);
|
|
proc_mtd = proc_create("mtd", 0, NULL, &mtd_proc_ops);
|
|
|
|
|
|
@@ -1810,6 +1813,8 @@ static int __init init_mtd(void)
|
|
out_procfs:
|
|
out_procfs:
|
|
if (proc_mtd)
|
|
if (proc_mtd)
|
|
remove_proc_entry("mtd", NULL);
|
|
remove_proc_entry("mtd", NULL);
|
|
|
|
+ bdi_destroy(mtd_bdi);
|
|
|
|
+ kfree(mtd_bdi);
|
|
err_bdi:
|
|
err_bdi:
|
|
class_unregister(&mtd_class);
|
|
class_unregister(&mtd_class);
|
|
err_reg:
|
|
err_reg:
|
|
@@ -1823,7 +1828,8 @@ static void __exit cleanup_mtd(void)
|
|
if (proc_mtd)
|
|
if (proc_mtd)
|
|
remove_proc_entry("mtd", NULL);
|
|
remove_proc_entry("mtd", NULL);
|
|
class_unregister(&mtd_class);
|
|
class_unregister(&mtd_class);
|
|
- bdi_destroy(&mtd_bdi);
|
|
|
|
|
|
+ bdi_destroy(mtd_bdi);
|
|
|
|
+ kfree(mtd_bdi);
|
|
idr_destroy(&mtd_idr);
|
|
idr_destroy(&mtd_idr);
|
|
}
|
|
}
|
|
|
|
|