Merge tag 'drm-next-2022-08-12-1' of git://anongit.freedesktop.org/drm/drm
[linux-2.6-microblaze.git] / fs / btrfs / block-rsv.h
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 btrfs_rsv_type {
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         bool full;
29         bool failfast;
30         /* Block reserve type, one of BTRFS_BLOCK_RSV_* */
31         enum btrfs_rsv_type type:8;
32
33         /*
34          * Qgroup equivalent for @size @reserved
35          *
36          * Unlike normal @size/@reserved for inode rsv, qgroup doesn't care
37          * about things like csum size nor how many tree blocks it will need to
38          * reserve.
39          *
40          * Qgroup cares more about net change of the extent usage.
41          *
42          * So for one newly inserted file extent, in worst case it will cause
43          * leaf split and level increase, nodesize for each file extent is
44          * already too much.
45          *
46          * In short, qgroup_size/reserved is the upper limit of possible needed
47          * qgroup metadata reservation.
48          */
49         u64 qgroup_rsv_size;
50         u64 qgroup_rsv_reserved;
51 };
52
53 void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, enum btrfs_rsv_type type);
54 void btrfs_init_root_block_rsv(struct btrfs_root *root);
55 struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
56                                               enum btrfs_rsv_type type);
57 void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info,
58                                    struct btrfs_block_rsv *rsv,
59                                    enum btrfs_rsv_type type);
60 void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
61                           struct btrfs_block_rsv *rsv);
62 int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info,
63                         struct btrfs_block_rsv *block_rsv, u64 num_bytes,
64                         enum btrfs_reserve_flush_enum flush);
65 int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor);
66 int btrfs_block_rsv_refill(struct btrfs_fs_info *fs_info,
67                            struct btrfs_block_rsv *block_rsv, u64 min_reserved,
68                            enum btrfs_reserve_flush_enum flush);
69 int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
70                             struct btrfs_block_rsv *dst_rsv, u64 num_bytes,
71                             bool update_size);
72 int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes);
73 int btrfs_cond_migrate_bytes(struct btrfs_fs_info *fs_info,
74                              struct btrfs_block_rsv *dest, u64 num_bytes,
75                              int min_factor);
76 void btrfs_block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
77                                u64 num_bytes, bool update_size);
78 u64 btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
79                               struct btrfs_block_rsv *block_rsv,
80                               u64 num_bytes, u64 *qgroup_to_release);
81 void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info);
82 void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info);
83 void btrfs_release_global_block_rsv(struct btrfs_fs_info *fs_info);
84 struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans,
85                                             struct btrfs_root *root,
86                                             u32 blocksize);
87 static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info,
88                                          struct btrfs_block_rsv *block_rsv,
89                                          u32 blocksize)
90 {
91         btrfs_block_rsv_add_bytes(block_rsv, blocksize, false);
92         btrfs_block_rsv_release(fs_info, block_rsv, 0, NULL);
93 }
94
95 #endif /* BTRFS_BLOCK_RSV_H */