Linux Audio

Check our new training course

Loading...
Note: File does not exist in v4.6.
  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);
 85
 86static 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
 93static 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 */