diff options
Diffstat (limited to 'fs/btrfs/block-rsv.h')
-rw-r--r-- | fs/btrfs/block-rsv.h | 101 |
1 files changed, 101 insertions, 0 deletions
diff --git a/fs/btrfs/block-rsv.h b/fs/btrfs/block-rsv.h new file mode 100644 index 000000000000..d1428bb73fc5 --- /dev/null +++ b/fs/btrfs/block-rsv.h | |||
@@ -0,0 +1,101 @@ | |||
1 | /* SPDX-License-Identifier: GPL-2.0 */ | ||
2 | |||
3 | #ifndef BTRFS_BLOCK_RSV_H | ||
4 | #define BTRFS_BLOCK_RSV_H | ||
5 | |||
6 | struct btrfs_trans_handle; | ||
7 | enum btrfs_reserve_flush_enum; | ||
8 | |||
9 | /* | ||
10 | * Types of block reserves | ||
11 | */ | ||
12 | enum { | ||
13 | BTRFS_BLOCK_RSV_GLOBAL, | ||
14 | BTRFS_BLOCK_RSV_DELALLOC, | ||
15 | BTRFS_BLOCK_RSV_TRANS, | ||
16 | BTRFS_BLOCK_RSV_CHUNK, | ||
17 | BTRFS_BLOCK_RSV_DELOPS, | ||
18 | BTRFS_BLOCK_RSV_DELREFS, | ||
19 | BTRFS_BLOCK_RSV_EMPTY, | ||
20 | BTRFS_BLOCK_RSV_TEMP, | ||
21 | }; | ||
22 | |||
23 | struct btrfs_block_rsv { | ||
24 | u64 size; | ||
25 | u64 reserved; | ||
26 | struct btrfs_space_info *space_info; | ||
27 | spinlock_t lock; | ||
28 | unsigned short full; | ||
29 | unsigned short type; | ||
30 | unsigned short failfast; | ||
31 | |||
32 | /* | ||
33 | * Qgroup equivalent for @size @reserved | ||
34 | * | ||
35 | * Unlike normal @size/@reserved for inode rsv, qgroup doesn't care | ||
36 | * about things like csum size nor how many tree blocks it will need to | ||
37 | * reserve. | ||
38 | * | ||
39 | * Qgroup cares more about net change of the extent usage. | ||
40 | * | ||
41 | * So for one newly inserted file extent, in worst case it will cause | ||
42 | * leaf split and level increase, nodesize for each file extent is | ||
43 | * already too much. | ||
44 | * | ||
45 | * In short, qgroup_size/reserved is the upper limit of possible needed | ||
46 | * qgroup metadata reservation. | ||
47 | */ | ||
48 | u64 qgroup_rsv_size; | ||
49 | u64 qgroup_rsv_reserved; | ||
50 | }; | ||
51 | |||
52 | void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type); | ||
53 | struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info, | ||
54 | unsigned short type); | ||
55 | void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info, | ||
56 | struct btrfs_block_rsv *rsv, | ||
57 | unsigned short type); | ||
58 | void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info, | ||
59 | struct btrfs_block_rsv *rsv); | ||
60 | int btrfs_block_rsv_add(struct btrfs_root *root, | ||
61 | struct btrfs_block_rsv *block_rsv, u64 num_bytes, | ||
62 | enum btrfs_reserve_flush_enum flush); | ||
63 | int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor); | ||
64 | int btrfs_block_rsv_refill(struct btrfs_root *root, | ||
65 | struct btrfs_block_rsv *block_rsv, u64 min_reserved, | ||
66 | enum btrfs_reserve_flush_enum flush); | ||
67 | int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv, | ||
68 | struct btrfs_block_rsv *dst_rsv, u64 num_bytes, | ||
69 | bool update_size); | ||
70 | int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes); | ||
71 | int btrfs_cond_migrate_bytes(struct btrfs_fs_info *fs_info, | ||
72 | struct btrfs_block_rsv *dest, u64 num_bytes, | ||
73 | int min_factor); | ||
74 | void btrfs_block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv, | ||
75 | u64 num_bytes, bool update_size); | ||
76 | u64 __btrfs_block_rsv_release(struct btrfs_fs_info *fs_info, | ||
77 | struct btrfs_block_rsv *block_rsv, | ||
78 | u64 num_bytes, u64 *qgroup_to_release); | ||
79 | void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info); | ||
80 | void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info); | ||
81 | void btrfs_release_global_block_rsv(struct btrfs_fs_info *fs_info); | ||
82 | struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans, | ||
83 | struct btrfs_root *root, | ||
84 | u32 blocksize); | ||
85 | |||
86 | static inline void btrfs_block_rsv_release(struct btrfs_fs_info *fs_info, | ||
87 | struct btrfs_block_rsv *block_rsv, | ||
88 | u64 num_bytes) | ||
89 | { | ||
90 | __btrfs_block_rsv_release(fs_info, block_rsv, num_bytes, NULL); | ||
91 | } | ||
92 | |||
93 | static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info, | ||
94 | struct btrfs_block_rsv *block_rsv, | ||
95 | u32 blocksize) | ||
96 | { | ||
97 | btrfs_block_rsv_add_bytes(block_rsv, blocksize, false); | ||
98 | btrfs_block_rsv_release(fs_info, block_rsv, 0); | ||
99 | } | ||
100 | |||
101 | #endif /* BTRFS_BLOCK_RSV_H */ | ||