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 0ecb3fa75dc3..a0d1dd492a58 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -4368,8 +4368,9 @@ static void btrfs_invalidatepage(struct page *page, unsigned long offset) | |||
4368 | * beyond EOF, then the page is guaranteed safe against truncation until we | 4368 | * beyond EOF, then the page is guaranteed safe against truncation until we |
4369 | * unlock the page. | 4369 | * unlock the page. |
4370 | */ | 4370 | */ |
4371 | int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page) | 4371 | int btrfs_page_mkwrite(struct vm_area_struct *vma, struct vm_fault *vmf) |
4372 | { | 4372 | { |
4373 | struct page *page = vmf->page; | ||
4373 | struct inode *inode = fdentry(vma->vm_file)->d_inode; | 4374 | struct inode *inode = fdentry(vma->vm_file)->d_inode; |
4374 | struct btrfs_root *root = BTRFS_I(inode)->root; | 4375 | struct btrfs_root *root = BTRFS_I(inode)->root; |
4375 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; | 4376 | struct extent_io_tree *io_tree = &BTRFS_I(inode)->io_tree; |
@@ -4382,10 +4383,15 @@ int btrfs_page_mkwrite(struct vm_area_struct *vma, struct page *page) | |||
4382 | u64 page_end; | 4383 | u64 page_end; |
4383 | 4384 | ||
4384 | ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE); | 4385 | ret = btrfs_check_data_free_space(root, inode, PAGE_CACHE_SIZE); |
4385 | if (ret) | 4386 | if (ret) { |
4387 | if (ret == -ENOMEM) | ||
4388 | ret = VM_FAULT_OOM; | ||
4389 | else /* -ENOSPC, -EIO, etc */ | ||
4390 | ret = VM_FAULT_SIGBUS; | ||
4386 | goto out; | 4391 | goto out; |
4392 | } | ||
4387 | 4393 | ||
4388 | ret = -EINVAL; | 4394 | ret = VM_FAULT_NOPAGE; /* make the VM retry the fault */ |
4389 | again: | 4395 | again: |
4390 | lock_page(page); | 4396 | lock_page(page); |
4391 | size = i_size_read(inode); | 4397 | size = i_size_read(inode); |