diff options
author | Qu Wenruo <quwenruo@cn.fujitsu.com> | 2015-09-08 05:25:56 -0400 |
---|---|---|
committer | Chris Mason <clm@fb.com> | 2015-10-21 21:41:07 -0400 |
commit | 94ed938aba557aa798acf496f09afb289b619fcd (patch) | |
tree | 967880fccfe272df0fb1a87fc0208d68714ba357 | |
parent | 7cf5b97650f2ecefbd5afa2d58b61b289b6e3750 (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.c | 7 | ||||
-rw-r--r-- | fs/btrfs/inode.c | 15 |
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); |
312 | out: | 312 | out: |
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); |