Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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

+19 -19
+1 -1
fs/btrfs/ctree.h
··· 3197 3197 size_t size, struct bio *bio, 3198 3198 unsigned long bio_flags); 3199 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 3201 int btrfs_readpage(struct file *file, struct page *page); 3202 3202 void btrfs_evict_inode(struct inode *inode); 3203 3203 int btrfs_write_inode(struct inode *inode, struct writeback_control *wbc);
+1 -3
fs/btrfs/extent_io.c
··· 4542 4542 offset_in_extent = em_start - em->start; 4543 4543 em_end = extent_map_end(em); 4544 4544 em_len = em_end - em_start; 4545 - disko = 0; 4545 + disko = em->block_start + offset_in_extent; 4546 4546 flags = 0; 4547 4547 4548 4548 /* ··· 4564 4564 } else if (fieinfo->fi_extents_max) { 4565 4565 u64 bytenr = em->block_start - 4566 4566 (em->start - em->orig_start); 4567 - 4568 - disko = em->block_start + offset_in_extent; 4569 4567 4570 4568 /* 4571 4569 * As btrfs supports shared space, this information
+12 -14
fs/btrfs/inode.c
··· 8872 8872 * beyond EOF, then the page is guaranteed safe against truncation until we 8873 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 8877 struct page *page = vmf->page; 8878 8878 struct inode *inode = file_inode(vmf->vma->vm_file); ··· 8884 8884 char *kaddr; 8885 8885 unsigned long zero_start; 8886 8886 loff_t size; 8887 - int ret; 8887 + vm_fault_t ret; 8888 + int ret2; 8888 8889 int reserved = 0; 8889 8890 u64 reserved_space; 8890 8891 u64 page_start; ··· 8907 8906 * end up waiting indefinitely to get a lock on the page currently 8908 8907 * being processed by btrfs_page_mkwrite() function. 8909 8908 */ 8910 - ret = btrfs_delalloc_reserve_space(inode, &data_reserved, page_start, 8909 + ret2 = btrfs_delalloc_reserve_space(inode, &data_reserved, page_start, 8911 8910 reserved_space); 8912 - if (!ret) { 8913 - ret = file_update_time(vmf->vma->vm_file); 8911 + if (!ret2) { 8912 + ret2 = file_update_time(vmf->vma->vm_file); 8914 8913 reserved = 1; 8915 8914 } 8916 - if (ret) { 8917 - if (ret == -ENOMEM) 8918 - ret = VM_FAULT_OOM; 8919 - else /* -ENOSPC, -EIO, etc */ 8920 - ret = VM_FAULT_SIGBUS; 8915 + if (ret2) { 8916 + ret = vmf_error(ret2); 8921 8917 if (reserved) 8922 8918 goto out; 8923 8919 goto out_noreserve; ··· 8973 8975 EXTENT_DO_ACCOUNTING | EXTENT_DEFRAG, 8974 8976 0, 0, &cached_state); 8975 8977 8976 - ret = btrfs_set_extent_delalloc(inode, page_start, end, 0, 8978 + ret2 = btrfs_set_extent_delalloc(inode, page_start, end, 0, 8977 8979 &cached_state, 0); 8978 - if (ret) { 8980 + if (ret2) { 8979 8981 unlock_extent_cached(io_tree, page_start, page_end, 8980 8982 &cached_state); 8981 8983 ret = VM_FAULT_SIGBUS; 8982 8984 goto out_unlock; 8983 8985 } 8984 - ret = 0; 8986 + ret2 = 0; 8985 8987 8986 8988 /* page is wholly or partially inside EOF */ 8987 8989 if (page_start + PAGE_SIZE > size) ··· 9006 9008 unlock_extent_cached(io_tree, page_start, page_end, &cached_state); 9007 9009 9008 9010 out_unlock: 9009 - if (!ret) { 9011 + if (!ret2) { 9010 9012 btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, true); 9011 9013 sb_end_pagefault(inode->i_sb); 9012 9014 extent_changeset_free(data_reserved);
+4
fs/btrfs/ioctl.c
··· 2438 2438 } 2439 2439 2440 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 2445 ret = inode_permission(temp_inode, MAY_READ | MAY_EXEC); 2442 2446 iput(temp_inode); 2443 2447 if (ret) {
+1 -1
fs/btrfs/scrub.c
··· 2799 2799 have_csum = scrub_find_csum(sctx, logical, csum); 2800 2800 if (have_csum == 0) 2801 2801 ++sctx->stat.no_csum; 2802 - if (sctx->is_dev_replace && !have_csum) { 2802 + if (0 && sctx->is_dev_replace && !have_csum) { 2803 2803 ret = copy_nocow_pages(sctx, logical, l, 2804 2804 mirror_num, 2805 2805 physical_for_dev_replace);