Linux Audio

Check our new training course

Loading...
Note: File does not exist in v3.15.
 1/* SPDX-License-Identifier: GPL-2.0 */
 2
 3#ifndef BTRFS_BLOCK_RSV_H
 4#define BTRFS_BLOCK_RSV_H
 5
 6struct btrfs_trans_handle;
 7enum btrfs_reserve_flush_enum;
 8
 9/*
10 * Types of block reserves
11 */
12enum {
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
23struct 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
52void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, unsigned short type);
53struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
54					      unsigned short type);
55void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info,
56				   struct btrfs_block_rsv *rsv,
57				   unsigned short type);
58void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
59			  struct btrfs_block_rsv *rsv);
60int 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);
63int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor);
64int 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);
67int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
68			    struct btrfs_block_rsv *dst_rsv, u64 num_bytes,
69			    bool update_size);
70int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes);
71int btrfs_cond_migrate_bytes(struct btrfs_fs_info *fs_info,
72			     struct btrfs_block_rsv *dest, u64 num_bytes,
73			     int min_factor);
74void btrfs_block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
75			       u64 num_bytes, bool update_size);
76u64 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);
79void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info);
80void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info);
81void btrfs_release_global_block_rsv(struct btrfs_fs_info *fs_info);
82struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans,
83					    struct btrfs_root *root,
84					    u32 blocksize);
85static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info,
86					 struct btrfs_block_rsv *block_rsv,
87					 u32 blocksize)
88{
89	btrfs_block_rsv_add_bytes(block_rsv, blocksize, false);
90	btrfs_block_rsv_release(fs_info, block_rsv, 0, NULL);
91}
92
93#endif /* BTRFS_BLOCK_RSV_H */