#include "mtdcore.h"
 
-static struct backing_dev_info *mtd_bdi;
+struct backing_dev_info *mtd_bdi;
 
 #ifdef CONFIG_PM_SLEEP
 
         * mtd_device_parse_register() multiple times on the same master MTD,
         * especially with CONFIG_MTD_PARTITIONED_MASTER=y.
         */
-       if (WARN_ONCE(mtd->backing_dev_info, "MTD already registered\n"))
+       if (WARN_ONCE(mtd->dev.type, "MTD already registered\n"))
                return -EEXIST;
 
-       mtd->backing_dev_info = mtd_bdi;
-
        BUG_ON(mtd->writesize == 0);
        mutex_lock(&mtd_table_mutex);
 
        struct backing_dev_info *bdi;
        int ret;
 
-       bdi = kzalloc(sizeof(*bdi), GFP_KERNEL);
+       bdi = bdi_alloc(GFP_KERNEL);
        if (!bdi)
                return ERR_PTR(-ENOMEM);
 
-       ret = bdi_setup_and_register(bdi, name);
+       bdi->name = name;
+       /*
+        * We put '-0' suffix to the name to get the same name format as we
+        * used to get. Since this is called only once, we get a unique name. 
+        */
+       ret = bdi_register(bdi, NULL, "%.28s-0", name);
        if (ret)
-               kfree(bdi);
+               bdi_put(bdi);
 
        return ret ? ERR_PTR(ret) : bdi;
 }
 out_procfs:
        if (proc_mtd)
                remove_proc_entry("mtd", NULL);
-       bdi_destroy(mtd_bdi);
-       kfree(mtd_bdi);
+       bdi_put(mtd_bdi);
 err_bdi:
        class_unregister(&mtd_class);
 err_reg:
        if (proc_mtd)
                remove_proc_entry("mtd", NULL);
        class_unregister(&mtd_class);
-       bdi_destroy(mtd_bdi);
-       kfree(mtd_bdi);
+       bdi_put(mtd_bdi);
        idr_destroy(&mtd_idr);
 }
 
 
 #include <linux/ctype.h>
 #include <linux/slab.h>
 #include <linux/major.h>
+#include <linux/backing-dev.h>
 
 /*
  * compare superblocks to see if they're equivalent
        return 0;
 }
 
+extern struct backing_dev_info *mtd_bdi;
+
 /*
  * mark the superblock by the MTD device it is using
  * - set the device number to be the correct MTD block device for pesuperstence
 
        sb->s_mtd = mtd;
        sb->s_dev = MKDEV(MTD_BLOCK_MAJOR, mtd->index);
-       sb->s_bdi = mtd->backing_dev_info;
+       sb->s_bdi = bdi_get(mtd_bdi);
+       sb->s_iflags |= SB_I_DYNBDI;
+
        return 0;
 }
 
 
        int (*_get_device) (struct mtd_info *mtd);
        void (*_put_device) (struct mtd_info *mtd);
 
-       /* Backing device capabilities for this device
-        * - provides mmap capabilities
-        */
-       struct backing_dev_info *backing_dev_info;
-
        struct notifier_block reboot_notifier;  /* default mode before reboot */
 
        /* ECC status information */