Back to home page

OSCL-LXR

 
 

    


0001 /* SPDX-License-Identifier: GPL-2.0 */
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  * Types of block reserves
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     /* Block reserve type, one of BTRFS_BLOCK_RSV_* */
0031     enum btrfs_rsv_type type:8;
0032 
0033     /*
0034      * Qgroup equivalent for @size @reserved
0035      *
0036      * Unlike normal @size/@reserved for inode rsv, qgroup doesn't care
0037      * about things like csum size nor how many tree blocks it will need to
0038      * reserve.
0039      *
0040      * Qgroup cares more about net change of the extent usage.
0041      *
0042      * So for one newly inserted file extent, in worst case it will cause
0043      * leaf split and level increase, nodesize for each file extent is
0044      * already too much.
0045      *
0046      * In short, qgroup_size/reserved is the upper limit of possible needed
0047      * qgroup metadata reservation.
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 /* BTRFS_BLOCK_RSV_H */