diff options
author | Chris Mason <chris.mason@oracle.com> | 2011-05-24 15:35:30 -0400 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2011-05-26 17:52:15 -0400 |
commit | 4cb5300bc839b8a943eb19c9f27f25470e22d0ca (patch) | |
tree | ac0f2fb481c7aa6af08a624d276fa6d580c94c9b /fs/btrfs/inode.c | |
parent | d6c0cb379c5198487e4ac124728cbb2346d63b1f (diff) |
Btrfs: add mount -o auto_defrag
This will detect small random writes into files and
queue the up for an auto defrag process. It isn't well suited to
database workloads yet, but works for smaller files such as rpm, sqlite
or bdb databases.
Signed-off-by: Chris Mason <chris.mason@oracle.com>
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; |