|
@@ -4100,6 +4100,30 @@ static inline void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+#define btrfs_clear_fs_incompat(__fs_info, opt) \
|
|
|
+ __btrfs_clear_fs_incompat((__fs_info), BTRFS_FEATURE_INCOMPAT_##opt)
|
|
|
+
|
|
|
+static inline void __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info,
|
|
|
+ u64 flag)
|
|
|
+{
|
|
|
+ struct btrfs_super_block *disk_super;
|
|
|
+ u64 features;
|
|
|
+
|
|
|
+ disk_super = fs_info->super_copy;
|
|
|
+ features = btrfs_super_incompat_flags(disk_super);
|
|
|
+ if (features & flag) {
|
|
|
+ spin_lock(&fs_info->super_lock);
|
|
|
+ features = btrfs_super_incompat_flags(disk_super);
|
|
|
+ if (features & flag) {
|
|
|
+ features &= ~flag;
|
|
|
+ btrfs_set_super_incompat_flags(disk_super, features);
|
|
|
+ btrfs_info(fs_info, "clearing %llu feature flag",
|
|
|
+ flag);
|
|
|
+ }
|
|
|
+ spin_unlock(&fs_info->super_lock);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
#define btrfs_fs_incompat(fs_info, opt) \
|
|
|
__btrfs_fs_incompat((fs_info), BTRFS_FEATURE_INCOMPAT_##opt)
|
|
|
|
|
@@ -4110,6 +4134,64 @@ static inline int __btrfs_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag)
|
|
|
return !!(btrfs_super_incompat_flags(disk_super) & flag);
|
|
|
}
|
|
|
|
|
|
+#define btrfs_set_fs_compat_ro(__fs_info, opt) \
|
|
|
+ __btrfs_set_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt)
|
|
|
+
|
|
|
+static inline void __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info,
|
|
|
+ u64 flag)
|
|
|
+{
|
|
|
+ struct btrfs_super_block *disk_super;
|
|
|
+ u64 features;
|
|
|
+
|
|
|
+ disk_super = fs_info->super_copy;
|
|
|
+ features = btrfs_super_compat_ro_flags(disk_super);
|
|
|
+ if (!(features & flag)) {
|
|
|
+ spin_lock(&fs_info->super_lock);
|
|
|
+ features = btrfs_super_compat_ro_flags(disk_super);
|
|
|
+ if (!(features & flag)) {
|
|
|
+ features |= flag;
|
|
|
+ btrfs_set_super_compat_ro_flags(disk_super, features);
|
|
|
+ btrfs_info(fs_info, "setting %llu ro feature flag",
|
|
|
+ flag);
|
|
|
+ }
|
|
|
+ spin_unlock(&fs_info->super_lock);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#define btrfs_clear_fs_compat_ro(__fs_info, opt) \
|
|
|
+ __btrfs_clear_fs_compat_ro((__fs_info), BTRFS_FEATURE_COMPAT_RO_##opt)
|
|
|
+
|
|
|
+static inline void __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info,
|
|
|
+ u64 flag)
|
|
|
+{
|
|
|
+ struct btrfs_super_block *disk_super;
|
|
|
+ u64 features;
|
|
|
+
|
|
|
+ disk_super = fs_info->super_copy;
|
|
|
+ features = btrfs_super_compat_ro_flags(disk_super);
|
|
|
+ if (features & flag) {
|
|
|
+ spin_lock(&fs_info->super_lock);
|
|
|
+ features = btrfs_super_compat_ro_flags(disk_super);
|
|
|
+ if (features & flag) {
|
|
|
+ features &= ~flag;
|
|
|
+ btrfs_set_super_compat_ro_flags(disk_super, features);
|
|
|
+ btrfs_info(fs_info, "clearing %llu ro feature flag",
|
|
|
+ flag);
|
|
|
+ }
|
|
|
+ spin_unlock(&fs_info->super_lock);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+#define btrfs_fs_compat_ro(fs_info, opt) \
|
|
|
+ __btrfs_fs_compat_ro((fs_info), BTRFS_FEATURE_COMPAT_RO_##opt)
|
|
|
+
|
|
|
+static inline int __btrfs_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag)
|
|
|
+{
|
|
|
+ struct btrfs_super_block *disk_super;
|
|
|
+ disk_super = fs_info->super_copy;
|
|
|
+ return !!(btrfs_super_compat_ro_flags(disk_super) & flag);
|
|
|
+}
|
|
|
+
|
|
|
/*
|
|
|
* Call btrfs_abort_transaction as early as possible when an error condition is
|
|
|
* detected, that way the exact line number is reported.
|