diff options
Diffstat (limited to 'fs/btrfs/inode.c')
-rw-r--r-- | fs/btrfs/inode.c | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c index d378f8b70ef7..bb51bb1fa44f 100644 --- a/fs/btrfs/inode.c +++ b/fs/btrfs/inode.c | |||
@@ -342,6 +342,10 @@ static noinline int compress_file_range(struct inode *inode, | |||
342 | int will_compress; | 342 | int will_compress; |
343 | int compress_type = root->fs_info->compress_type; | 343 | int compress_type = root->fs_info->compress_type; |
344 | 344 | ||
345 | /* if this is a small write inside eof, kick off a defragbot */ | ||
346 | if (end <= BTRFS_I(inode)->disk_i_size && (end - start + 1) < 16 * 1024) | ||
347 | btrfs_add_inode_defrag(NULL, inode); | ||
348 | |||
345 | actual_end = min_t(u64, isize, end + 1); | 349 | actual_end = min_t(u64, isize, end + 1); |
346 | again: | 350 | again: |
347 | will_compress = 0; | 351 | will_compress = 0; |
@@ -799,6 +803,10 @@ static noinline int cow_file_range(struct inode *inode, | |||
799 | disk_num_bytes = num_bytes; | 803 | disk_num_bytes = num_bytes; |
800 | ret = 0; | 804 | ret = 0; |
801 | 805 | ||
806 | /* if this is a small write inside eof, kick off defrag */ | ||
807 | if (end <= BTRFS_I(inode)->disk_i_size && num_bytes < 64 * 1024) | ||
808 | btrfs_add_inode_defrag(trans, inode); | ||
809 | |||
802 | if (start == 0) { | 810 | if (start == 0) { |
803 | /* lets try to make an inline extent */ | 811 | /* lets try to make an inline extent */ |
804 | ret = cow_file_range_inline(trans, root, inode, | 812 | ret = cow_file_range_inline(trans, root, inode, |
@@ -5371,6 +5379,9 @@ static struct extent_map *btrfs_new_extent_direct(struct inode *inode, | |||
5371 | if (IS_ERR(trans)) | 5379 | if (IS_ERR(trans)) |
5372 | return ERR_CAST(trans); | 5380 | return ERR_CAST(trans); |
5373 | 5381 | ||
5382 | if (start <= BTRFS_I(inode)->disk_i_size && len < 64 * 1024) | ||
5383 | btrfs_add_inode_defrag(trans, inode); | ||
5384 | |||
5374 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; | 5385 | trans->block_rsv = &root->fs_info->delalloc_block_rsv; |
5375 | 5386 | ||
5376 | alloc_hint = get_extent_allocation_hint(inode, start, len); | 5387 | alloc_hint = get_extent_allocation_hint(inode, start, len); |
@@ -6682,6 +6693,7 @@ struct inode *btrfs_alloc_inode(struct super_block *sb) | |||
6682 | ei->ordered_data_close = 0; | 6693 | ei->ordered_data_close = 0; |
6683 | ei->orphan_meta_reserved = 0; | 6694 | ei->orphan_meta_reserved = 0; |
6684 | ei->dummy_inode = 0; | 6695 | ei->dummy_inode = 0; |
6696 | ei->in_defrag = 0; | ||
6685 | ei->force_compress = BTRFS_COMPRESS_NONE; | 6697 | ei->force_compress = BTRFS_COMPRESS_NONE; |
6686 | 6698 | ||
6687 | ei->delayed_node = NULL; | 6699 | ei->delayed_node = NULL; |