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(s: disk_super); |
16 | if (!(features & flag)) { |
17 | spin_lock(lock: &fs_info->super_lock); |
18 | features = btrfs_super_incompat_flags(s: disk_super); |
19 | if (!(features & flag)) { |
20 | features |= flag; |
21 | btrfs_set_super_incompat_flags(s: disk_super, val: features); |
22 | btrfs_info(fs_info, |
23 | "setting incompat feature flag for %s (0x%llx)" , |
24 | name, flag); |
25 | } |
26 | spin_unlock(lock: &fs_info->super_lock); |
27 | set_bit(nr: BTRFS_FS_FEATURE_CHANGED, addr: &fs_info->flags); |
28 | } |
29 | } |
30 | |
31 | void __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag, |
32 | const char *name) |
33 | { |
34 | struct btrfs_super_block *disk_super; |
35 | u64 features; |
36 | |
37 | disk_super = fs_info->super_copy; |
38 | features = btrfs_super_incompat_flags(s: disk_super); |
39 | if (features & flag) { |
40 | spin_lock(lock: &fs_info->super_lock); |
41 | features = btrfs_super_incompat_flags(s: disk_super); |
42 | if (features & flag) { |
43 | features &= ~flag; |
44 | btrfs_set_super_incompat_flags(s: disk_super, val: features); |
45 | btrfs_info(fs_info, |
46 | "clearing incompat feature flag for %s (0x%llx)" , |
47 | name, flag); |
48 | } |
49 | spin_unlock(lock: &fs_info->super_lock); |
50 | set_bit(nr: BTRFS_FS_FEATURE_CHANGED, addr: &fs_info->flags); |
51 | } |
52 | } |
53 | |
54 | void __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag, |
55 | const char *name) |
56 | { |
57 | struct btrfs_super_block *disk_super; |
58 | u64 features; |
59 | |
60 | disk_super = fs_info->super_copy; |
61 | features = btrfs_super_compat_ro_flags(s: disk_super); |
62 | if (!(features & flag)) { |
63 | spin_lock(lock: &fs_info->super_lock); |
64 | features = btrfs_super_compat_ro_flags(s: disk_super); |
65 | if (!(features & flag)) { |
66 | features |= flag; |
67 | btrfs_set_super_compat_ro_flags(s: disk_super, val: features); |
68 | btrfs_info(fs_info, |
69 | "setting compat-ro feature flag for %s (0x%llx)" , |
70 | name, flag); |
71 | } |
72 | spin_unlock(lock: &fs_info->super_lock); |
73 | set_bit(nr: BTRFS_FS_FEATURE_CHANGED, addr: &fs_info->flags); |
74 | } |
75 | } |
76 | |
77 | void __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag, |
78 | const char *name) |
79 | { |
80 | struct btrfs_super_block *disk_super; |
81 | u64 features; |
82 | |
83 | disk_super = fs_info->super_copy; |
84 | features = btrfs_super_compat_ro_flags(s: disk_super); |
85 | if (features & flag) { |
86 | spin_lock(lock: &fs_info->super_lock); |
87 | features = btrfs_super_compat_ro_flags(s: disk_super); |
88 | if (features & flag) { |
89 | features &= ~flag; |
90 | btrfs_set_super_compat_ro_flags(s: disk_super, val: features); |
91 | btrfs_info(fs_info, |
92 | "clearing compat-ro feature flag for %s (0x%llx)" , |
93 | name, flag); |
94 | } |
95 | spin_unlock(lock: &fs_info->super_lock); |
96 | set_bit(nr: BTRFS_FS_FEATURE_CHANGED, addr: &fs_info->flags); |
97 | } |
98 | } |
99 | |