xref: /openbmc/linux/fs/btrfs/fs.c (revision b7625f46)
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