提交 8cd29088 编写于 作者: B Boris Burkov 提交者: David Sterba

btrfs: clear oneshot options on mount and remount

Some options only apply during mount time and are cleared at the end
of mount. For now, the example is USEBACKUPROOT, but CLEAR_CACHE also
fits the bill, and this is a preparation patch for also clearing that
option.

One subtlety is that the current code only resets USEBACKUPROOT on rw
mounts, but the option is meaningfully "consumed" by a ro mount, so it
feels appropriate to clear in that case as well. A subsequent read-write
remount would not go through open_ctree, which is the only place that
checks the option, so the change should be benign.
Reviewed-by: NJosef Bacik <josef@toxicpanda.com>
Signed-off-by: NBoris Burkov <boris@bur.io>
Reviewed-by: NDavid Sterba <dsterba@suse.com>
Signed-off-by: NDavid Sterba <dsterba@suse.com>
上级 5011139a
...@@ -2870,6 +2870,16 @@ static int btrfs_check_uuid_tree(struct btrfs_fs_info *fs_info) ...@@ -2870,6 +2870,16 @@ static int btrfs_check_uuid_tree(struct btrfs_fs_info *fs_info)
return 0; return 0;
} }
/*
* Some options only have meaning at mount time and shouldn't persist across
* remounts, or be displayed. Clear these at the end of mount and remount
* code paths.
*/
void btrfs_clear_oneshot_options(struct btrfs_fs_info *fs_info)
{
btrfs_clear_opt(fs_info->mount_opt, USEBACKUPROOT);
}
/* /*
* Mounting logic specific to read-write file systems. Shared by open_ctree * Mounting logic specific to read-write file systems. Shared by open_ctree
* and btrfs_remount when remounting from read-only to read-write. * and btrfs_remount when remounting from read-only to read-write.
...@@ -3359,7 +3369,7 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device ...@@ -3359,7 +3369,7 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device
} }
if (sb_rdonly(sb)) if (sb_rdonly(sb))
return 0; goto clear_oneshot;
if (btrfs_test_opt(fs_info, CLEAR_CACHE) && if (btrfs_test_opt(fs_info, CLEAR_CACHE) &&
btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) { btrfs_fs_compat_ro(fs_info, FREE_SPACE_TREE)) {
...@@ -3402,6 +3412,8 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device ...@@ -3402,6 +3412,8 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device
} }
set_bit(BTRFS_FS_OPEN, &fs_info->flags); set_bit(BTRFS_FS_OPEN, &fs_info->flags);
clear_oneshot:
btrfs_clear_oneshot_options(fs_info);
return 0; return 0;
fail_qgroup: fail_qgroup:
......
...@@ -50,6 +50,7 @@ struct extent_buffer *btrfs_find_create_tree_block( ...@@ -50,6 +50,7 @@ struct extent_buffer *btrfs_find_create_tree_block(
u64 bytenr, u64 owner_root, u64 bytenr, u64 owner_root,
int level); int level);
void btrfs_clean_tree_block(struct extent_buffer *buf); void btrfs_clean_tree_block(struct extent_buffer *buf);
void btrfs_clear_oneshot_options(struct btrfs_fs_info *fs_info);
int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs_info); int btrfs_start_pre_rw_mount(struct btrfs_fs_info *fs_info);
int __cold open_ctree(struct super_block *sb, int __cold open_ctree(struct super_block *sb,
struct btrfs_fs_devices *fs_devices, struct btrfs_fs_devices *fs_devices,
......
...@@ -1999,6 +1999,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data) ...@@ -1999,6 +1999,7 @@ static int btrfs_remount(struct super_block *sb, int *flags, char *data)
wake_up_process(fs_info->transaction_kthread); wake_up_process(fs_info->transaction_kthread);
btrfs_remount_cleanup(fs_info, old_opts); btrfs_remount_cleanup(fs_info, old_opts);
btrfs_clear_oneshot_options(fs_info);
clear_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state); clear_bit(BTRFS_FS_STATE_REMOUNTING, &fs_info->fs_state);
return 0; return 0;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册