Merge tag 'tty-6.8-rc3' of git://git.kernel.org/pub/scm/linux/kernel/git/gregkh/tty
[linux-block.git] / fs / btrfs / fs.c
CommitLineData
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
8void __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
31void __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
54void __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
77void __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}