aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorQu Wenruo <quwenruo@cn.fujitsu.com>2015-09-08 05:25:56 -0400
committerChris Mason <clm@fb.com>2015-10-21 21:41:07 -0400
commit94ed938aba557aa798acf496f09afb289b619fcd (patch)
tree967880fccfe272df0fb1a87fc0208d68714ba357
parent7cf5b97650f2ecefbd5afa2d58b61b289b6e3750 (diff)
btrfs: qgroup: Add handler for NOCOW and inline
For NOCOW and inline case, there will be no delayed_ref created for them, so we should free their reserved data space at proper time(finish_ordered_io for NOCOW and cow_file_inline for inline). Signed-off-by: Qu Wenruo <quwenruo@cn.fujitsu.com> Signed-off-by: Chris Mason <clm@fb.com>
-rw-r--r--fs/btrfs/extent-tree.c7
-rw-r--r--fs/btrfs/inode.c15
2 files changed, 21 insertions, 1 deletions
diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
index 3a23225e83f4..aaaa7746685a 100644
--- a/fs/btrfs/extent-tree.c
+++ b/fs/btrfs/extent-tree.c
@@ -4052,7 +4052,12 @@ int btrfs_check_data_free_space(struct inode *inode, u64 start, u64 len)
4052 if (ret < 0) 4052 if (ret < 0)
4053 return ret; 4053 return ret;
4054 4054
4055 /* Use new btrfs_qgroup_reserve_data to reserve precious data space */ 4055 /*
4056 * Use new btrfs_qgroup_reserve_data to reserve precious data space
4057 *
4058 * TODO: Find a good method to avoid reserve data space for NOCOW
4059 * range, but don't impact performance on quota disable case.
4060 */
4056 ret = btrfs_qgroup_reserve_data(inode, start, len); 4061 ret = btrfs_qgroup_reserve_data(inode, start, len);
4057 return ret; 4062 return ret;
4058} 4063}
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
index a34e5a9c51cb..ef5d3694b944 100644
--- a/fs/btrfs/inode.c
+++ b/fs/btrfs/inode.c
@@ -310,6 +310,13 @@ static noinline int cow_file_range_inline(struct btrfs_root *root,
310 btrfs_delalloc_release_metadata(inode, end + 1 - start); 310 btrfs_delalloc_release_metadata(inode, end + 1 - start);
311 btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0); 311 btrfs_drop_extent_cache(inode, start, aligned_end - 1, 0);
312out: 312out:
313 /*
314 * Don't forget to free the reserved space, as for inlined extent
315 * it won't count as data extent, free them directly here.
316 * And at reserve time, it's always aligned to page size, so
317 * just free one page here.
318 */
319 btrfs_qgroup_free_data(inode, 0, PAGE_CACHE_SIZE);
313 btrfs_free_path(path); 320 btrfs_free_path(path);
314 btrfs_end_transaction(trans, root); 321 btrfs_end_transaction(trans, root);
315 return ret; 322 return ret;
@@ -2838,6 +2845,14 @@ static int btrfs_finish_ordered_io(struct btrfs_ordered_extent *ordered_extent)
2838 2845
2839 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) { 2846 if (test_bit(BTRFS_ORDERED_NOCOW, &ordered_extent->flags)) {
2840 BUG_ON(!list_empty(&ordered_extent->list)); /* Logic error */ 2847 BUG_ON(!list_empty(&ordered_extent->list)); /* Logic error */
2848
2849 /*
2850 * For mwrite(mmap + memset to write) case, we still reserve
2851 * space for NOCOW range.
2852 * As NOCOW won't cause a new delayed ref, just free the space
2853 */
2854 btrfs_qgroup_free_data(inode, ordered_extent->file_offset,
2855 ordered_extent->len);
2841 btrfs_ordered_update_i_size(inode, 0, ordered_extent); 2856 btrfs_ordered_update_i_size(inode, 0, ordered_extent);
2842 if (nolock) 2857 if (nolock)
2843 trans = btrfs_join_transaction_nolock(root); 2858 trans = btrfs_join_transaction_nolock(root);