diff options
-rw-r--r-- | fs/btrfs/ctree.h | 2 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 26 |
2 files changed, 13 insertions, 15 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h index f4bf7874c24a..118346aceea9 100644 --- a/fs/btrfs/ctree.h +++ b/fs/btrfs/ctree.h | |||
@@ -3197,7 +3197,7 @@ int btrfs_merge_bio_hook(struct page *page, unsigned long offset, | |||
3197 | size_t size, struct bio *bio, | 3197 | size_t size, struct bio *bio, |
3198 | unsigned long bio_flags); | 3198 | unsigned long bio_flags); |
3199 | void btrfs_set_range_writeback(void *private_data, u64 start, u64 end); | 3199 | void btrfs_set_range_writeback(void *private_data, u64 start, u64 end); |
3200 | int btrfs_page_mkwrite(struct vm_fault *vmf); | 3200 | vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf); |
3201 | int btrfs_readpage(struct file *file, struct page *page); | 3201 | int btrfs_readpage(struct file *file, struct page *page); |
3202 | void btrfs_evict_inode(struct inode *inode); | 3202 | void btrfs_evict_inode(struct inode *inode); |
3203 | int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); | 3203 | int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); |
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 89b208201783..c12b7a6e534a 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -8872,7 +8872,7 @@ again: | |||
8872 | * beyond EOF, then the page is guaranteed safe against truncation until we | 8872 | * beyond EOF, then the page is guaranteed safe against truncation until we |
8873 | * unlock the page. | 8873 | * unlock the page. |
8874 | */ | 8874 | */ |
8875 | int btrfs_page_mkwrite(struct vm_fault *vmf) | 8875 | vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf) |
8876 | { | 8876 | { |
8877 | struct page *page = vmf->page; | 8877 | struct page *page = vmf->page; |
8878 | struct inode *inode = file_inode(vmf->vma->vm_file); | 8878 | struct inode *inode = file_inode(vmf->vma->vm_file); |
@@ -8884,7 +8884,8 @@ int btrfs_page_mkwrite(struct vm_fault *vmf) | |||
8884 | char *kaddr; | 8884 | char *kaddr; |
8885 | unsigned long zero_start; | 8885 | unsigned long zero_start; |
8886 | loff_t size; | 8886 | loff_t size; |
8887 | int ret; | 8887 | vm_fault_t ret; |
8888 | int ret2; | ||
8888 | int reserved = 0; | 8889 | int reserved = 0; |
8889 | u64 reserved_space; | 8890 | u64 reserved_space; |
8890 | u64 page_start; | 8891 | u64 page_start; |
@@ -8906,17 +8907,14 @@ int btrfs_page_mkwrite(struct vm_fault *vmf) | |||
8906 | * end up waiting indefinitely to get a lock on the page currently | 8907 | * end up waiting indefinitely to get a lock on the page currently |
8907 | * being processed by btrfs_page_mkwrite() function. | 8908 | * being processed by btrfs_page_mkwrite() function. |
8908 | */ | 8909 | */ |
8909 | ret = btrfs_delalloc_reserve_space(inode, &data_reserved, page_start, | 8910 | ret2 = btrfs_delalloc_reserve_space(inode, &data_reserved, page_start, |
8910 | reserved_space); | 8911 | reserved_space); |
8911 | if (!ret) { | 8912 | if (!ret2) { |
8912 | ret = file_update_time(vmf->vma->vm_file); | 8913 | ret2 = file_update_time(vmf->vma->vm_file); |
8913 | reserved = 1; | 8914 | reserved = 1; |
8914 | } | 8915 | } |
8915 | if (ret) { | 8916 | if (ret2) { |
8916 | if (ret == -ENOMEM) | 8917 | ret = vmf_error(ret2); |
8917 | ret = VM_FAULT_OOM; | ||
8918 | else /* -ENOSPC, -EIO, etc */ | ||
8919 | ret = VM_FAULT_SIGBUS; | ||
8920 | if (reserved) | 8918 | if (reserved) |
8921 | goto out; | 8919 | goto out; |
8922 | goto out_noreserve; | 8920 | goto out_noreserve; |
@@ -8975,15 +8973,15 @@ again: | |||
8975 | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, | 8973 | EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, |
8976 | 0, 0, &cached_state); | 8974 | 0, 0, &cached_state); |
8977 | 8975 | ||
8978 | ret = btrfs_set_extent_delalloc(inode, page_start, end, 0, | 8976 | ret2 = btrfs_set_extent_delalloc(inode, page_start, end, 0, |
8979 | &cached_state, 0); | 8977 | &cached_state, 0); |
8980 | if (ret) { | 8978 | if (ret2) { |
8981 | unlock_extent_cached(io_tree, page_start, page_end, | 8979 | unlock_extent_cached(io_tree, page_start, page_end, |
8982 | &cached_state); | 8980 | &cached_state); |
8983 | ret = VM_FAULT_SIGBUS; | 8981 | ret = VM_FAULT_SIGBUS; |
8984 | goto out_unlock; | 8982 | goto out_unlock; |
8985 | } | 8983 | } |
8986 | ret = 0; | 8984 | ret2 = 0; |
8987 | 8985 | ||
8988 | /* page is wholly or partially inside EOF */ | 8986 | /* page is wholly or partially inside EOF */ |
8989 | if (page_start + PAGE_SIZE > size) | 8987 | if (page_start + PAGE_SIZE > size) |
@@ -9008,7 +9006,7 @@ again: | |||
9008 | unlock_extent_cached(io_tree, page_start, page_end, &cached_state); | 9006 | unlock_extent_cached(io_tree, page_start, page_end, &cached_state); |
9009 | 9007 | ||
9010 | out_unlock: | 9008 | out_unlock: |
9011 | if (!ret) { | 9009 | if (!ret2) { |
9012 | btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, true); | 9010 | btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, true); |
9013 | sb_end_pagefault(inode->i_sb); | 9011 | sb_end_pagefault(inode->i_sb); |
9014 | extent_changeset_free(data_reserved); | 9012 | extent_changeset_free(data_reserved); |