summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-06-14 18:23:00 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-06-14 18:23:00 -0400
commite7655d2b25466c534ed1f539367dae595bb0bd20 (patch)
treea6d6c0fdfdca3a960c6dda65e2cff7684027c4c7
parentd148eac0e70f06485dbd4cce6ed01cb07c650cec (diff)
parentac0b4145d662a3b9e34085dea460fb06ede9b69b (diff)
Merge tag 'for-4.18-part2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs fixes from David Sterba: - error handling fixup for one of the new ioctls from 1st pull - fix for device-replace that incorrectly uses inode pages and can mess up compressed extents in some cases - fiemap fix for reporting incorrect number of extents - vm_fault_t type conversion * tag 'for-4.18-part2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: btrfs: scrub: Don't use inode pages for device replace btrfs: change return type of btrfs_page_mkwrite to vm_fault_t Btrfs: fiemap: pass correct bytenr when fm_extent_count is zero btrfs: Check error of btrfs_iget in btrfs_search_path_in_tree_user
-rw-r--r--fs/btrfs/ctree.h2
-rw-r--r--fs/btrfs/extent_io.c4
-rw-r--r--fs/btrfs/inode.c26
-rw-r--r--fs/btrfs/ioctl.c4
-rw-r--r--fs/btrfs/scrub.c2
5 files changed, 19 insertions, 19 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);
3199void btrfs_set_range_writeback(void *private_data, u64 start, u64 end); 3199void btrfs_set_range_writeback(void *private_data, u64 start, u64 end);
3200int btrfs_page_mkwrite(struct vm_fault *vmf); 3200vm_fault_t btrfs_page_mkwrite(struct vm_fault *vmf);
3201int btrfs_readpage(struct file *file, struct page *page); 3201int btrfs_readpage(struct file *file, struct page *page);
3202void btrfs_evict_inode(struct inode *inode); 3202void btrfs_evict_inode(struct inode *inode);
3203int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc); 3203int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc);
diff --git a/fs/btrfs/extent_io.c b/fs/btrfs/extent_io.c
index 51fc015c7d2c..cce6087d6880 100644
--- a/fs/btrfs/extent_io.c
+++ b/fs/btrfs/extent_io.c
@@ -4542,7 +4542,7 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
4542 offset_in_extent = em_start - em->start; 4542 offset_in_extent = em_start - em->start;
4543 em_end = extent_map_end(em); 4543 em_end = extent_map_end(em);
4544 em_len = em_end - em_start; 4544 em_len = em_end - em_start;
4545 disko = 0; 4545 disko = em->block_start + offset_in_extent;
4546 flags = 0; 4546 flags = 0;
4547 4547
4548 /* 4548 /*
@@ -4565,8 +4565,6 @@ int extent_fiemap(struct inode *inode, struct fiemap_extent_info *fieinfo,
4565 u64 bytenr = em->block_start - 4565 u64 bytenr = em->block_start -
4566 (em->start - em->orig_start); 4566 (em->start - em->orig_start);
4567 4567
4568 disko = em->block_start + offset_in_extent;
4569
4570 /* 4568 /*
4571 * As btrfs supports shared space, this information 4569 * As btrfs supports shared space, this information
4572 * can be exported to userspace tools via 4570 * can be exported to userspace tools via
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 */
8875int btrfs_page_mkwrite(struct vm_fault *vmf) 8875vm_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
9010out_unlock: 9008out_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);
diff --git a/fs/btrfs/ioctl.c b/fs/btrfs/ioctl.c
index d29992f7dc63..5556e9ea2a4b 100644
--- a/fs/btrfs/ioctl.c
+++ b/fs/btrfs/ioctl.c
@@ -2438,6 +2438,10 @@ static int btrfs_search_path_in_tree_user(struct inode *inode,
2438 } 2438 }
2439 2439
2440 temp_inode = btrfs_iget(sb, &key2, root, NULL); 2440 temp_inode = btrfs_iget(sb, &key2, root, NULL);
2441 if (IS_ERR(temp_inode)) {
2442 ret = PTR_ERR(temp_inode);
2443 goto out;
2444 }
2441 ret = inode_permission(temp_inode, MAY_READ | MAY_EXEC); 2445 ret = inode_permission(temp_inode, MAY_READ | MAY_EXEC);
2442 iput(temp_inode); 2446 iput(temp_inode);
2443 if (ret) { 2447 if (ret) {
diff --git a/fs/btrfs/scrub.c b/fs/btrfs/scrub.c
index a59005862010..572306036477 100644
--- a/fs/btrfs/scrub.c
+++ b/fs/btrfs/scrub.c
@@ -2799,7 +2799,7 @@ static int scrub_extent(struct scrub_ctx *sctx, struct map_lookup *map,
2799 have_csum = scrub_find_csum(sctx, logical, csum); 2799 have_csum = scrub_find_csum(sctx, logical, csum);
2800 if (have_csum == 0) 2800 if (have_csum == 0)
2801 ++sctx->stat.no_csum; 2801 ++sctx->stat.no_csum;
2802 if (sctx->is_dev_replace && !have_csum) { 2802 if (0 && sctx->is_dev_replace && !have_csum) {
2803 ret = copy_nocow_pages(sctx, logical, l, 2803 ret = copy_nocow_pages(sctx, logical, l,
2804 mirror_num, 2804 mirror_num,
2805 physical_for_dev_replace); 2805 physical_for_dev_replace);