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