mutex_lock(&inode->i_mutex);
 
-       current->backing_dev_info = inode->i_mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
        if (err) {
                mutex_unlock(&inode->i_mutex);
 
        mutex_lock(&inode->i_mutex);
 
        /* We can write back this queue in page reclaim */
-       current->backing_dev_info = file->f_mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
 
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
        if (err)
 
        struct ext2_group_desc * gdp;
        struct backing_dev_info *bdi;
 
-       bdi = inode->i_mapping->backing_dev_info;
+       bdi = inode_to_bdi(inode);
        if (bdi_read_congested(bdi))
                return;
        if (bdi_write_congested(bdi))
 
 static int block_device_ejected(struct super_block *sb)
 {
        struct inode *bd_inode = sb->s_bdev->bd_inode;
-       struct backing_dev_info *bdi = bd_inode->i_mapping->backing_dev_info;
+       struct backing_dev_info *bdi = inode_to_bdi(bd_inode);
 
        return bdi->dev == NULL;
 }
 
 }
 EXPORT_SYMBOL(writeback_in_progress);
 
-static inline struct backing_dev_info *inode_to_bdi(struct inode *inode)
+struct backing_dev_info *inode_to_bdi(struct inode *inode)
 {
        struct super_block *sb = inode->i_sb;
 #ifdef CONFIG_BLOCK
 #endif
        return sb->s_bdi;
 }
