struct page **pages,
                         size_t num_pages,
                         loff_t pos,
+                        unsigned long first_index,
+                        unsigned long last_index,
                         size_t write_bytes)
 {
        int i;
                }
                offset = pos & (PAGE_CACHE_SIZE -1);
                this_write = min(PAGE_CACHE_SIZE - offset, write_bytes);
+               if (!PageUptodate(pages[i]) &&
+                  (pages[i]->index == first_index ||
+                   pages[i]->index == last_index) && pos < isize) {
+                       ret = mpage_readpage(pages[i], btrfs_get_block);
+                       BUG_ON(ret);
+                       lock_page(pages[i]);
+               }
                ret = nobh_prepare_write(pages[i], offset,
                                         offset + this_write,
                                         btrfs_get_block);
        struct inode *inode = file->f_path.dentry->d_inode;
        struct btrfs_root *root = BTRFS_I(inode)->root;
        struct page *pages[1];
+       unsigned long first_index;
+       unsigned long last_index;
 
        if (file->f_flags & O_DIRECT)
                return -EINVAL;
                goto out;
        file_update_time(file);
        mutex_lock(&inode->i_mutex);
+       first_index = pos >> PAGE_CACHE_SHIFT;
+       last_index = (pos + count) >> PAGE_CACHE_SHIFT;
        while(count > 0) {
                size_t offset = pos & (PAGE_CACHE_SIZE - 1);
                size_t write_bytes = min(count, PAGE_CACHE_SIZE - offset);
                size_t num_pages = (write_bytes + PAGE_CACHE_SIZE - 1) >>
                                        PAGE_CACHE_SHIFT;
                ret = prepare_pages(NULL, root, file, pages, num_pages,
-                                   pos, write_bytes);
+                                   pos, first_index, last_index, write_bytes);
                BUG_ON(ret);
                ret = btrfs_copy_from_user(pos, num_pages,
                                           write_bytes, pages, buf);