0001
0002
0003 #ifndef BTRFS_BLOCK_RSV_H
0004 #define BTRFS_BLOCK_RSV_H
0005
0006 struct btrfs_trans_handle;
0007 enum btrfs_reserve_flush_enum;
0008
0009
0010
0011
0012 enum btrfs_rsv_type {
0013 BTRFS_BLOCK_RSV_GLOBAL,
0014 BTRFS_BLOCK_RSV_DELALLOC,
0015 BTRFS_BLOCK_RSV_TRANS,
0016 BTRFS_BLOCK_RSV_CHUNK,
0017 BTRFS_BLOCK_RSV_DELOPS,
0018 BTRFS_BLOCK_RSV_DELREFS,
0019 BTRFS_BLOCK_RSV_EMPTY,
0020 BTRFS_BLOCK_RSV_TEMP,
0021 };
0022
0023 struct btrfs_block_rsv {
0024 u64 size;
0025 u64 reserved;
0026 struct btrfs_space_info *space_info;
0027 spinlock_t lock;
0028 bool full;
0029 bool failfast;
0030
0031 enum btrfs_rsv_type type:8;
0032
0033
0034
0035
0036
0037
0038
0039
0040
0041
0042
0043
0044
0045
0046
0047
0048
0049 u64 qgroup_rsv_size;
0050 u64 qgroup_rsv_reserved;
0051 };
0052
0053 void btrfs_init_block_rsv(struct btrfs_block_rsv *rsv, enum btrfs_rsv_type type);
0054 void btrfs_init_root_block_rsv(struct btrfs_root *root);
0055 struct btrfs_block_rsv *btrfs_alloc_block_rsv(struct btrfs_fs_info *fs_info,
0056 enum btrfs_rsv_type type);
0057 void btrfs_init_metadata_block_rsv(struct btrfs_fs_info *fs_info,
0058 struct btrfs_block_rsv *rsv,
0059 enum btrfs_rsv_type type);
0060 void btrfs_free_block_rsv(struct btrfs_fs_info *fs_info,
0061 struct btrfs_block_rsv *rsv);
0062 int btrfs_block_rsv_add(struct btrfs_fs_info *fs_info,
0063 struct btrfs_block_rsv *block_rsv, u64 num_bytes,
0064 enum btrfs_reserve_flush_enum flush);
0065 int btrfs_block_rsv_check(struct btrfs_block_rsv *block_rsv, int min_factor);
0066 int btrfs_block_rsv_refill(struct btrfs_fs_info *fs_info,
0067 struct btrfs_block_rsv *block_rsv, u64 min_reserved,
0068 enum btrfs_reserve_flush_enum flush);
0069 int btrfs_block_rsv_migrate(struct btrfs_block_rsv *src_rsv,
0070 struct btrfs_block_rsv *dst_rsv, u64 num_bytes,
0071 bool update_size);
0072 int btrfs_block_rsv_use_bytes(struct btrfs_block_rsv *block_rsv, u64 num_bytes);
0073 int btrfs_cond_migrate_bytes(struct btrfs_fs_info *fs_info,
0074 struct btrfs_block_rsv *dest, u64 num_bytes,
0075 int min_factor);
0076 void btrfs_block_rsv_add_bytes(struct btrfs_block_rsv *block_rsv,
0077 u64 num_bytes, bool update_size);
0078 u64 btrfs_block_rsv_release(struct btrfs_fs_info *fs_info,
0079 struct btrfs_block_rsv *block_rsv,
0080 u64 num_bytes, u64 *qgroup_to_release);
0081 void btrfs_update_global_block_rsv(struct btrfs_fs_info *fs_info);
0082 void btrfs_init_global_block_rsv(struct btrfs_fs_info *fs_info);
0083 void btrfs_release_global_block_rsv(struct btrfs_fs_info *fs_info);
0084 struct btrfs_block_rsv *btrfs_use_block_rsv(struct btrfs_trans_handle *trans,
0085 struct btrfs_root *root,
0086 u32 blocksize);
0087 static inline void btrfs_unuse_block_rsv(struct btrfs_fs_info *fs_info,
0088 struct btrfs_block_rsv *block_rsv,
0089 u32 blocksize)
0090 {
0091 btrfs_block_rsv_add_bytes(block_rsv, blocksize, false);
0092 btrfs_block_rsv_release(fs_info, block_rsv, 0, NULL);
0093 }
0094
0095 #endif