^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) #ifndef __XFS_ALLOC_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #define __XFS_ALLOC_H__
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) struct xfs_buf;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) struct xfs_btree_cur;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) struct xfs_mount;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) struct xfs_perag;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) struct xfs_trans;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) extern struct workqueue_struct *xfs_alloc_wq;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) unsigned int xfs_agfl_size(struct xfs_mount *mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * Freespace allocation types. Argument to xfs_alloc_[v]extent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #define XFS_ALLOCTYPE_FIRST_AG 0x02 /* ... start at ag 0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #define XFS_ALLOCTYPE_THIS_AG 0x08 /* anywhere in this a.g. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #define XFS_ALLOCTYPE_START_BNO 0x10 /* near this block else anywhere */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #define XFS_ALLOCTYPE_NEAR_BNO 0x20 /* in this a.g. and near this block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) #define XFS_ALLOCTYPE_THIS_BNO 0x40 /* at exactly this block */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) /* this should become an enum again when the tracing code is fixed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) typedef unsigned int xfs_alloctype_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) #define XFS_ALLOC_TYPES \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) { XFS_ALLOCTYPE_FIRST_AG, "FIRST_AG" }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) { XFS_ALLOCTYPE_THIS_AG, "THIS_AG" }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) { XFS_ALLOCTYPE_START_BNO, "START_BNO" }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) { XFS_ALLOCTYPE_NEAR_BNO, "NEAR_BNO" }, \
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) { XFS_ALLOCTYPE_THIS_BNO, "THIS_BNO" }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * Flags for xfs_alloc_fix_freelist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) #define XFS_ALLOC_FLAG_TRYLOCK 0x00000001 /* use trylock for buffer locking */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) #define XFS_ALLOC_FLAG_FREEING 0x00000002 /* indicate caller is freeing extents*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) #define XFS_ALLOC_FLAG_NORMAP 0x00000004 /* don't modify the rmapbt */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) #define XFS_ALLOC_FLAG_NOSHRINK 0x00000008 /* don't shrink the freelist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) #define XFS_ALLOC_FLAG_CHECK 0x00000010 /* test only, don't modify args */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) * Argument structure for xfs_alloc routines.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) * This is turned into a structure to avoid having 20 arguments passed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) * down several levels of the stack.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) typedef struct xfs_alloc_arg {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) struct xfs_trans *tp; /* transaction pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) struct xfs_mount *mp; /* file system mount point */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) struct xfs_buf *agbp; /* buffer for a.g. freelist header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) struct xfs_perag *pag; /* per-ag struct for this agno */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) xfs_fsblock_t fsbno; /* file system block number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) xfs_agnumber_t agno; /* allocation group number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) xfs_agblock_t agbno; /* allocation group-relative block # */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) xfs_extlen_t minlen; /* minimum size of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) xfs_extlen_t maxlen; /* maximum size of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) xfs_extlen_t mod; /* mod value for extent size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) xfs_extlen_t prod; /* prod value for extent size */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) xfs_extlen_t minleft; /* min blocks must be left after us */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) xfs_extlen_t total; /* total blocks needed in xaction */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) xfs_extlen_t alignment; /* align answer to multiple of this */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) xfs_extlen_t minalignslop; /* slop for minlen+alignment calcs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) xfs_agblock_t min_agbno; /* set an agbno range for NEAR allocs */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) xfs_agblock_t max_agbno; /* ... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) xfs_extlen_t len; /* output: actual size of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) xfs_alloctype_t otype; /* original allocation type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) int datatype; /* mask defining data type treatment */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) char wasdel; /* set if allocation was prev delayed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) char wasfromfl; /* set if allocation is from freelist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) struct xfs_owner_info oinfo; /* owner of blocks being allocated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) enum xfs_ag_resv_type resv; /* block reservation to use */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) } xfs_alloc_arg_t;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) * Defines for datatype
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) #define XFS_ALLOC_USERDATA (1 << 0)/* allocation is for user data*/
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) #define XFS_ALLOC_INITIAL_USER_DATA (1 << 1)/* special case start of file */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) #define XFS_ALLOC_NOBUSY (1 << 2)/* Busy extents not allowed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) /* freespace limit calculations */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) #define XFS_ALLOC_AGFL_RESERVE 4
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) unsigned int xfs_alloc_set_aside(struct xfs_mount *mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) unsigned int xfs_alloc_ag_max_usable(struct xfs_mount *mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) xfs_extlen_t xfs_alloc_longest_free_extent(struct xfs_perag *pag,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) xfs_extlen_t need, xfs_extlen_t reserved);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) unsigned int xfs_alloc_min_freelist(struct xfs_mount *mp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) struct xfs_perag *pag);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * Compute and fill in value of m_ag_maxlevels.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) xfs_alloc_compute_maxlevels(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) struct xfs_mount *mp); /* file system mount structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * Get a block from the freelist.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * Returns with the buffer for the block gotten.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) xfs_alloc_get_freelist(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) struct xfs_trans *tp, /* transaction pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) struct xfs_buf *agbp, /* buffer containing the agf structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) xfs_agblock_t *bnop, /* block address retrieved from freelist */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) int btreeblk); /* destination is a AGF btree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * Log the given fields from the agf structure.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) void
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) xfs_alloc_log_agf(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) struct xfs_trans *tp, /* transaction pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) struct xfs_buf *bp, /* buffer for a.g. freelist header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) int fields);/* mask of fields to be logged (XFS_AGF_...) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) * Interface for inode allocation to force the pag data to be initialized.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) xfs_alloc_pagf_init(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) struct xfs_mount *mp, /* file system mount structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) struct xfs_trans *tp, /* transaction pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) xfs_agnumber_t agno, /* allocation group number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) int flags); /* XFS_ALLOC_FLAGS_... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * Put the block on the freelist for the allocation group.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) xfs_alloc_put_freelist(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) struct xfs_trans *tp, /* transaction pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) struct xfs_buf *agbp, /* buffer for a.g. freelist header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) struct xfs_buf *agflbp,/* buffer for a.g. free block array */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) xfs_agblock_t bno, /* block being freed */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) int btreeblk); /* owner was a AGF btree */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146) * Read in the allocation group header (free/alloc section).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) xfs_alloc_read_agf(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) struct xfs_mount *mp, /* mount point structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) struct xfs_trans *tp, /* transaction pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) xfs_agnumber_t agno, /* allocation group number */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) int flags, /* XFS_ALLOC_FLAG_... */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) struct xfs_buf **bpp); /* buffer for the ag freelist header */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) * Allocate an extent (variable-size).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) xfs_alloc_vextent(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) xfs_alloc_arg_t *args); /* allocation argument structure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) * Free an extent.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) __xfs_free_extent(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) struct xfs_trans *tp, /* transaction pointer */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) xfs_fsblock_t bno, /* starting block number of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) xfs_extlen_t len, /* length of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) const struct xfs_owner_info *oinfo, /* extent owner */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) enum xfs_ag_resv_type type, /* block reservation type */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) bool skip_discard);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static inline int
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) xfs_free_extent(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) struct xfs_trans *tp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) xfs_fsblock_t bno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179) xfs_extlen_t len,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) const struct xfs_owner_info *oinfo,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) enum xfs_ag_resv_type type)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) return __xfs_free_extent(tp, bno, len, oinfo, type, false);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) xfs_alloc_lookup_le(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) struct xfs_btree_cur *cur, /* btree cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) xfs_agblock_t bno, /* starting block of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190) xfs_extlen_t len, /* length of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191) int *stat); /* success/failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) xfs_alloc_lookup_ge(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct xfs_btree_cur *cur, /* btree cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196) xfs_agblock_t bno, /* starting block of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) xfs_extlen_t len, /* length of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) int *stat); /* success/failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) int /* error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) xfs_alloc_get_rec(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) struct xfs_btree_cur *cur, /* btree cursor */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) xfs_agblock_t *bno, /* output: starting block of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) xfs_extlen_t *len, /* output: length of extent */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) int *stat); /* output: success/failure */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) int xfs_read_agf(struct xfs_mount *mp, struct xfs_trans *tp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) xfs_agnumber_t agno, int flags, struct xfs_buf **bpp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) int xfs_alloc_read_agfl(struct xfs_mount *mp, struct xfs_trans *tp,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) xfs_agnumber_t agno, struct xfs_buf **bpp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) int xfs_free_agfl_block(struct xfs_trans *, xfs_agnumber_t, xfs_agblock_t,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212) struct xfs_buf *, struct xfs_owner_info *);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) int xfs_alloc_fix_freelist(struct xfs_alloc_arg *args, int flags);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) int xfs_free_extent_fix_freelist(struct xfs_trans *tp, xfs_agnumber_t agno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct xfs_buf **agbp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) xfs_extlen_t xfs_prealloc_blocks(struct xfs_mount *mp);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) typedef int (*xfs_alloc_query_range_fn)(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) struct xfs_btree_cur *cur,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) struct xfs_alloc_rec_incore *rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) int xfs_alloc_query_range(struct xfs_btree_cur *cur,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) struct xfs_alloc_rec_incore *low_rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) struct xfs_alloc_rec_incore *high_rec,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) xfs_alloc_query_range_fn fn, void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) int xfs_alloc_query_all(struct xfs_btree_cur *cur, xfs_alloc_query_range_fn fn,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) int xfs_alloc_has_record(struct xfs_btree_cur *cur, xfs_agblock_t bno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) xfs_extlen_t len, bool *exist);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) typedef int (*xfs_agfl_walk_fn)(struct xfs_mount *mp, xfs_agblock_t bno,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) int xfs_agfl_walk(struct xfs_mount *mp, struct xfs_agf *agf,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) struct xfs_buf *agflbp, xfs_agfl_walk_fn walk_fn, void *priv);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) static inline __be32 *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) xfs_buf_to_agfl_bno(
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) struct xfs_buf *bp)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) if (xfs_sb_version_hascrc(&bp->b_mount->m_sb))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) return bp->b_addr + sizeof(struct xfs_agfl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) return bp->b_addr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) #endif /* __XFS_ALLOC_H__ */