qgroup.h 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. /*
  2. * Copyright (C) 2014 Facebook. All rights reserved.
  3. *
  4. * This program is free software; you can redistribute it and/or
  5. * modify it under the terms of the GNU General Public
  6. * License v2 as published by the Free Software Foundation.
  7. *
  8. * This program is distributed in the hope that it will be useful,
  9. * but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
  11. * General Public License for more details.
  12. *
  13. * You should have received a copy of the GNU General Public
  14. * License along with this program; if not, write to the
  15. * Free Software Foundation, Inc., 59 Temple Place - Suite 330,
  16. * Boston, MA 021110-1307, USA.
  17. */
  18. #ifndef __BTRFS_QGROUP__
  19. #define __BTRFS_QGROUP__
  20. /*
  21. * A description of the operations, all of these operations only happen when we
  22. * are adding the 1st reference for that subvolume in the case of adding space
  23. * or on the last reference delete in the case of subtraction. The only
  24. * exception is the last one, which is added for confusion.
  25. *
  26. * BTRFS_QGROUP_OPER_ADD_EXCL: adding bytes where this subvolume is the only
  27. * one pointing at the bytes we are adding. This is called on the first
  28. * allocation.
  29. *
  30. * BTRFS_QGROUP_OPER_ADD_SHARED: adding bytes where this bytenr is going to be
  31. * shared between subvols. This is called on the creation of a ref that already
  32. * has refs from a different subvolume, so basically reflink.
  33. *
  34. * BTRFS_QGROUP_OPER_SUB_EXCL: removing bytes where this subvolume is the only
  35. * one referencing the range.
  36. *
  37. * BTRFS_QGROUP_OPER_SUB_SHARED: removing bytes where this subvolume shares with
  38. * refs with other subvolumes.
  39. */
  40. enum btrfs_qgroup_operation_type {
  41. BTRFS_QGROUP_OPER_ADD_EXCL,
  42. BTRFS_QGROUP_OPER_ADD_SHARED,
  43. BTRFS_QGROUP_OPER_SUB_EXCL,
  44. BTRFS_QGROUP_OPER_SUB_SHARED,
  45. BTRFS_QGROUP_OPER_SUB_SUBTREE,
  46. };
  47. struct btrfs_qgroup_operation {
  48. u64 ref_root;
  49. u64 bytenr;
  50. u64 num_bytes;
  51. u64 seq;
  52. enum btrfs_qgroup_operation_type type;
  53. struct seq_list elem;
  54. struct rb_node n;
  55. struct list_head list;
  56. };
  57. int btrfs_quota_enable(struct btrfs_trans_handle *trans,
  58. struct btrfs_fs_info *fs_info);
  59. int btrfs_quota_disable(struct btrfs_trans_handle *trans,
  60. struct btrfs_fs_info *fs_info);
  61. int btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info);
  62. void btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info);
  63. int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info);
  64. int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans,
  65. struct btrfs_fs_info *fs_info, u64 src, u64 dst);
  66. int btrfs_del_qgroup_relation(struct btrfs_trans_handle *trans,
  67. struct btrfs_fs_info *fs_info, u64 src, u64 dst);
  68. int btrfs_create_qgroup(struct btrfs_trans_handle *trans,
  69. struct btrfs_fs_info *fs_info, u64 qgroupid,
  70. char *name);
  71. int btrfs_remove_qgroup(struct btrfs_trans_handle *trans,
  72. struct btrfs_fs_info *fs_info, u64 qgroupid);
  73. int btrfs_limit_qgroup(struct btrfs_trans_handle *trans,
  74. struct btrfs_fs_info *fs_info, u64 qgroupid,
  75. struct btrfs_qgroup_limit *limit);
  76. int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info);
  77. void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info);
  78. struct btrfs_delayed_extent_op;
  79. int btrfs_qgroup_record_ref(struct btrfs_trans_handle *trans,
  80. struct btrfs_fs_info *fs_info, u64 ref_root,
  81. u64 bytenr, u64 num_bytes,
  82. enum btrfs_qgroup_operation_type type,
  83. int mod_seq);
  84. int btrfs_delayed_qgroup_accounting(struct btrfs_trans_handle *trans,
  85. struct btrfs_fs_info *fs_info);
  86. void btrfs_remove_qgroup_operation(struct btrfs_trans_handle *trans,
  87. struct btrfs_fs_info *fs_info,
  88. struct btrfs_qgroup_operation *oper);
  89. int btrfs_run_qgroups(struct btrfs_trans_handle *trans,
  90. struct btrfs_fs_info *fs_info);
  91. int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans,
  92. struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid,
  93. struct btrfs_qgroup_inherit *inherit);
  94. int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes);
  95. void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes);
  96. void assert_qgroups_uptodate(struct btrfs_trans_handle *trans);
  97. #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
  98. int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid,
  99. u64 rfer, u64 excl);
  100. #endif
  101. #endif /* __BTRFS_QGROUP__ */