+EXPORT_SYMBOL_GPL(inode_to_bdi);
 
 static inline struct inode *wb_inode(struct list_head *head)
 {
 
        mutex_lock(&inode->i_mutex);
 
        /* We can write back this queue in page reclaim */
-       current->backing_dev_info = mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
 
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
        if (err)
 {
        struct inode *inode = req->inode;
        struct fuse_inode *fi = get_fuse_inode(inode);
-       struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info;
+       struct backing_dev_info *bdi = inode_to_bdi(inode);
        int i;
 
        list_del(&req->writepages_entry);
        req->end = fuse_writepage_end;
        req->inode = inode;
 
-       inc_bdi_stat(mapping->backing_dev_info, BDI_WRITEBACK);
+       inc_bdi_stat(inode_to_bdi(inode), BDI_WRITEBACK);
        inc_zone_page_state(tmp_page, NR_WRITEBACK_TEMP);
 
        spin_lock(&fc->lock);
 
        if (old_req->num_pages == 1 && (old_req->state == FUSE_REQ_INIT ||
                                        old_req->state == FUSE_REQ_PENDING)) {
-               struct backing_dev_info *bdi = page->mapping->backing_dev_info;
+               struct backing_dev_info *bdi = inode_to_bdi(page->mapping->host);
 
                copy_highpage(old_req->pages[0], page);
                spin_unlock(&fc->lock);
        req->page_descs[req->num_pages].offset = 0;
        req->page_descs[req->num_pages].length = PAGE_SIZE;
 
-       inc_bdi_stat(page->mapping->backing_dev_info, BDI_WRITEBACK);
+       inc_bdi_stat(inode_to_bdi(inode), BDI_WRITEBACK);
        inc_zone_page_state(tmp_page, NR_WRITEBACK_TEMP);
 
        err = 0;
 
                if (!clear_page_dirty_for_io(page))
                        goto continue_unlock;
 
-               trace_wbc_writepage(wbc, mapping->backing_dev_info);
+               trace_wbc_writepage(wbc, inode_to_bdi(inode));
 
                ret = __gfs2_jdata_writepage(page, wbc);
                if (unlikely(ret)) {
 
        struct gfs2_inode *ip = GFS2_I(inode);
        struct gfs2_sbd *sdp = GFS2_SB(inode);
        struct address_space *metamapping = gfs2_glock2aspace(ip->i_gl);
-       struct backing_dev_info *bdi = metamapping->backing_dev_info;
+       struct backing_dev_info *bdi = inode_to_bdi(metamapping->host);
        int ret = 0;
 
        if (wbc->sync_mode == WB_SYNC_ALL)
 
        spin_unlock(cinfo->lock);
        if (!cinfo->dreq) {
                inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
-               inc_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
+               inc_bdi_stat(inode_to_bdi(page_file_mapping(req->wb_page)->host),
                             BDI_RECLAIMABLE);
                __mark_inode_dirty(req->wb_context->dentry->d_inode,
                                   I_DIRTY_DATASYNC);
 
        spin_unlock(cinfo->lock);
        if (!cinfo->dreq) {
                inc_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
-               inc_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
+               inc_bdi_stat(inode_to_bdi(page_file_mapping(req->wb_page)->host),
                             BDI_RECLAIMABLE);
                __mark_inode_dirty(req->wb_context->dentry->d_inode,
                                   I_DIRTY_DATASYNC);
 nfs_clear_page_commit(struct page *page)
 {
        dec_zone_page_state(page, NR_UNSTABLE_NFS);
-       dec_bdi_stat(page_file_mapping(page)->backing_dev_info, BDI_RECLAIMABLE);
+       dec_bdi_stat(inode_to_bdi(page_file_mapping(page)->host), BDI_RECLAIMABLE);
 }
 
 /* Called holding inode (/cinfo) lock */
                nfs_mark_request_commit(req, lseg, cinfo);
                if (!cinfo->dreq) {
                        dec_zone_page_state(req->wb_page, NR_UNSTABLE_NFS);
-                       dec_bdi_stat(page_file_mapping(req->wb_page)->backing_dev_info,
+                       dec_bdi_stat(inode_to_bdi(page_file_mapping(req->wb_page)->host),
                                     BDI_RECLAIMABLE);
                }
                nfs_unlock_and_release_request(req);
 
  * Foundation,Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
  */
 
+#include <linux/backing-dev.h>
 #include <linux/buffer_head.h>
 #include <linux/gfp.h>
 #include <linux/pagemap.h>
        count = iov_length(iov, nr_segs);
        pos = *ppos;
        /* We can write back this queue in page reclaim. */
-       current->backing_dev_info = mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
        written = 0;
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
        if (err)
 
                        goto out_dio;
                }
        } else {
-               current->backing_dev_info = file->f_mapping->backing_dev_info;
+               current->backing_dev_info = inode_to_bdi(inode);
                written = generic_perform_write(file, from, *ppos);
                if (likely(written >= 0))
                        iocb->ki_pos = *ppos + written;
 
 
        iov_iter_truncate(from, count);
        /* We can write back this queue in page reclaim */
-       current->backing_dev_info = mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
 
 write_retry:
        trace_xfs_file_buffered_write(ip, count, iocb->ki_pos, 0);
 
 #endif
 };
 
+struct backing_dev_info *inode_to_bdi(struct inode *inode);
+
 int __must_check bdi_init(struct backing_dev_info *bdi);
 void bdi_destroy(struct backing_dev_info *bdi);
 
 
 static inline bool mapping_cap_writeback_dirty(struct address_space *mapping)
 {
-       return bdi_cap_writeback_dirty(mapping->backing_dev_info);
+       return bdi_cap_writeback_dirty(inode_to_bdi(mapping->host));
 }
 
 static inline bool mapping_cap_account_dirty(struct address_space *mapping)
 {
-       return bdi_cap_account_dirty(mapping->backing_dev_info);
+       return bdi_cap_account_dirty(inode_to_bdi(mapping->host));
 }
 
 static inline int bdi_sched_wait(void *word)
 
 
        TP_fast_assign(
                strncpy(__entry->name,
-                       mapping ? dev_name(mapping->backing_dev_info->dev) : "(unknown)", 32);
+                       mapping ? dev_name(inode_to_bdi(mapping->host)->dev) : "(unknown)", 32);
                __entry->ino = mapping ? mapping->host->i_ino : 0;
                __entry->index = page->index;
        ),
        ),
 
        TP_fast_assign(
-               struct backing_dev_info *bdi = inode->i_mapping->backing_dev_info;
+               struct backing_dev_info *bdi = inode_to_bdi(inode);
 
                /* may be called for files on pseudo FSes w/ unregistered bdi */
                strncpy(__entry->name,
 
        TP_fast_assign(
                strncpy(__entry->name,
-                       dev_name(inode->i_mapping->backing_dev_info->dev), 32);
+                       dev_name(inode_to_bdi(inode)->dev), 32);
                __entry->ino            = inode->i_ino;
                __entry->sync_mode      = wbc->sync_mode;
        ),
 
        else
                endbyte--;              /* inclusive */
 
-       bdi = mapping->backing_dev_info;
+       bdi = inode_to_bdi(mapping->host);
 
        switch (advice) {
        case POSIX_FADV_NORMAL:
        case POSIX_FADV_NOREUSE:
                break;
        case POSIX_FADV_DONTNEED:
-               if (!bdi_write_congested(mapping->backing_dev_info))
+               if (!bdi_write_congested(bdi))
                        __filemap_fdatawrite_range(mapping, offset, endbyte,
                                                   WB_SYNC_NONE);
 
 
         */
        if (PageDirty(page) && mapping_cap_account_dirty(mapping)) {
                dec_zone_page_state(page, NR_FILE_DIRTY);
-               dec_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE);
+               dec_bdi_stat(inode_to_bdi(mapping->host), BDI_RECLAIMABLE);
        }
 }
 
        size_t          count = iov_iter_count(from);
 
        /* We can write back this queue in page reclaim */
-       current->backing_dev_info = mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
        err = generic_write_checks(file, &pos, &count, S_ISBLK(inode->i_mode));
        if (err)
                goto out;
 
  */
 
 #include <linux/fs.h>
+#include <linux/backing-dev.h>
 #include <linux/pagemap.h>
 #include <linux/export.h>
 #include <linux/uio.h>
        count = len;
 
        /* We can write back this queue in page reclaim */
-       current->backing_dev_info = mapping->backing_dev_info;
+       current->backing_dev_info = inode_to_bdi(inode);
 
        ret = generic_write_checks(filp, &pos, &count, S_ISBLK(inode->i_mode));
        if (ret)
 
        unsigned long task_ratelimit;
        unsigned long dirty_ratelimit;
        unsigned long pos_ratio;
-       struct backing_dev_info *bdi = mapping->backing_dev_info;
+       struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
        bool strictlimit = bdi->capabilities & BDI_CAP_STRICTLIMIT;
        unsigned long start_time = jiffies;
 
  */
 void balance_dirty_pages_ratelimited(struct address_space *mapping)
 {
-       struct backing_dev_info *bdi = mapping->backing_dev_info;
+       struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
        int ratelimit;
        int *p;
 
                        if (!clear_page_dirty_for_io(page))
                                goto continue_unlock;
 
-                       trace_wbc_writepage(wbc, mapping->backing_dev_info);
+                       trace_wbc_writepage(wbc, inode_to_bdi(mapping->host));
                        ret = (*writepage)(page, wbc, data);
                        if (unlikely(ret)) {
                                if (ret == AOP_WRITEPAGE_ACTIVATE) {
        trace_writeback_dirty_page(page, mapping);
 
        if (mapping_cap_account_dirty(mapping)) {
+               struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
+
                __inc_zone_page_state(page, NR_FILE_DIRTY);
                __inc_zone_page_state(page, NR_DIRTIED);
-               __inc_bdi_stat(mapping->backing_dev_info, BDI_RECLAIMABLE);
-               __inc_bdi_stat(mapping->backing_dev_info, BDI_DIRTIED);
+               __inc_bdi_stat(bdi, BDI_RECLAIMABLE);
+               __inc_bdi_stat(bdi, BDI_DIRTIED);
                task_io_account_write(PAGE_CACHE_SIZE);
                current->nr_dirtied++;
                this_cpu_inc(bdp_ratelimits);
        if (mapping && mapping_cap_account_dirty(mapping)) {
                current->nr_dirtied--;
                dec_zone_page_state(page, NR_DIRTIED);
-               dec_bdi_stat(mapping->backing_dev_info, BDI_DIRTIED);
+               dec_bdi_stat(inode_to_bdi(mapping->host), BDI_DIRTIED);
        }
 }
 EXPORT_SYMBOL(account_page_redirty);
                 */
                if (TestClearPageDirty(page)) {
                        dec_zone_page_state(page, NR_FILE_DIRTY);
-                       dec_bdi_stat(mapping->backing_dev_info,
+                       dec_bdi_stat(inode_to_bdi(mapping->host),
                                        BDI_RECLAIMABLE);
                        return 1;
                }
 
        memcg = mem_cgroup_begin_page_stat(page, &locked, &memcg_flags);
        if (mapping) {
-               struct backing_dev_info *bdi = mapping->backing_dev_info;
+               struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
                unsigned long flags;
 
                spin_lock_irqsave(&mapping->tree_lock, flags);
 
        memcg = mem_cgroup_begin_page_stat(page, &locked, &memcg_flags);
        if (mapping) {
-               struct backing_dev_info *bdi = mapping->backing_dev_info;
+               struct backing_dev_info *bdi = inode_to_bdi(mapping->host);
                unsigned long flags;
 
                spin_lock_irqsave(&mapping->tree_lock, flags);
  */
 void wait_for_stable_page(struct page *page)
 {
-       struct address_space *mapping = page_mapping(page);
-       struct backing_dev_info *bdi = mapping->backing_dev_info;
-
-       if (!bdi_cap_stable_pages_required(bdi))
-               return;
-
-       wait_on_page_writeback(page);
+       if (bdi_cap_stable_pages_required(inode_to_bdi(page->mapping->host)))
+               wait_on_page_writeback(page);
 }
 EXPORT_SYMBOL_GPL(wait_for_stable_page);
 
 void
 file_ra_state_init(struct file_ra_state *ra, struct address_space *mapping)
 {
-       ra->ra_pages = mapping->backing_dev_info->ra_pages;
+       ra->ra_pages = inode_to_bdi(mapping->host)->ra_pages;
        ra->prev_pos = -1;
 }
 EXPORT_SYMBOL_GPL(file_ra_state_init);
        /*
         * Defer asynchronous read-ahead on IO congestion.
         */
-       if (bdi_read_congested(mapping->backing_dev_info))
+       if (bdi_read_congested(inode_to_bdi(mapping->host)))
                return;
 
        /* do read-ahead */
 
                struct address_space *mapping = page->mapping;
                if (mapping && mapping_cap_account_dirty(mapping)) {
                        dec_zone_page_state(page, NR_FILE_DIRTY);
-                       dec_bdi_stat(mapping->backing_dev_info,
+                       dec_bdi_stat(inode_to_bdi(mapping->host),
                                        BDI_RECLAIMABLE);
                        if (account_size)
                                task_io_account_cancelled_write(account_size);
 
        }
        if (mapping->a_ops->writepage == NULL)
                return PAGE_ACTIVATE;
-       if (!may_write_to_queue(mapping->backing_dev_info, sc))
+       if (!may_write_to_queue(inode_to_bdi(mapping->host), sc))
                return PAGE_KEEP;
 
        if (clear_page_dirty_for_io(page)) {
                 */
                mapping = page_mapping(page);
                if (((dirty || writeback) && mapping &&
-                    bdi_write_congested(mapping->backing_dev_info)) ||
+                    bdi_write_congested(inode_to_bdi(mapping->host))) ||
                    (writeback && PageReclaim(page)))
                        nr_congested++;