if (unlikely(ret < 0))
                goto out_unlock;
        set_page_dirty(page);
-       wait_on_page_writeback(page);
+       wait_for_stable_page(page);
        return 0;
 out_unlock:
        unlock_page(page);
 
                                            0, len, NULL,
                                            ext4_bh_unmapped)) {
                        /* Wait so that we don't change page under IO */
-                       wait_on_page_writeback(page);
+                       wait_for_stable_page(page);
                        ret = VM_FAULT_LOCKED;
                        goto out;
                }
 
        gfs2_holder_uninit(&gh);
        if (ret == 0) {
                set_page_dirty(page);
-               wait_on_page_writeback(page);
+               wait_for_stable_page(page);
        }
        sb_end_pagefault(inode->i_sb);
        return block_page_mkwrite_return(ret);
 
        nilfs_transaction_commit(inode->i_sb);
 
  mapped:
-       wait_on_page_writeback(page);
+       wait_for_stable_page(page);
  out:
        sb_end_pagefault(inode->i_sb);
        return block_page_mkwrite_return(ret);
 
 }
 
 extern void end_page_writeback(struct page *page);
+void wait_for_stable_page(struct page *page);
 
 /*
  * Add an arbitrary waiter to a page's wait queue
 
         * see the dirty page and writeprotect it again.
         */
        set_page_dirty(page);
+       wait_for_stable_page(page);
 out:
        sb_end_pagefault(inode->i_sb);
        return ret;
                return NULL;
        }
 found:
-       wait_on_page_writeback(page);
+       wait_for_stable_page(page);
        return page;
 }
 EXPORT_SYMBOL(grab_cache_page_write_begin);
 
        return radix_tree_tagged(&mapping->page_tree, tag);
 }
 EXPORT_SYMBOL(mapping_tagged);
+
+/**
+ * wait_for_stable_page() - wait for writeback to finish, if necessary.
+ * @page:      The page to wait on.
+ *
+ * This function determines if the given page is related to a backing device
+ * that requires page contents to be held stable during writeback.  If so, then
+ * it will wait for any pending writeback to complete.
+ */
+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);
+}
+EXPORT_SYMBOL_GPL(wait_for_stable_page);