1c7f13d42SJosef Bacik // SPDX-License-Identifier: GPL-2.0
2c7f13d42SJosef Bacik
39b569ea0SJosef Bacik #include "messages.h"
4c7f13d42SJosef Bacik #include "ctree.h"
5c7f13d42SJosef Bacik #include "fs.h"
607e81dc9SJosef Bacik #include "accessors.h"
7c7f13d42SJosef Bacik
__btrfs_set_fs_incompat(struct btrfs_fs_info * fs_info,u64 flag,const char * name)8c7f13d42SJosef Bacik void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag,
9c7f13d42SJosef Bacik const char *name)
10c7f13d42SJosef Bacik {
11c7f13d42SJosef Bacik struct btrfs_super_block *disk_super;
12c7f13d42SJosef Bacik u64 features;
13c7f13d42SJosef Bacik
14c7f13d42SJosef Bacik disk_super = fs_info->super_copy;
15c7f13d42SJosef Bacik features = btrfs_super_incompat_flags(disk_super);
16c7f13d42SJosef Bacik if (!(features & flag)) {
17c7f13d42SJosef Bacik spin_lock(&fs_info->super_lock);
18c7f13d42SJosef Bacik features = btrfs_super_incompat_flags(disk_super);
19c7f13d42SJosef Bacik if (!(features & flag)) {
20c7f13d42SJosef Bacik features |= flag;
21c7f13d42SJosef Bacik btrfs_set_super_incompat_flags(disk_super, features);
22c7f13d42SJosef Bacik btrfs_info(fs_info,
23c7f13d42SJosef Bacik "setting incompat feature flag for %s (0x%llx)",
24c7f13d42SJosef Bacik name, flag);
25c7f13d42SJosef Bacik }
26c7f13d42SJosef Bacik spin_unlock(&fs_info->super_lock);
27*b7625f46SQu Wenruo set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
28c7f13d42SJosef Bacik }
29c7f13d42SJosef Bacik }
30c7f13d42SJosef Bacik
__btrfs_clear_fs_incompat(struct btrfs_fs_info * fs_info,u64 flag,const char * name)31c7f13d42SJosef Bacik void __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag,
32c7f13d42SJosef Bacik const char *name)
33c7f13d42SJosef Bacik {
34c7f13d42SJosef Bacik struct btrfs_super_block *disk_super;
35c7f13d42SJosef Bacik u64 features;
36c7f13d42SJosef Bacik
37c7f13d42SJosef Bacik disk_super = fs_info->super_copy;
38c7f13d42SJosef Bacik features = btrfs_super_incompat_flags(disk_super);
39c7f13d42SJosef Bacik if (features & flag) {
40c7f13d42SJosef Bacik spin_lock(&fs_info->super_lock);
41c7f13d42SJosef Bacik features = btrfs_super_incompat_flags(disk_super);
42c7f13d42SJosef Bacik if (features & flag) {
43c7f13d42SJosef Bacik features &= ~flag;
44c7f13d42SJosef Bacik btrfs_set_super_incompat_flags(disk_super, features);
45c7f13d42SJosef Bacik btrfs_info(fs_info,
46c7f13d42SJosef Bacik "clearing incompat feature flag for %s (0x%llx)",
47c7f13d42SJosef Bacik name, flag);
48c7f13d42SJosef Bacik }
49c7f13d42SJosef Bacik spin_unlock(&fs_info->super_lock);
50*b7625f46SQu Wenruo set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
51c7f13d42SJosef Bacik }
52c7f13d42SJosef Bacik }
53c7f13d42SJosef Bacik
__btrfs_set_fs_compat_ro(struct btrfs_fs_info * fs_info,u64 flag,const char * name)54c7f13d42SJosef Bacik void __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag,
55c7f13d42SJosef Bacik const char *name)
56c7f13d42SJosef Bacik {
57c7f13d42SJosef Bacik struct btrfs_super_block *disk_super;
58c7f13d42SJosef Bacik u64 features;
59c7f13d42SJosef Bacik
60c7f13d42SJosef Bacik disk_super = fs_info->super_copy;
61c7f13d42SJosef Bacik features = btrfs_super_compat_ro_flags(disk_super);
62c7f13d42SJosef Bacik if (!(features & flag)) {
63c7f13d42SJosef Bacik spin_lock(&fs_info->super_lock);
64c7f13d42SJosef Bacik features = btrfs_super_compat_ro_flags(disk_super);
65c7f13d42SJosef Bacik if (!(features & flag)) {
66c7f13d42SJosef Bacik features |= flag;
67c7f13d42SJosef Bacik btrfs_set_super_compat_ro_flags(disk_super, features);
68c7f13d42SJosef Bacik btrfs_info(fs_info,
69c7f13d42SJosef Bacik "setting compat-ro feature flag for %s (0x%llx)",
70c7f13d42SJosef Bacik name, flag);
71c7f13d42SJosef Bacik }
72c7f13d42SJosef Bacik spin_unlock(&fs_info->super_lock);
73*b7625f46SQu Wenruo set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
74c7f13d42SJosef Bacik }
75c7f13d42SJosef Bacik }
76c7f13d42SJosef Bacik
__btrfs_clear_fs_compat_ro(struct btrfs_fs_info * fs_info,u64 flag,const char * name)77c7f13d42SJosef Bacik void __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag,
78c7f13d42SJosef Bacik const char *name)
79c7f13d42SJosef Bacik {
80c7f13d42SJosef Bacik struct btrfs_super_block *disk_super;
81c7f13d42SJosef Bacik u64 features;
82c7f13d42SJosef Bacik
83c7f13d42SJosef Bacik disk_super = fs_info->super_copy;
84c7f13d42SJosef Bacik features = btrfs_super_compat_ro_flags(disk_super);
85c7f13d42SJosef Bacik if (features & flag) {
86c7f13d42SJosef Bacik spin_lock(&fs_info->super_lock);
87c7f13d42SJosef Bacik features = btrfs_super_compat_ro_flags(disk_super);
88c7f13d42SJosef Bacik if (features & flag) {
89c7f13d42SJosef Bacik features &= ~flag;
90c7f13d42SJosef Bacik btrfs_set_super_compat_ro_flags(disk_super, features);
91c7f13d42SJosef Bacik btrfs_info(fs_info,
92c7f13d42SJosef Bacik "clearing compat-ro feature flag for %s (0x%llx)",
93c7f13d42SJosef Bacik name, flag);
94c7f13d42SJosef Bacik }
95c7f13d42SJosef Bacik spin_unlock(&fs_info->super_lock);
96*b7625f46SQu Wenruo set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
97c7f13d42SJosef Bacik }
98c7f13d42SJosef Bacik }
99