diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-14 18:23:00 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2018-06-14 18:23:00 -0400 |
commit | e7655d2b25466c534ed1f539367dae595bb0bd20 (patch) | |
tree | a6d6c0fdfdca3a960c6dda65e2cff7684027c4c7 | |
parent | d148eac0e70f06485dbd4cce6ed01cb07c650cec (diff) | |
parent | ac0b4145d662a3b9e34085dea460fb06ede9b69b (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.h | 2 | ||||
-rw-r--r-- | fs/btrfs/extent_io.c | 4 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 26 | ||||
-rw-r--r-- | fs/btrfs/ioctl.c | 4 | ||||
-rw-r--r-- | fs/btrfs/scrub.c | 2 |
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); |
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/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 | */ |
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); |
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); |