linux/fs/btrfs/block-rsv.h
<<
>>
Prefs
   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 */
 102