diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 12 |
1 files changed, 9 insertions, 3 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 1cff528d5b51..06d8db5afb08 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -4365,8 +4365,9 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
4365 | * beyond EOF, then the page is guaranteed safe against truncation until we | 4365 | * beyond EOF, then the page is guaranteed safe against truncation until we |
4366 | * unlock the page. | 4366 | * unlock the page. |
4367 | */ | 4367 | */ |
4368 | int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page) | 4368 | int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) |
4369 | { | 4369 | { |
4370 | struct page *page = vmf->page; | ||
4370 | struct inode *inode = fdentry(vma->vm_file)->d_inode; | 4371 | struct inode *inode = fdentry(vma->vm_file)->d_inode; |
4371 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4372 | struct btrfs_root *root = BTRFS_I(inode)->root; |
4372 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 4373 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
@@ -4379,10 +4380,15 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page) | |||
4379 | u64 page_end; | 4380 | u64 page_end; |
4380 | 4381 | ||
4381 | ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE); | 4382 | ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE); |
4382 | if (ret) | 4383 | if (ret) { |
4384 | if (ret == -ENOMEM) | ||
4385 | ret = VM_FAULT_OOM; | ||
4386 | else /* -ENOSPC, -EIO, etc */ | ||
4387 | ret = VM_FAULT_SIGBUS; | ||
4383 | goto out; | 4388 | goto out; |
4389 | } | ||
4384 | 4390 | ||
4385 | ret = -EINVAL; | 4391 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ |
4386 | again: | 4392 | again: |
4387 | lock_page(page); | 4393 | lock_page(page); |
4388 | size = i_size_read(inode); | 4394 | size = i_size_read(inode); |