fs.c 2.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. // SPDX-License-Identifier: GPL-2.0
  2. #include "messages.h"
  3. #include "ctree.h"
  4. #include "fs.h"
  5. #include "accessors.h"
  6. void __btrfs_set_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag,
  7. const char *name)
  8. {
  9. struct btrfs_super_block *disk_super;
  10. u64 features;
  11. disk_super = fs_info->super_copy;
  12. features = btrfs_super_incompat_flags(disk_super);
  13. if (!(features & flag)) {
  14. spin_lock(&fs_info->super_lock);
  15. features = btrfs_super_incompat_flags(disk_super);
  16. if (!(features & flag)) {
  17. features |= flag;
  18. btrfs_set_super_incompat_flags(disk_super, features);
  19. btrfs_info(fs_info,
  20. "setting incompat feature flag for %s (0x%llx)",
  21. name, flag);
  22. }
  23. spin_unlock(&fs_info->super_lock);
  24. set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
  25. }
  26. }
  27. void __btrfs_clear_fs_incompat(struct btrfs_fs_info *fs_info, u64 flag,
  28. const char *name)
  29. {
  30. struct btrfs_super_block *disk_super;
  31. u64 features;
  32. disk_super = fs_info->super_copy;
  33. features = btrfs_super_incompat_flags(disk_super);
  34. if (features & flag) {
  35. spin_lock(&fs_info->super_lock);
  36. features = btrfs_super_incompat_flags(disk_super);
  37. if (features & flag) {
  38. features &= ~flag;
  39. btrfs_set_super_incompat_flags(disk_super, features);
  40. btrfs_info(fs_info,
  41. "clearing incompat feature flag for %s (0x%llx)",
  42. name, flag);
  43. }
  44. spin_unlock(&fs_info->super_lock);
  45. set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
  46. }
  47. }
  48. void __btrfs_set_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag,
  49. const char *name)
  50. {
  51. struct btrfs_super_block *disk_super;
  52. u64 features;
  53. disk_super = fs_info->super_copy;
  54. features = btrfs_super_compat_ro_flags(disk_super);
  55. if (!(features & flag)) {
  56. spin_lock(&fs_info->super_lock);
  57. features = btrfs_super_compat_ro_flags(disk_super);
  58. if (!(features & flag)) {
  59. features |= flag;
  60. btrfs_set_super_compat_ro_flags(disk_super, features);
  61. btrfs_info(fs_info,
  62. "setting compat-ro feature flag for %s (0x%llx)",
  63. name, flag);
  64. }
  65. spin_unlock(&fs_info->super_lock);
  66. set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
  67. }
  68. }
  69. void __btrfs_clear_fs_compat_ro(struct btrfs_fs_info *fs_info, u64 flag,
  70. const char *name)
  71. {
  72. struct btrfs_super_block *disk_super;
  73. u64 features;
  74. disk_super = fs_info->super_copy;
  75. features = btrfs_super_compat_ro_flags(disk_super);
  76. if (features & flag) {
  77. spin_lock(&fs_info->super_lock);
  78. features = btrfs_super_compat_ro_flags(disk_super);
  79. if (features & flag) {
  80. features &= ~flag;
  81. btrfs_set_super_compat_ro_flags(disk_super, features);
  82. btrfs_info(fs_info,
  83. "clearing compat-ro feature flag for %s (0x%llx)",
  84. name, flag);
  85. }
  86. spin_unlock(&fs_info->super_lock);
  87. set_bit(BTRFS_FS_FEATURE_CHANGED, &fs_info->flags);
  88. }
  89. }