Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/fs/btrfs/block-rsv.h
50774 views
1
/* SPDX-License-Identifier: GPL-2.0 */
2
3
#ifndef BTRFS_BLOCK_RSV_H
4
#define BTRFS_BLOCK_RSV_H
5
6
#include <linux/types.h>
7
#include <linux/compiler.h>
8
#include <linux/spinlock.h>
9
10
struct btrfs_trans_handle;
11
struct btrfs_root;
12
struct btrfs_space_info;
13
struct btrfs_block_rsv;
14
struct btrfs_fs_info;
15
enum btrfs_reserve_flush_enum;
16
17
/*
18
* Types of block reserves
19
*/
20
enum btrfs_rsv_type {
21
BTRFS_BLOCK_RSV_GLOBAL,
22
BTRFS_BLOCK_RSV_DELALLOC,
23
BTRFS_BLOCK_RSV_TRANS,
24
BTRFS_BLOCK_RSV_CHUNK,
25
BTRFS_BLOCK_RSV_REMAP,
26
BTRFS_BLOCK_RSV_DELOPS,
27
BTRFS_BLOCK_RSV_DELREFS,
28
BTRFS_BLOCK_RSV_TREELOG,
29
BTRFS_BLOCK_RSV_EMPTY,
30
BTRFS_BLOCK_RSV_TEMP,
31
};
32
33
struct btrfs_block_rsv {
34
u64 size;
35
u64 reserved;
36
struct btrfs_space_info *space_info;
37
spinlock_t lock;
38
bool full;
39
bool failfast;
40
/* Block reserve type, one of BTRFS_BLOCK_RSV_* */
41
enum btrfs_rsv_type type:8;
42
43
/*
44
* Qgroup equivalent for @size @reserved
45
*
46
* Unlike normal @size/@reserved for inode rsv, qgroup doesn't care
47
* about things like csum size nor how many tree blocks it will need to
48
* reserve.
49
*
50
* Qgroup cares more about net change of the extent usage.
51
*
52
* So for one newly inserted file extent, in worst case it will cause
53
* leaf split and level increase, nodesize for each file extent is
54
* already too much.
55
*
56
* In short, qgroup_size/reserved is the upper limit of possible needed
57
* qgroup metadata reservation.
58
*/
59
u64 qgroup_rsv_size;
60
u64 qgroup_rsv_reserved;
61
};
62
63
void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, enum btrfs_rsv_type type);
64
void btrfs_init_root_block_rsv(struct btrfs_root *root);
65
struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
66
enum btrfs_rsv_type type);
67
void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info,
68
struct btrfs_block_rsv *rsv,
69
enum btrfs_rsv_type type);
70
void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
71
struct btrfs_block_rsv *rsv);
72
int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info,
73
struct btrfs_block_rsv *block_rsv, u64 num_bytes,
74
enum btrfs_reserve_flush_enum flush);
75
int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_percent);
76
int btrfs_block_rsv_refill(struct btrfs_fs_info *fs_info,
77
struct btrfs_block_rsv *block_rsv, u64 num_bytes,
78
enum btrfs_reserve_flush_enum flush);
79
int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
80
struct btrfs_block_rsv *dst_rsv, u64 num_bytes,
81
bool update_size);
82
int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes);
83
void btrfs_block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
84
u64 num_bytes, bool update_size);
85
u64 btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
86
struct btrfs_block_rsv *block_rsv,
87
u64 num_bytes, u64 *qgroup_to_release);
88
void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info);
89
void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info);
90
void btrfs_release_global_block_rsv(struct btrfs_fs_info *fs_info);
91
struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans,
92
struct btrfs_root *root,
93
u32 blocksize);
94
int btrfs_check_trunc_cache_free_space(const struct btrfs_fs_info *fs_info,
95
struct btrfs_block_rsv *rsv);
96
static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info,
97
struct btrfs_block_rsv *block_rsv,
98
u32 blocksize)
99
{
100
btrfs_block_rsv_add_bytes(block_rsv, blocksize, false);
101
btrfs_block_rsv_release(fs_info, block_rsv, 0, NULL);
102
}
103
104
/*
105
* Fast path to check if the reserve is full, may be carefully used outside of
106
* locks.
107
*/
108
static inline bool btrfs_block_rsv_full(const struct btrfs_block_rsv *rsv)
109
{
110
return data_race(rsv->full);
111
}
112
113
/*
114
* Get the reserved mount of a block reserve in a context where getting a stale
115
* value is acceptable, instead of accessing it directly and trigger data race
116
* warning from KCSAN.
117
*/
118
static inline u64 btrfs_block_rsv_reserved(struct btrfs_block_rsv *rsv)
119
{
120
u64 ret;
121
122
spin_lock(&rsv->lock);
123
ret = rsv->reserved;
124
spin_unlock(&rsv->lock);
125
126
return ret;
127
}
128
129
/*
130
* Get the size of a block reserve in a context where getting a stale value is
131
* acceptable, instead of accessing it directly and trigger data race warning
132
* from KCSAN.
133
*/
134
static inline u64 btrfs_block_rsv_size(struct btrfs_block_rsv *rsv)
135
{
136
u64 ret;
137
138
spin_lock(&rsv->lock);
139
ret = rsv->size;
140
spin_unlock(&rsv->lock);
141
142
return ret;
143
}
144
145
#endif /* BTRFS_BLOCK_RSV_H */
146
147