diff options
Diffstat (limited to 'fs/btrfs/qgroup.h')
-rw-r--r-- | fs/btrfs/qgroup.h | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/fs/btrfs/qgroup.h b/fs/btrfs/qgroup.h new file mode 100644 index 000000000000..5952ff1fbd7a --- /dev/null +++ b/fs/btrfs/qgroup.h | |||
@@ -0,0 +1,107 @@ | |||
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 | |||
19 | #ifndef __BTRFS_QGROUP__ | ||
20 | #define __BTRFS_QGROUP__ | ||
21 | |||
22 | /* | ||
23 | * A description of the operations, all of these operations only happen when we | ||
24 | * are adding the 1st reference for that subvolume in the case of adding space | ||
25 | * or on the last reference delete in the case of subtraction. The only | ||
26 | * exception is the last one, which is added for confusion. | ||
27 | * | ||
28 | * BTRFS_QGROUP_OPER_ADD_EXCL: adding bytes where this subvolume is the only | ||
29 | * one pointing at the bytes we are adding. This is called on the first | ||
30 | * allocation. | ||
31 | * | ||
32 | * BTRFS_QGROUP_OPER_ADD_SHARED: adding bytes where this bytenr is going to be | ||
33 | * shared between subvols. This is called on the creation of a ref that already | ||
34 | * has refs from a different subvolume, so basically reflink. | ||
35 | * | ||
36 | * BTRFS_QGROUP_OPER_SUB_EXCL: removing bytes where this subvolume is the only | ||
37 | * one referencing the range. | ||
38 | * | ||
39 | * BTRFS_QGROUP_OPER_SUB_SHARED: removing bytes where this subvolume shares with | ||
40 | * refs with other subvolumes. | ||
41 | */ | ||
42 | enum btrfs_qgroup_operation_type { | ||
43 | BTRFS_QGROUP_OPER_ADD_EXCL, | ||
44 | BTRFS_QGROUP_OPER_ADD_SHARED, | ||
45 | BTRFS_QGROUP_OPER_SUB_EXCL, | ||
46 | BTRFS_QGROUP_OPER_SUB_SHARED, | ||
47 | }; | ||
48 | |||
49 | struct btrfs_qgroup_operation { | ||
50 | u64 ref_root; | ||
51 | u64 bytenr; | ||
52 | u64 num_bytes; | ||
53 | u64 seq; | ||
54 | enum btrfs_qgroup_operation_type type; | ||
55 | struct seq_list elem; | ||
56 | struct rb_node n; | ||
57 | struct list_head list; | ||
58 | }; | ||
59 | |||
60 | int btrfs_quota_enable(struct btrfs_trans_handle *trans, | ||
61 | struct btrfs_fs_info *fs_info); | ||
62 | int btrfs_quota_disable(struct btrfs_trans_handle *trans, | ||
63 | struct btrfs_fs_info *fs_info); | ||
64 | int btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info); | ||
65 | void btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info); | ||
66 | int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info); | ||
67 | int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, | ||
68 | struct btrfs_fs_info *fs_info, u64 src, u64 dst); | ||
69 | int btrfs_del_qgroup_relation(struct btrfs_trans_handle *trans, | ||
70 | struct btrfs_fs_info *fs_info, u64 src, u64 dst); | ||
71 | int btrfs_create_qgroup(struct btrfs_trans_handle *trans, | ||
72 | struct btrfs_fs_info *fs_info, u64 qgroupid, | ||
73 | char *name); | ||
74 | int btrfs_remove_qgroup(struct btrfs_trans_handle *trans, | ||
75 | struct btrfs_fs_info *fs_info, u64 qgroupid); | ||
76 | int btrfs_limit_qgroup(struct btrfs_trans_handle *trans, | ||
77 | struct btrfs_fs_info *fs_info, u64 qgroupid, | ||
78 | struct btrfs_qgroup_limit *limit); | ||
79 | int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info); | ||
80 | void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info); | ||
81 | struct btrfs_delayed_extent_op; | ||
82 | int btrfs_qgroup_record_ref(struct btrfs_trans_handle *trans, | ||
83 | struct btrfs_fs_info *fs_info, u64 ref_root, | ||
84 | u64 bytenr, u64 num_bytes, | ||
85 | enum btrfs_qgroup_operation_type type, | ||
86 | int mod_seq); | ||
87 | int btrfs_delayed_qgroup_accounting(struct btrfs_trans_handle *trans, | ||
88 | struct btrfs_fs_info *fs_info); | ||
89 | void btrfs_remove_qgroup_operation(struct btrfs_trans_handle *trans, | ||
90 | struct btrfs_fs_info *fs_info, | ||
91 | struct btrfs_qgroup_operation *oper); | ||
92 | int btrfs_run_qgroups(struct btrfs_trans_handle *trans, | ||
93 | struct btrfs_fs_info *fs_info); | ||
94 | int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, | ||
95 | struct btrfs_fs_info *fs_info, u64 srcid, u64 objectid, | ||
96 | struct btrfs_qgroup_inherit *inherit); | ||
97 | int btrfs_qgroup_reserve(struct btrfs_root *root, u64 num_bytes); | ||
98 | void btrfs_qgroup_free(struct btrfs_root *root, u64 num_bytes); | ||
99 | |||
100 | void assert_qgroups_uptodate(struct btrfs_trans_handle *trans); | ||
101 | |||
102 | #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS | ||
103 | int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid, | ||
104 | u64 rfer, u64 excl); | ||
105 | #endif | ||
106 | |||
107 | #endif /* __BTRFS_QGROUP__ */ | ||