Merge tag 'vfs-6.9.super' of git://git.kernel.org/pub/scm/linux/kernel/git/vfs/vfs
[sfrench/cifs-2.6.git] / fs / btrfs / fs.c
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                 set_bit(BTRFS_FS_FEATURE_CHANGED, &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(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);
50                 set_bit(BTRFS_FS_FEATURE_CHANGED, &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(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);
73                 set_bit(BTRFS_FS_FEATURE_CHANGED, &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(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);
96                 set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
97         }
98 }