]>
Commit | Line | Data |
---|---|---|
c7f13d42 JB |
1 | // SPDX-License-Identifier: GPL-2.0 |
2 | ||
9b569ea0 | 3 | #include "messages.h" |
c7f13d42 JB |
4 | #include "ctree.h" |
5 | #include "fs.h" | |
07e81dc9 | 6 | #include "accessors.h" |
c7f13d42 JB |
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); | |
b7625f46 | 27 | set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags); |
c7f13d42 JB |
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(disk_super); | |
39 | if (features & flag) { | |
40 | spin_lock(&fs_info->super_lock); | |
41 | features = btrfs_super_incompat_flags(disk_super); | |
42 | if (features & flag) { | |
43 | features &= ~flag; | |
44 | btrfs_set_super_incompat_flags(disk_super, features); | |
45 | btrfs_info(fs_info, | |
46 | "clearing incompat feature flag for %s (0x%llx)", | |
47 | name, flag); | |
48 | } | |
49 | spin_unlock(&fs_info->super_lock); | |
b7625f46 | 50 | set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags); |
c7f13d42 JB |
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(disk_super); | |
62 | if (!(features & flag)) { | |
63 | spin_lock(&fs_info->super_lock); | |
64 | features = btrfs_super_compat_ro_flags(disk_super); | |
65 | if (!(features & flag)) { | |
66 | features |= flag; | |
67 | btrfs_set_super_compat_ro_flags(disk_super, features); | |
68 | btrfs_info(fs_info, | |
69 | "setting compat-ro feature flag for %s (0x%llx)", | |
70 | name, flag); | |
71 | } | |
72 | spin_unlock(&fs_info->super_lock); | |
b7625f46 | 73 | set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags); |
c7f13d42 JB |
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(disk_super); | |
85 | if (features & flag) { | |
86 | spin_lock(&fs_info->super_lock); | |
87 | features = btrfs_super_compat_ro_flags(disk_super); | |
88 | if (features & flag) { | |
89 | features &= ~flag; | |
90 | btrfs_set_super_compat_ro_flags(disk_super, features); | |
91 | btrfs_info(fs_info, | |
92 | "clearing compat-ro feature flag for %s (0x%llx)", | |
93 | name, flag); | |
94 | } | |
95 | spin_unlock(&fs_info->super_lock); | |
b7625f46 | 96 | set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags); |
c7f13d42 JB |
97 | } |
98 | } |