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);