mirror of https://gitee.com/openkylin/linux.git
Btrfs: kill max_extent mount option
As Yan pointed out, theres not much reason for all this complicated math to account for file extents being split up into max_extent chunks, since they are likely to all end up in the same leaf anyway. Since there isn't much reason to use max_extent, just remove the option altogether so we have one less thing we need to test. Signed-off-by: Josef Bacik <josef@redhat.com> Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
1b1d1f6625
commit
287a0ab91d
|
@ -834,7 +834,6 @@ struct btrfs_fs_info {
|
||||||
u64 last_trans_log_full_commit;
|
u64 last_trans_log_full_commit;
|
||||||
u64 open_ioctl_trans;
|
u64 open_ioctl_trans;
|
||||||
unsigned long mount_opt;
|
unsigned long mount_opt;
|
||||||
u64 max_extent;
|
|
||||||
u64 max_inline;
|
u64 max_inline;
|
||||||
u64 alloc_start;
|
u64 alloc_start;
|
||||||
struct btrfs_transaction *running_transaction;
|
struct btrfs_transaction *running_transaction;
|
||||||
|
|
|
@ -1634,7 +1634,6 @@ struct btrfs_root *open_ctree(struct super_block *sb,
|
||||||
atomic_set(&fs_info->async_submit_draining, 0);
|
atomic_set(&fs_info->async_submit_draining, 0);
|
||||||
atomic_set(&fs_info->nr_async_bios, 0);
|
atomic_set(&fs_info->nr_async_bios, 0);
|
||||||
fs_info->sb = sb;
|
fs_info->sb = sb;
|
||||||
fs_info->max_extent = (u64)-1;
|
|
||||||
fs_info->max_inline = 8192 * 1024;
|
fs_info->max_inline = 8192 * 1024;
|
||||||
fs_info->metadata_ratio = 0;
|
fs_info->metadata_ratio = 0;
|
||||||
|
|
||||||
|
|
|
@ -2846,7 +2846,7 @@ int btrfs_unreserve_metadata_for_delalloc(struct btrfs_root *root,
|
||||||
}
|
}
|
||||||
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
||||||
|
|
||||||
BTRFS_I(inode)->reserved_extents--;
|
BTRFS_I(inode)->reserved_extents -= num_items;
|
||||||
BUG_ON(BTRFS_I(inode)->reserved_extents < 0);
|
BUG_ON(BTRFS_I(inode)->reserved_extents < 0);
|
||||||
|
|
||||||
if (meta_sinfo->bytes_delalloc < num_bytes) {
|
if (meta_sinfo->bytes_delalloc < num_bytes) {
|
||||||
|
@ -3111,7 +3111,7 @@ int btrfs_reserve_metadata_for_delalloc(struct btrfs_root *root,
|
||||||
return -ENOSPC;
|
return -ENOSPC;
|
||||||
}
|
}
|
||||||
|
|
||||||
BTRFS_I(inode)->reserved_extents++;
|
BTRFS_I(inode)->reserved_extents += num_items;
|
||||||
check_force_delalloc(meta_sinfo);
|
check_force_delalloc(meta_sinfo);
|
||||||
spin_unlock(&meta_sinfo->lock);
|
spin_unlock(&meta_sinfo->lock);
|
||||||
|
|
||||||
|
|
|
@ -796,7 +796,7 @@ static noinline int cow_file_range(struct inode *inode,
|
||||||
while (disk_num_bytes > 0) {
|
while (disk_num_bytes > 0) {
|
||||||
unsigned long op;
|
unsigned long op;
|
||||||
|
|
||||||
cur_alloc_size = min(disk_num_bytes, root->fs_info->max_extent);
|
cur_alloc_size = disk_num_bytes;
|
||||||
ret = btrfs_reserve_extent(trans, root, cur_alloc_size,
|
ret = btrfs_reserve_extent(trans, root, cur_alloc_size,
|
||||||
root->sectorsize, 0, alloc_hint,
|
root->sectorsize, 0, alloc_hint,
|
||||||
(u64)-1, &ins, 1);
|
(u64)-1, &ins, 1);
|
||||||
|
@ -1227,30 +1227,9 @@ static int run_delalloc_range(struct inode *inode, struct page *locked_page,
|
||||||
static int btrfs_split_extent_hook(struct inode *inode,
|
static int btrfs_split_extent_hook(struct inode *inode,
|
||||||
struct extent_state *orig, u64 split)
|
struct extent_state *orig, u64 split)
|
||||||
{
|
{
|
||||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
||||||
u64 size;
|
|
||||||
|
|
||||||
if (!(orig->state & EXTENT_DELALLOC))
|
if (!(orig->state & EXTENT_DELALLOC))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
size = orig->end - orig->start + 1;
|
|
||||||
if (size > root->fs_info->max_extent) {
|
|
||||||
u64 num_extents;
|
|
||||||
u64 new_size;
|
|
||||||
|
|
||||||
new_size = orig->end - split + 1;
|
|
||||||
num_extents = div64_u64(size + root->fs_info->max_extent - 1,
|
|
||||||
root->fs_info->max_extent);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* if we break a large extent up then leave oustanding_extents
|
|
||||||
* be, since we've already accounted for the large extent.
|
|
||||||
*/
|
|
||||||
if (div64_u64(new_size + root->fs_info->max_extent - 1,
|
|
||||||
root->fs_info->max_extent) < num_extents)
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
||||||
BTRFS_I(inode)->outstanding_extents++;
|
BTRFS_I(inode)->outstanding_extents++;
|
||||||
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
||||||
|
@ -1268,38 +1247,10 @@ static int btrfs_merge_extent_hook(struct inode *inode,
|
||||||
struct extent_state *new,
|
struct extent_state *new,
|
||||||
struct extent_state *other)
|
struct extent_state *other)
|
||||||
{
|
{
|
||||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
|
||||||
u64 new_size, old_size;
|
|
||||||
u64 num_extents;
|
|
||||||
|
|
||||||
/* not delalloc, ignore it */
|
/* not delalloc, ignore it */
|
||||||
if (!(other->state & EXTENT_DELALLOC))
|
if (!(other->state & EXTENT_DELALLOC))
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
old_size = other->end - other->start + 1;
|
|
||||||
if (new->start < other->start)
|
|
||||||
new_size = other->end - new->start + 1;
|
|
||||||
else
|
|
||||||
new_size = new->end - other->start + 1;
|
|
||||||
|
|
||||||
/* we're not bigger than the max, unreserve the space and go */
|
|
||||||
if (new_size <= root->fs_info->max_extent) {
|
|
||||||
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
|
||||||
BTRFS_I(inode)->outstanding_extents--;
|
|
||||||
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* If we grew by another max_extent, just return, we want to keep that
|
|
||||||
* reserved amount.
|
|
||||||
*/
|
|
||||||
num_extents = div64_u64(old_size + root->fs_info->max_extent - 1,
|
|
||||||
root->fs_info->max_extent);
|
|
||||||
if (div64_u64(new_size + root->fs_info->max_extent - 1,
|
|
||||||
root->fs_info->max_extent) > num_extents)
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
||||||
BTRFS_I(inode)->outstanding_extents--;
|
BTRFS_I(inode)->outstanding_extents--;
|
||||||
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
||||||
|
@ -1328,6 +1279,7 @@ static int btrfs_set_bit_hook(struct inode *inode, u64 start, u64 end,
|
||||||
BTRFS_I(inode)->outstanding_extents++;
|
BTRFS_I(inode)->outstanding_extents++;
|
||||||
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
||||||
btrfs_delalloc_reserve_space(root, inode, end - start + 1);
|
btrfs_delalloc_reserve_space(root, inode, end - start + 1);
|
||||||
|
|
||||||
spin_lock(&root->fs_info->delalloc_lock);
|
spin_lock(&root->fs_info->delalloc_lock);
|
||||||
BTRFS_I(inode)->delalloc_bytes += end - start + 1;
|
BTRFS_I(inode)->delalloc_bytes += end - start + 1;
|
||||||
root->fs_info->delalloc_bytes += end - start + 1;
|
root->fs_info->delalloc_bytes += end - start + 1;
|
||||||
|
@ -1356,6 +1308,7 @@ static int btrfs_clear_bit_hook(struct inode *inode,
|
||||||
|
|
||||||
if (bits & EXTENT_DO_ACCOUNTING) {
|
if (bits & EXTENT_DO_ACCOUNTING) {
|
||||||
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
||||||
|
WARN_ON(!BTRFS_I(inode)->outstanding_extents);
|
||||||
BTRFS_I(inode)->outstanding_extents--;
|
BTRFS_I(inode)->outstanding_extents--;
|
||||||
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
||||||
btrfs_unreserve_metadata_for_delalloc(root, inode, 1);
|
btrfs_unreserve_metadata_for_delalloc(root, inode, 1);
|
||||||
|
@ -5384,7 +5337,6 @@ void btrfs_destroy_inode(struct inode *inode)
|
||||||
void btrfs_drop_inode(struct inode *inode)
|
void btrfs_drop_inode(struct inode *inode)
|
||||||
{
|
{
|
||||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||||
|
|
||||||
if (inode->i_nlink > 0 && btrfs_root_refs(&root->root_item) == 0)
|
if (inode->i_nlink > 0 && btrfs_root_refs(&root->root_item) == 0)
|
||||||
generic_delete_inode(inode);
|
generic_delete_inode(inode);
|
||||||
else
|
else
|
||||||
|
@ -5788,18 +5740,15 @@ static int prealloc_file_range(struct inode *inode, u64 start, u64 end,
|
||||||
struct btrfs_trans_handle *trans;
|
struct btrfs_trans_handle *trans;
|
||||||
struct btrfs_root *root = BTRFS_I(inode)->root;
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||||
struct btrfs_key ins;
|
struct btrfs_key ins;
|
||||||
u64 alloc_size;
|
|
||||||
u64 cur_offset = start;
|
u64 cur_offset = start;
|
||||||
u64 num_bytes = end - start;
|
u64 num_bytes = end - start;
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
u64 i_size;
|
u64 i_size;
|
||||||
|
|
||||||
while (num_bytes > 0) {
|
while (num_bytes > 0) {
|
||||||
alloc_size = min(num_bytes, root->fs_info->max_extent);
|
|
||||||
|
|
||||||
trans = btrfs_start_transaction(root, 1);
|
trans = btrfs_start_transaction(root, 1);
|
||||||
|
|
||||||
ret = btrfs_reserve_extent(trans, root, alloc_size,
|
ret = btrfs_reserve_extent(trans, root, num_bytes,
|
||||||
root->sectorsize, 0, alloc_hint,
|
root->sectorsize, 0, alloc_hint,
|
||||||
(u64)-1, &ins, 1);
|
(u64)-1, &ins, 1);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
|
|
|
@ -303,6 +303,7 @@ static int __btrfs_remove_ordered_extent(struct inode *inode,
|
||||||
struct btrfs_ordered_extent *entry)
|
struct btrfs_ordered_extent *entry)
|
||||||
{
|
{
|
||||||
struct btrfs_ordered_inode_tree *tree;
|
struct btrfs_ordered_inode_tree *tree;
|
||||||
|
struct btrfs_root *root = BTRFS_I(inode)->root;
|
||||||
struct rb_node *node;
|
struct rb_node *node;
|
||||||
|
|
||||||
tree = &BTRFS_I(inode)->ordered_tree;
|
tree = &BTRFS_I(inode)->ordered_tree;
|
||||||
|
@ -312,12 +313,13 @@ static int __btrfs_remove_ordered_extent(struct inode *inode,
|
||||||
set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags);
|
set_bit(BTRFS_ORDERED_COMPLETE, &entry->flags);
|
||||||
|
|
||||||
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
spin_lock(&BTRFS_I(inode)->accounting_lock);
|
||||||
|
WARN_ON(!BTRFS_I(inode)->outstanding_extents);
|
||||||
BTRFS_I(inode)->outstanding_extents--;
|
BTRFS_I(inode)->outstanding_extents--;
|
||||||
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
spin_unlock(&BTRFS_I(inode)->accounting_lock);
|
||||||
btrfs_unreserve_metadata_for_delalloc(BTRFS_I(inode)->root,
|
btrfs_unreserve_metadata_for_delalloc(BTRFS_I(inode)->root,
|
||||||
inode, 1);
|
inode, 1);
|
||||||
|
|
||||||
spin_lock(&BTRFS_I(inode)->root->fs_info->ordered_extent_lock);
|
spin_lock(&root->fs_info->ordered_extent_lock);
|
||||||
list_del_init(&entry->root_extent_list);
|
list_del_init(&entry->root_extent_list);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -329,7 +331,7 @@ static int __btrfs_remove_ordered_extent(struct inode *inode,
|
||||||
!mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY)) {
|
!mapping_tagged(inode->i_mapping, PAGECACHE_TAG_DIRTY)) {
|
||||||
list_del_init(&BTRFS_I(inode)->ordered_operations);
|
list_del_init(&BTRFS_I(inode)->ordered_operations);
|
||||||
}
|
}
|
||||||
spin_unlock(&BTRFS_I(inode)->root->fs_info->ordered_extent_lock);
|
spin_unlock(&root->fs_info->ordered_extent_lock);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -64,10 +64,9 @@ static void btrfs_put_super(struct super_block *sb)
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum,
|
Opt_degraded, Opt_subvol, Opt_subvolid, Opt_device, Opt_nodatasum,
|
||||||
Opt_nodatacow, Opt_max_extent, Opt_max_inline, Opt_alloc_start,
|
Opt_nodatacow, Opt_max_inline, Opt_alloc_start, Opt_nobarrier, Opt_ssd,
|
||||||
Opt_nobarrier, Opt_ssd, Opt_nossd, Opt_ssd_spread, Opt_thread_pool,
|
Opt_nossd, Opt_ssd_spread, Opt_thread_pool, Opt_noacl, Opt_compress,
|
||||||
Opt_noacl, Opt_compress, Opt_compress_force, Opt_notreelog, Opt_ratio,
|
Opt_compress_force, Opt_notreelog, Opt_ratio, Opt_flushoncommit,
|
||||||
Opt_flushoncommit,
|
|
||||||
Opt_discard, Opt_err,
|
Opt_discard, Opt_err,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -79,7 +78,6 @@ static match_table_t tokens = {
|
||||||
{Opt_nodatasum, "nodatasum"},
|
{Opt_nodatasum, "nodatasum"},
|
||||||
{Opt_nodatacow, "nodatacow"},
|
{Opt_nodatacow, "nodatacow"},
|
||||||
{Opt_nobarrier, "nobarrier"},
|
{Opt_nobarrier, "nobarrier"},
|
||||||
{Opt_max_extent, "max_extent=%s"},
|
|
||||||
{Opt_max_inline, "max_inline=%s"},
|
{Opt_max_inline, "max_inline=%s"},
|
||||||
{Opt_alloc_start, "alloc_start=%s"},
|
{Opt_alloc_start, "alloc_start=%s"},
|
||||||
{Opt_thread_pool, "thread_pool=%d"},
|
{Opt_thread_pool, "thread_pool=%d"},
|
||||||
|
@ -188,18 +186,6 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||||
info->thread_pool_size);
|
info->thread_pool_size);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case Opt_max_extent:
|
|
||||||
num = match_strdup(&args[0]);
|
|
||||||
if (num) {
|
|
||||||
info->max_extent = memparse(num, NULL);
|
|
||||||
kfree(num);
|
|
||||||
|
|
||||||
info->max_extent = max_t(u64,
|
|
||||||
info->max_extent, root->sectorsize);
|
|
||||||
printk(KERN_INFO "btrfs: max_extent at %llu\n",
|
|
||||||
(unsigned long long)info->max_extent);
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case Opt_max_inline:
|
case Opt_max_inline:
|
||||||
num = match_strdup(&args[0]);
|
num = match_strdup(&args[0]);
|
||||||
if (num) {
|
if (num) {
|
||||||
|
@ -529,9 +515,6 @@ static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
||||||
seq_puts(seq, ",nodatacow");
|
seq_puts(seq, ",nodatacow");
|
||||||
if (btrfs_test_opt(root, NOBARRIER))
|
if (btrfs_test_opt(root, NOBARRIER))
|
||||||
seq_puts(seq, ",nobarrier");
|
seq_puts(seq, ",nobarrier");
|
||||||
if (info->max_extent != (u64)-1)
|
|
||||||
seq_printf(seq, ",max_extent=%llu",
|
|
||||||
(unsigned long long)info->max_extent);
|
|
||||||
if (info->max_inline != 8192 * 1024)
|
if (info->max_inline != 8192 * 1024)
|
||||||
seq_printf(seq, ",max_inline=%llu",
|
seq_printf(seq, ",max_inline=%llu",
|
||||||
(unsigned long long)info->max_inline);
|
(unsigned long long)info->max_inline);
|
||||||
|
|
Loading…
Reference in New Issue