diff options
author | Liu Bo <bo.li.liu@oracle.com> | 2013-08-02 04:30:40 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@fusionio.com> | 2013-09-01 08:04:52 -0400 |
commit | 116e0024c453dfdfacc9278f485dabc9c63a4ac4 (patch) | |
tree | 9124d5f8880a24c1b7ea125a6f6ef2f608244165 /fs/btrfs/inode.c | |
parent | 8b87dc17fbc7443bf4c6c096279c35e89fb51326 (diff) |
Btrfs: allow compressed extents to be merged during defragment
The rule originally comes from nocow writing, but snapshot-aware
defrag is a different case, the extent has been writen and we're
not going to change the extent but add a reference on the data.
So we're able to allow such compressed extents to be merged into
one bigger extent if they're pointing to the same data.
Reviewed-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Liu Bo <bo.li.liu@oracle.com>
Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 14 |
1 files changed, 8 insertions, 6 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index 27fa81977f86..66571dce88d1 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -2212,16 +2212,18 @@ static noinline bool record_extent_backrefs(struct btrfs_path *path, | |||
2212 | 2212 | ||
2213 | static int relink_is_mergable(struct extent_buffer *leaf, | 2213 | static int relink_is_mergable(struct extent_buffer *leaf, |
2214 | struct btrfs_file_extent_item *fi, | 2214 | struct btrfs_file_extent_item *fi, |
2215 | u64 disk_bytenr) | 2215 | struct new_sa_defrag_extent *new) |
2216 | { | 2216 | { |
2217 | if (btrfs_file_extent_disk_bytenr(leaf, fi) != disk_bytenr) | 2217 | if (btrfs_file_extent_disk_bytenr(leaf, fi) != new->bytenr) |
2218 | return 0; | 2218 | return 0; |
2219 | 2219 | ||
2220 | if (btrfs_file_extent_type(leaf, fi) != BTRFS_FILE_EXTENT_REG) | 2220 | if (btrfs_file_extent_type(leaf, fi) != BTRFS_FILE_EXTENT_REG) |
2221 | return 0; | 2221 | return 0; |
2222 | 2222 | ||
2223 | if (btrfs_file_extent_compression(leaf, fi) || | 2223 | if (btrfs_file_extent_compression(leaf, fi) != new->compress_type) |
2224 | btrfs_file_extent_encryption(leaf, fi) || | 2224 | return 0; |
2225 | |||
2226 | if (btrfs_file_extent_encryption(leaf, fi) || | ||
2225 | btrfs_file_extent_other_encoding(leaf, fi)) | 2227 | btrfs_file_extent_other_encoding(leaf, fi)) |
2226 | return 0; | 2228 | return 0; |
2227 | 2229 | ||
@@ -2365,8 +2367,8 @@ again: | |||
2365 | struct btrfs_file_extent_item); | 2367 | struct btrfs_file_extent_item); |
2366 | extent_len = btrfs_file_extent_num_bytes(leaf, fi); | 2368 | extent_len = btrfs_file_extent_num_bytes(leaf, fi); |
2367 | 2369 | ||
2368 | if (relink_is_mergable(leaf, fi, new->bytenr) && | 2370 | if (extent_len + found_key.offset == start && |
2369 | extent_len + found_key.offset == start) { | 2371 | relink_is_mergable(leaf, fi, new)) { |
2370 | btrfs_set_file_extent_num_bytes(leaf, fi, | 2372 | btrfs_set_file_extent_num_bytes(leaf, fi, |
2371 | extent_len + len); | 2373 | extent_len + len); |
2372 | btrfs_mark_buffer_dirty(leaf); | 2374 | btrfs_mark_buffer_dirty(leaf); |