brintos

brintos / linux-shallow public Read only

0
0
Text · 2.7 KiB · 31c1648 Raw
99 lines · c
1// SPDX-License-Identifier: GPL-2.02 3#include "messages.h"4#include "ctree.h"5#include "fs.h"6#include "accessors.h"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);27		set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);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);50		set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);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);73		set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);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);96		set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);97	}98}99