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