1 /* 2 * Copyright (c) 2000-2002,2005 Silicon Graphics, Inc. 3 * All Rights Reserved. 4 * 5 * This program is free software; you can redistribute it and/or 6 * modify it under the terms of the GNU General Public License as 7 * published by the Free Software Foundation. 8 * 9 * This program is distributed in the hope that it would be useful, 10 * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public License 15 * along with this program; if not, write the Free Software Foundation, 16 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA 17 */ 18 #ifndef __XFS_ALLOC_H__ 19 #define __XFS_ALLOC_H__ 20 21 struct xfs_buf; 22 struct xfs_mount; 23 struct xfs_perag; 24 struct xfs_trans; 25 26 /* 27 * Freespace allocation types. Argument to xfs_alloc_[v]extent. 28 */ 29 typedef enum xfs_alloctype 30 { 31 XFS_ALLOCTYPE_ANY_AG, /* allocate anywhere, use rotor */ 32 XFS_ALLOCTYPE_FIRST_AG, /* ... start at ag 0 */ 33 XFS_ALLOCTYPE_START_AG, /* anywhere, start in this a.g. */ 34 XFS_ALLOCTYPE_THIS_AG, /* anywhere in this a.g. */ 35 XFS_ALLOCTYPE_START_BNO, /* near this block else anywhere */ 36 XFS_ALLOCTYPE_NEAR_BNO, /* in this a.g. and near this block */ 37 XFS_ALLOCTYPE_THIS_BNO /* at exactly this block */ 38 } xfs_alloctype_t; 39 40 /* 41 * Flags for xfs_alloc_fix_freelist. 42 */ 43 #define XFS_ALLOC_FLAG_TRYLOCK 0x00000001 /* use trylock for buffer locking */ 44 45 /* 46 * Argument structure for xfs_alloc routines. 47 * This is turned into a structure to avoid having 20 arguments passed 48 * down several levels of the stack. 49 */ 50 typedef struct xfs_alloc_arg { 51 struct xfs_trans *tp; /* transaction pointer */ 52 struct xfs_mount *mp; /* file system mount point */ 53 struct xfs_buf *agbp; /* buffer for a.g. freelist header */ 54 struct xfs_perag *pag; /* per-ag struct for this agno */ 55 xfs_fsblock_t fsbno; /* file system block number */ 56 xfs_agnumber_t agno; /* allocation group number */ 57 xfs_agblock_t agbno; /* allocation group-relative block # */ 58 xfs_extlen_t minlen; /* minimum size of extent */ 59 xfs_extlen_t maxlen; /* maximum size of extent */ 60 xfs_extlen_t mod; /* mod value for extent size */ 61 xfs_extlen_t prod; /* prod value for extent size */ 62 xfs_extlen_t minleft; /* min blocks must be left after us */ 63 xfs_extlen_t total; /* total blocks needed in xaction */ 64 xfs_extlen_t alignment; /* align answer to multiple of this */ 65 xfs_extlen_t minalignslop; /* slop for minlen+alignment calcs */ 66 xfs_extlen_t len; /* output: actual size of extent */ 67 xfs_alloctype_t type; /* allocation type XFS_ALLOCTYPE_... */ 68 xfs_alloctype_t otype; /* original allocation type */ 69 char wasdel; /* set if allocation was prev delayed */ 70 char wasfromfl; /* set if allocation is from freelist */ 71 char isfl; /* set if is freelist blocks - !acctg */ 72 char userdata; /* set if this is user data */ 73 } xfs_alloc_arg_t; 74 75 /* 76 * Defines for userdata 77 */ 78 #define XFS_ALLOC_USERDATA 1 /* allocation is for user data*/ 79 #define XFS_ALLOC_INITIAL_USER_DATA 2 /* special case start of file */ 80 81 82 #ifdef __KERNEL__ 83 84 #if defined(XFS_ALLOC_TRACE) 85 /* 86 * Allocation tracing buffer size. 87 */ 88 #define XFS_ALLOC_TRACE_SIZE 4096 89 extern ktrace_t *xfs_alloc_trace_buf; 90 91 /* 92 * Types for alloc tracing. 93 */ 94 #define XFS_ALLOC_KTRACE_ALLOC 1 95 #define XFS_ALLOC_KTRACE_FREE 2 96 #define XFS_ALLOC_KTRACE_MODAGF 3 97 #define XFS_ALLOC_KTRACE_BUSY 4 98 #define XFS_ALLOC_KTRACE_UNBUSY 5 99 #define XFS_ALLOC_KTRACE_BUSYSEARCH 6 100 #endif 101 102 /* 103 * Compute and fill in value of m_ag_maxlevels. 104 */ 105 void 106 xfs_alloc_compute_maxlevels( 107 struct xfs_mount *mp); /* file system mount structure */ 108 109 /* 110 * Get a block from the freelist. 111 * Returns with the buffer for the block gotten. 112 */ 113 int /* error */ 114 xfs_alloc_get_freelist( 115 struct xfs_trans *tp, /* transaction pointer */ 116 struct xfs_buf *agbp, /* buffer containing the agf structure */ 117 xfs_agblock_t *bnop); /* block address retrieved from freelist */ 118 119 /* 120 * Log the given fields from the agf structure. 121 */ 122 void 123 xfs_alloc_log_agf( 124 struct xfs_trans *tp, /* transaction pointer */ 125 struct xfs_buf *bp, /* buffer for a.g. freelist header */ 126 int fields);/* mask of fields to be logged (XFS_AGF_...) */ 127 128 /* 129 * Interface for inode allocation to force the pag data to be initialized. 130 */ 131 int /* error */ 132 xfs_alloc_pagf_init( 133 struct xfs_mount *mp, /* file system mount structure */ 134 struct xfs_trans *tp, /* transaction pointer */ 135 xfs_agnumber_t agno, /* allocation group number */ 136 int flags); /* XFS_ALLOC_FLAGS_... */ 137 138 /* 139 * Put the block on the freelist for the allocation group. 140 */ 141 int /* error */ 142 xfs_alloc_put_freelist( 143 struct xfs_trans *tp, /* transaction pointer */ 144 struct xfs_buf *agbp, /* buffer for a.g. freelist header */ 145 struct xfs_buf *agflbp,/* buffer for a.g. free block array */ 146 xfs_agblock_t bno); /* block being freed */ 147 148 /* 149 * Read in the allocation group header (free/alloc section). 150 */ 151 int /* error */ 152 xfs_alloc_read_agf( 153 struct xfs_mount *mp, /* mount point structure */ 154 struct xfs_trans *tp, /* transaction pointer */ 155 xfs_agnumber_t agno, /* allocation group number */ 156 int flags, /* XFS_ALLOC_FLAG_... */ 157 struct xfs_buf **bpp); /* buffer for the ag freelist header */ 158 159 /* 160 * Allocate an extent (variable-size). 161 */ 162 int /* error */ 163 xfs_alloc_vextent( 164 xfs_alloc_arg_t *args); /* allocation argument structure */ 165 166 /* 167 * Free an extent. 168 */ 169 int /* error */ 170 xfs_free_extent( 171 struct xfs_trans *tp, /* transaction pointer */ 172 xfs_fsblock_t bno, /* starting block number of extent */ 173 xfs_extlen_t len); /* length of extent */ 174 175 void 176 xfs_alloc_mark_busy(xfs_trans_t *tp, 177 xfs_agnumber_t agno, 178 xfs_agblock_t bno, 179 xfs_extlen_t len); 180 181 void 182 xfs_alloc_clear_busy(xfs_trans_t *tp, 183 xfs_agnumber_t ag, 184 int idx); 185 186 187 #endif /* __KERNEL__ */ 188 189 #endif /* __XFS_ALLOC_H__ */ 190