0001
0002
0003
0004
0005
0006 #ifndef BTRFS_QGROUP_H
0007 #define BTRFS_QGROUP_H
0008
0009 #include <linux/spinlock.h>
0010 #include <linux/rbtree.h>
0011 #include <linux/kobject.h>
0012 #include "ulist.h"
0013 #include "delayed-ref.h"
0014
0015
0016
0017
0018
0019
0020
0021
0022
0023
0024
0025
0026
0027
0028
0029
0030
0031
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061
0062
0063
0064
0065
0066
0067
0068
0069
0070
0071
0072
0073
0074
0075
0076
0077
0078
0079
0080
0081
0082
0083
0084
0085
0086
0087
0088
0089
0090
0091
0092
0093
0094
0095
0096
0097
0098
0099
0100
0101
0102
0103
0104
0105
0106
0107 struct btrfs_qgroup_extent_record {
0108 struct rb_node node;
0109 u64 bytenr;
0110 u64 num_bytes;
0111
0112
0113
0114
0115
0116
0117
0118
0119
0120 u32 data_rsv;
0121 u64 data_rsv_refroot;
0122 struct ulist *old_roots;
0123 };
0124
0125 struct btrfs_qgroup_swapped_block {
0126 struct rb_node node;
0127
0128 int level;
0129 bool trace_leaf;
0130
0131
0132 u64 subvol_bytenr;
0133 u64 subvol_generation;
0134
0135
0136 u64 reloc_bytenr;
0137 u64 reloc_generation;
0138
0139 u64 last_snapshot;
0140 struct btrfs_key first_key;
0141 };
0142
0143
0144
0145
0146
0147
0148
0149
0150
0151
0152
0153
0154
0155
0156
0157
0158
0159
0160
0161
0162
0163
0164 enum btrfs_qgroup_rsv_type {
0165 BTRFS_QGROUP_RSV_DATA,
0166 BTRFS_QGROUP_RSV_META_PERTRANS,
0167 BTRFS_QGROUP_RSV_META_PREALLOC,
0168 BTRFS_QGROUP_RSV_LAST,
0169 };
0170
0171
0172
0173
0174
0175
0176
0177
0178
0179
0180
0181 struct btrfs_qgroup_rsv {
0182 u64 values[BTRFS_QGROUP_RSV_LAST];
0183 };
0184
0185
0186
0187
0188 struct btrfs_qgroup {
0189 u64 qgroupid;
0190
0191
0192
0193
0194 u64 rfer;
0195 u64 rfer_cmpr;
0196 u64 excl;
0197 u64 excl_cmpr;
0198
0199
0200
0201
0202 u64 lim_flags;
0203 u64 max_rfer;
0204 u64 max_excl;
0205 u64 rsv_rfer;
0206 u64 rsv_excl;
0207
0208
0209
0210
0211 struct btrfs_qgroup_rsv rsv;
0212
0213
0214
0215
0216 struct list_head groups;
0217 struct list_head members;
0218 struct list_head dirty;
0219 struct rb_node node;
0220
0221
0222
0223
0224
0225 u64 old_refcnt;
0226 u64 new_refcnt;
0227
0228
0229
0230
0231 struct kobject kobj;
0232 };
0233
0234 static inline u64 btrfs_qgroup_subvolid(u64 qgroupid)
0235 {
0236 return (qgroupid & ((1ULL << BTRFS_QGROUP_LEVEL_SHIFT) - 1));
0237 }
0238
0239
0240
0241
0242 #define QGROUP_RESERVE (1<<0)
0243 #define QGROUP_RELEASE (1<<1)
0244 #define QGROUP_FREE (1<<2)
0245
0246 int btrfs_quota_enable(struct btrfs_fs_info *fs_info);
0247 int btrfs_quota_disable(struct btrfs_fs_info *fs_info);
0248 int btrfs_qgroup_rescan(struct btrfs_fs_info *fs_info);
0249 void btrfs_qgroup_rescan_resume(struct btrfs_fs_info *fs_info);
0250 int btrfs_qgroup_wait_for_completion(struct btrfs_fs_info *fs_info,
0251 bool interruptible);
0252 int btrfs_add_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
0253 u64 dst);
0254 int btrfs_del_qgroup_relation(struct btrfs_trans_handle *trans, u64 src,
0255 u64 dst);
0256 int btrfs_create_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid);
0257 int btrfs_remove_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid);
0258 int btrfs_limit_qgroup(struct btrfs_trans_handle *trans, u64 qgroupid,
0259 struct btrfs_qgroup_limit *limit);
0260 int btrfs_read_qgroup_config(struct btrfs_fs_info *fs_info);
0261 void btrfs_free_qgroup_config(struct btrfs_fs_info *fs_info);
0262 struct btrfs_delayed_extent_op;
0263
0264
0265
0266
0267
0268
0269
0270
0271
0272
0273
0274
0275 int btrfs_qgroup_trace_extent_nolock(
0276 struct btrfs_fs_info *fs_info,
0277 struct btrfs_delayed_ref_root *delayed_refs,
0278 struct btrfs_qgroup_extent_record *record);
0279
0280
0281
0282
0283
0284
0285
0286
0287
0288
0289
0290
0291
0292
0293
0294
0295
0296
0297
0298
0299
0300
0301 int btrfs_qgroup_trace_extent_post(struct btrfs_trans_handle *trans,
0302 struct btrfs_qgroup_extent_record *qrecord);
0303
0304
0305
0306
0307
0308
0309
0310
0311
0312
0313
0314
0315
0316
0317 int btrfs_qgroup_trace_extent(struct btrfs_trans_handle *trans, u64 bytenr,
0318 u64 num_bytes, gfp_t gfp_flag);
0319
0320
0321
0322
0323
0324
0325
0326 int btrfs_qgroup_trace_leaf_items(struct btrfs_trans_handle *trans,
0327 struct extent_buffer *eb);
0328
0329
0330
0331
0332
0333
0334
0335
0336
0337
0338 int btrfs_qgroup_trace_subtree(struct btrfs_trans_handle *trans,
0339 struct extent_buffer *root_eb,
0340 u64 root_gen, int root_level);
0341 int btrfs_qgroup_account_extent(struct btrfs_trans_handle *trans, u64 bytenr,
0342 u64 num_bytes, struct ulist *old_roots,
0343 struct ulist *new_roots);
0344 int btrfs_qgroup_account_extents(struct btrfs_trans_handle *trans);
0345 int btrfs_run_qgroups(struct btrfs_trans_handle *trans);
0346 int btrfs_qgroup_inherit(struct btrfs_trans_handle *trans, u64 srcid,
0347 u64 objectid, struct btrfs_qgroup_inherit *inherit);
0348 void btrfs_qgroup_free_refroot(struct btrfs_fs_info *fs_info,
0349 u64 ref_root, u64 num_bytes,
0350 enum btrfs_qgroup_rsv_type type);
0351
0352 #ifdef CONFIG_BTRFS_FS_RUN_SANITY_TESTS
0353 int btrfs_verify_qgroup_counts(struct btrfs_fs_info *fs_info, u64 qgroupid,
0354 u64 rfer, u64 excl);
0355 #endif
0356
0357
0358 int btrfs_qgroup_reserve_data(struct btrfs_inode *inode,
0359 struct extent_changeset **reserved, u64 start, u64 len);
0360 int btrfs_qgroup_release_data(struct btrfs_inode *inode, u64 start, u64 len);
0361 int btrfs_qgroup_free_data(struct btrfs_inode *inode,
0362 struct extent_changeset *reserved, u64 start,
0363 u64 len);
0364 int btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes,
0365 enum btrfs_qgroup_rsv_type type, bool enforce);
0366 int __btrfs_qgroup_reserve_meta(struct btrfs_root *root, int num_bytes,
0367 enum btrfs_qgroup_rsv_type type, bool enforce,
0368 bool noflush);
0369
0370 static inline int btrfs_qgroup_reserve_meta_pertrans(struct btrfs_root *root,
0371 int num_bytes, bool enforce)
0372 {
0373 return __btrfs_qgroup_reserve_meta(root, num_bytes,
0374 BTRFS_QGROUP_RSV_META_PERTRANS,
0375 enforce, false);
0376 }
0377 static inline int btrfs_qgroup_reserve_meta_prealloc(struct btrfs_root *root,
0378 int num_bytes, bool enforce,
0379 bool noflush)
0380 {
0381 return __btrfs_qgroup_reserve_meta(root, num_bytes,
0382 BTRFS_QGROUP_RSV_META_PREALLOC,
0383 enforce, noflush);
0384 }
0385
0386 void __btrfs_qgroup_free_meta(struct btrfs_root *root, int num_bytes,
0387 enum btrfs_qgroup_rsv_type type);
0388
0389
0390 static inline void btrfs_qgroup_free_meta_pertrans(struct btrfs_root *root,
0391 int num_bytes)
0392 {
0393 __btrfs_qgroup_free_meta(root, num_bytes,
0394 BTRFS_QGROUP_RSV_META_PERTRANS);
0395 }
0396
0397
0398 static inline void btrfs_qgroup_free_meta_prealloc(struct btrfs_root *root,
0399 int num_bytes)
0400 {
0401 __btrfs_qgroup_free_meta(root, num_bytes,
0402 BTRFS_QGROUP_RSV_META_PREALLOC);
0403 }
0404
0405
0406
0407
0408
0409 void btrfs_qgroup_free_meta_all_pertrans(struct btrfs_root *root);
0410
0411
0412
0413
0414
0415
0416
0417 void btrfs_qgroup_convert_reserved_meta(struct btrfs_root *root, int num_bytes);
0418
0419 void btrfs_qgroup_check_reserved_leak(struct btrfs_inode *inode);
0420
0421
0422 void btrfs_qgroup_init_swapped_blocks(
0423 struct btrfs_qgroup_swapped_blocks *swapped_blocks);
0424
0425 void btrfs_qgroup_clean_swapped_blocks(struct btrfs_root *root);
0426 int btrfs_qgroup_add_swapped_blocks(struct btrfs_trans_handle *trans,
0427 struct btrfs_root *subvol_root,
0428 struct btrfs_block_group *bg,
0429 struct extent_buffer *subvol_parent, int subvol_slot,
0430 struct extent_buffer *reloc_parent, int reloc_slot,
0431 u64 last_snapshot);
0432 int btrfs_qgroup_trace_subtree_after_cow(struct btrfs_trans_handle *trans,
0433 struct btrfs_root *root, struct extent_buffer *eb);
0434 void btrfs_qgroup_destroy_extent_records(struct btrfs_transaction *trans);
0435 bool btrfs_check_quota_leak(struct btrfs_fs_info *fs_info);
0436
0437 #endif