mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-15 08:44:14 +08:00
Btrfs: introduce mount option no_space_cache
Some users have requested this and I've found I needed a way to disable cache loading without actually clearing the cache, so introduce the no_space_cache option. Before we check the super blocks cache generation field and if it was populated we always turned space caching on. Now we check this and set the space cache option on, and then parse the mount options so that if we want it off it get's turned off. Then we check the mount option all the places we do the caching work instead of checking the super's cache generation. This makes things more consistent and lets us turn space caching off. Thanks, Signed-off-by: Josef Bacik <josef@redhat.com>
This commit is contained in:
parent
e27425d614
commit
73bc187680
@ -481,7 +481,8 @@ static int cache_block_group(struct btrfs_block_group_cache *cache,
|
||||
* we likely hold important locks.
|
||||
*/
|
||||
if (trans && (!trans->transaction->in_commit) &&
|
||||
(root && root != root->fs_info->tree_root)) {
|
||||
(root && root != root->fs_info->tree_root) &&
|
||||
btrfs_test_opt(root, SPACE_CACHE)) {
|
||||
spin_lock(&cache->lock);
|
||||
if (cache->cached != BTRFS_CACHE_NO) {
|
||||
spin_unlock(&cache->lock);
|
||||
@ -4223,7 +4224,7 @@ static int update_block_group(struct btrfs_trans_handle *trans,
|
||||
spin_lock(&cache->space_info->lock);
|
||||
spin_lock(&cache->lock);
|
||||
|
||||
if (btrfs_super_cache_generation(&info->super_copy) != 0 &&
|
||||
if (btrfs_test_opt(root, SPACE_CACHE) &&
|
||||
cache->disk_cache_state < BTRFS_DC_CLEAR)
|
||||
cache->disk_cache_state = BTRFS_DC_CLEAR;
|
||||
|
||||
@ -7038,13 +7039,11 @@ int btrfs_read_block_groups(struct btrfs_root *root)
|
||||
path->reada = 1;
|
||||
|
||||
cache_gen = btrfs_super_cache_generation(&root->fs_info->super_copy);
|
||||
if (cache_gen != 0 &&
|
||||
if (btrfs_test_opt(root, SPACE_CACHE) &&
|
||||
btrfs_super_generation(&root->fs_info->super_copy) != cache_gen)
|
||||
need_clear = 1;
|
||||
if (btrfs_test_opt(root, CLEAR_CACHE))
|
||||
need_clear = 1;
|
||||
if (!btrfs_test_opt(root, SPACE_CACHE) && cache_gen)
|
||||
printk(KERN_INFO "btrfs: disk space caching is enabled\n");
|
||||
|
||||
while (1) {
|
||||
ret = find_first_block_group(root, path, &key);
|
||||
|
@ -164,7 +164,7 @@ enum {
|
||||
Opt_notreelog, Opt_ratio, Opt_flushoncommit, Opt_discard,
|
||||
Opt_space_cache, Opt_clear_cache, Opt_user_subvol_rm_allowed,
|
||||
Opt_enospc_debug, Opt_subvolrootid, Opt_defrag,
|
||||
Opt_inode_cache, Opt_err,
|
||||
Opt_inode_cache, Opt_no_space_cache, Opt_err,
|
||||
};
|
||||
|
||||
static match_table_t tokens = {
|
||||
@ -197,6 +197,7 @@ static match_table_t tokens = {
|
||||
{Opt_subvolrootid, "subvolrootid=%d"},
|
||||
{Opt_defrag, "autodefrag"},
|
||||
{Opt_inode_cache, "inode_cache"},
|
||||
{Opt_no_space_cache, "no_space_cache"},
|
||||
{Opt_err, NULL},
|
||||
};
|
||||
|
||||
@ -208,14 +209,19 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||
{
|
||||
struct btrfs_fs_info *info = root->fs_info;
|
||||
substring_t args[MAX_OPT_ARGS];
|
||||
char *p, *num, *orig;
|
||||
char *p, *num, *orig = NULL;
|
||||
u64 cache_gen;
|
||||
int intarg;
|
||||
int ret = 0;
|
||||
char *compress_type;
|
||||
bool compress_force = false;
|
||||
|
||||
cache_gen = btrfs_super_cache_generation(&root->fs_info->super_copy);
|
||||
if (cache_gen)
|
||||
btrfs_set_opt(info->mount_opt, SPACE_CACHE);
|
||||
|
||||
if (!options)
|
||||
return 0;
|
||||
goto out;
|
||||
|
||||
/*
|
||||
* strsep changes the string, duplicate it because parse_options
|
||||
@ -362,9 +368,12 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||
btrfs_set_opt(info->mount_opt, DISCARD);
|
||||
break;
|
||||
case Opt_space_cache:
|
||||
printk(KERN_INFO "btrfs: enabling disk space caching\n");
|
||||
btrfs_set_opt(info->mount_opt, SPACE_CACHE);
|
||||
break;
|
||||
case Opt_no_space_cache:
|
||||
printk(KERN_INFO "btrfs: disabling disk space caching\n");
|
||||
btrfs_clear_opt(info->mount_opt, SPACE_CACHE);
|
||||
break;
|
||||
case Opt_inode_cache:
|
||||
printk(KERN_INFO "btrfs: enabling inode map caching\n");
|
||||
btrfs_set_opt(info->mount_opt, INODE_MAP_CACHE);
|
||||
@ -393,6 +402,8 @@ int btrfs_parse_options(struct btrfs_root *root, char *options)
|
||||
}
|
||||
}
|
||||
out:
|
||||
if (!ret && btrfs_test_opt(root, SPACE_CACHE))
|
||||
printk(KERN_INFO "btrfs: disk space caching is enabled\n");
|
||||
kfree(orig);
|
||||
return ret;
|
||||
}
|
||||
@ -687,6 +698,8 @@ static int btrfs_show_options(struct seq_file *seq, struct vfsmount *vfs)
|
||||
seq_puts(seq, ",noacl");
|
||||
if (btrfs_test_opt(root, SPACE_CACHE))
|
||||
seq_puts(seq, ",space_cache");
|
||||
else
|
||||
seq_puts(seq, ",no_space_cache");
|
||||
if (btrfs_test_opt(root, CLEAR_CACHE))
|
||||
seq_puts(seq, ",clear_cache");
|
||||
if (btrfs_test_opt(root, USER_SUBVOL_RM_ALLOWED))
|
||||
|
@ -1003,7 +1003,7 @@ static void update_super_roots(struct btrfs_root *root)
|
||||
super->root = root_item->bytenr;
|
||||
super->generation = root_item->generation;
|
||||
super->root_level = root_item->level;
|
||||
if (super->cache_generation != 0 || btrfs_test_opt(root, SPACE_CACHE))
|
||||
if (btrfs_test_opt(root, SPACE_CACHE))
|
||||
super->cache_generation = root_item->generation;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user