aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2018-07-01 15:38:16 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2018-07-01 15:38:16 -0400
commitd3bc0e67f8525760479e88a51e87bb0c026e40f3 (patch)
tree30ce55f25ffe60a754a51f09dc2e07a4268a59ce
parent4a770e638f531d078b580a5a24412c5e5f8f7ddb (diff)
parente4e7ede739f7fb468686dfffa2d1e35dca35bacd (diff)
Merge tag 'for-4.18-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux
Pull btrfs fixes from David Sterba: "We have a few regression fixes for qgroup rescan status tracking and the vm_fault_t conversion that mixed up the error values" * tag 'for-4.18-rc2-tag' of git://git.kernel.org/pub/scm/linux/kernel/git/kdave/linux: Btrfs: fix mount failure when qgroup rescan is in progress Btrfs: fix regression in btrfs_page_mkwrite() from vm_fault_t conversion btrfs: quota: Set rescan progress to (u64)-1 if we hit last leaf
-rw-r--r--fs/btrfs/inode.c3
-rw-r--r--fs/btrfs/qgroup.c17
2 files changed, 15 insertions, 5 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index be98dfc8d0f8..eba61bcb9bb3 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -9005,13 +9005,14 @@ again:
9005 9005
9006 unlock_extent_cached(io_tree, page_start, page_end, &cached_state); 9006 unlock_extent_cached(io_tree, page_start, page_end, &cached_state);
9007 9007
9008out_unlock:
9009 if (!ret2) { 9008 if (!ret2) {
9010 btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, true); 9009 btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, true);
9011 sb_end_pagefault(inode->i_sb); 9010 sb_end_pagefault(inode->i_sb);
9012 extent_changeset_free(data_reserved); 9011 extent_changeset_free(data_reserved);
9013 return VM_FAULT_LOCKED; 9012 return VM_FAULT_LOCKED;
9014 } 9013 }
9014
9015out_unlock:
9015 unlock_page(page); 9016 unlock_page(page);
9016out: 9017out:
9017 btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, (ret != 0)); 9018 btrfs_delalloc_release_extents(BTRFS_I(inode), PAGE_SIZE, (ret != 0));
diff --git a/fs/btrfs/qgroup.c b/fs/btrfs/qgroup.c
index 1874a6d2e6f5..c25dc47210a3 100644
--- a/fs/btrfs/qgroup.c
+++ b/fs/btrfs/qgroup.c
@@ -2680,8 +2680,10 @@ out:
2680 free_extent_buffer(scratch_leaf); 2680 free_extent_buffer(scratch_leaf);
2681 } 2681 }
2682 2682
2683 if (done && !ret) 2683 if (done && !ret) {
2684 ret = 1; 2684 ret = 1;
2685 fs_info->qgroup_rescan_progress.objectid = (u64)-1;
2686 }
2685 return ret; 2687 return ret;
2686} 2688}
2687 2689
@@ -2784,13 +2786,20 @@ qgroup_rescan_init(struct btrfs_fs_info *fs_info, u64 progress_objectid,
2784 2786
2785 if (!init_flags) { 2787 if (!init_flags) {
2786 /* we're resuming qgroup rescan at mount time */ 2788 /* we're resuming qgroup rescan at mount time */
2787 if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_RESCAN)) 2789 if (!(fs_info->qgroup_flags &
2790 BTRFS_QGROUP_STATUS_FLAG_RESCAN)) {
2788 btrfs_warn(fs_info, 2791 btrfs_warn(fs_info,
2789 "qgroup rescan init failed, qgroup is not enabled"); 2792 "qgroup rescan init failed, qgroup is not enabled");
2790 else if (!(fs_info->qgroup_flags & BTRFS_QGROUP_STATUS_FLAG_ON)) 2793 ret = -EINVAL;
2794 } else if (!(fs_info->qgroup_flags &
2795 BTRFS_QGROUP_STATUS_FLAG_ON)) {
2791 btrfs_warn(fs_info, 2796 btrfs_warn(fs_info,
2792 "qgroup rescan init failed, qgroup rescan is not queued"); 2797 "qgroup rescan init failed, qgroup rescan is not queued");
2793 return -EINVAL; 2798 ret = -EINVAL;
2799 }
2800
2801 if (ret)
2802 return ret;
2794 } 2803 }
2795 2804
2796 mutex_lock(&fs_info->qgroup_rescan_lock); 2805 mutex_lock(&fs_info->qgroup_rescan_lock);