OpenCores
URL https://opencores.org/ocsvn/test_project/test_project/trunk

Subversion Repositories test_project

[/] [test_project/] [trunk/] [linux_sd_driver/] [fs/] [xfs/] [xfs_bmap.h] - Blame information for rev 82

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 62 marcus.erl
/*
2
 * Copyright (c) 2000-2006 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_BMAP_H__
19
#define __XFS_BMAP_H__
20
 
21
struct getbmap;
22
struct xfs_bmbt_irec;
23
struct xfs_ifork;
24
struct xfs_inode;
25
struct xfs_mount;
26
struct xfs_trans;
27
 
28
/*
29
 * DELTA: describe a change to the in-core extent list.
30
 *
31
 * Internally the use of xed_blockount is somewhat funky.
32
 * xed_blockcount contains an offset much of the time because this
33
 * makes merging changes easier.  (xfs_fileoff_t and xfs_filblks_t are
34
 * the same underlying type).
35
 */
36
typedef struct xfs_extdelta
37
{
38
        xfs_fileoff_t           xed_startoff;   /* offset of range */
39
        xfs_filblks_t           xed_blockcount; /* blocks in range */
40
} xfs_extdelta_t;
41
 
42
/*
43
 * List of extents to be free "later".
44
 * The list is kept sorted on xbf_startblock.
45
 */
46
typedef struct xfs_bmap_free_item
47
{
48
        xfs_fsblock_t           xbfi_startblock;/* starting fs block number */
49
        xfs_extlen_t            xbfi_blockcount;/* number of blocks in extent */
50
        struct xfs_bmap_free_item *xbfi_next;   /* link to next entry */
51
} xfs_bmap_free_item_t;
52
 
53
/*
54
 * Header for free extent list.
55
 */
56
typedef struct xfs_bmap_free
57
{
58
        xfs_bmap_free_item_t    *xbf_first;     /* list of to-be-free extents */
59
        int                     xbf_count;      /* count of items on list */
60
        int                     xbf_low;        /* kludge: alloc in low mode */
61
} xfs_bmap_free_t;
62
 
63
#define XFS_BMAP_MAX_NMAP       4
64
 
65
/*
66
 * Flags for xfs_bmapi
67
 */
68
#define XFS_BMAPI_WRITE         0x001   /* write operation: allocate space */
69
#define XFS_BMAPI_DELAY         0x002   /* delayed write operation */
70
#define XFS_BMAPI_ENTIRE        0x004   /* return entire extent, not trimmed */
71
#define XFS_BMAPI_METADATA      0x008   /* mapping metadata not user data */
72
#define XFS_BMAPI_EXACT         0x010   /* allocate only to spec'd bounds */
73
#define XFS_BMAPI_ATTRFORK      0x020   /* use attribute fork not data */
74
#define XFS_BMAPI_ASYNC         0x040   /* bunmapi xactions can be async */
75
#define XFS_BMAPI_RSVBLOCKS     0x080   /* OK to alloc. reserved data blocks */
76
#define XFS_BMAPI_PREALLOC      0x100   /* preallocation op: unwritten space */
77
#define XFS_BMAPI_IGSTATE       0x200   /* Ignore state - */
78
                                        /* combine contig. space */
79
#define XFS_BMAPI_CONTIG        0x400   /* must allocate only one extent */
80
/*      XFS_BMAPI_DIRECT_IO     0x800   */
81
#define XFS_BMAPI_CONVERT       0x1000  /* unwritten extent conversion - */
82
                                        /* need write cache flushing and no */
83
                                        /* additional allocation alignments */
84
 
85
#define XFS_BMAPI_AFLAG(w)      xfs_bmapi_aflag(w)
86
static inline int xfs_bmapi_aflag(int w)
87
{
88
        return (w == XFS_ATTR_FORK ? XFS_BMAPI_ATTRFORK : 0);
89
}
90
 
91
/*
92
 * Special values for xfs_bmbt_irec_t br_startblock field.
93
 */
94
#define DELAYSTARTBLOCK         ((xfs_fsblock_t)-1LL)
95
#define HOLESTARTBLOCK          ((xfs_fsblock_t)-2LL)
96
 
97
#define XFS_BMAP_INIT(flp,fbp)  xfs_bmap_init(flp,fbp)
98
static inline void xfs_bmap_init(xfs_bmap_free_t *flp, xfs_fsblock_t *fbp)
99
{
100
        ((flp)->xbf_first = NULL, (flp)->xbf_count = 0, \
101
                (flp)->xbf_low = 0, *(fbp) = NULLFSBLOCK);
102
}
103
 
104
/*
105
 * Argument structure for xfs_bmap_alloc.
106
 */
107
typedef struct xfs_bmalloca {
108
        xfs_fsblock_t           firstblock; /* i/o first block allocated */
109
        xfs_fsblock_t           rval;   /* starting block of new extent */
110
        xfs_fileoff_t           off;    /* offset in file filling in */
111
        struct xfs_trans        *tp;    /* transaction pointer */
112
        struct xfs_inode        *ip;    /* incore inode pointer */
113
        struct xfs_bmbt_irec    *prevp; /* extent before the new one */
114
        struct xfs_bmbt_irec    *gotp;  /* extent after, or delayed */
115
        xfs_extlen_t            alen;   /* i/o length asked/allocated */
116
        xfs_extlen_t            total;  /* total blocks needed for xaction */
117
        xfs_extlen_t            minlen; /* mininum allocation size (blocks) */
118
        xfs_extlen_t            minleft; /* amount must be left after alloc */
119
        char                    eof;    /* set if allocating past last extent */
120
        char                    wasdel; /* replacing a delayed allocation */
121
        char                    userdata;/* set if is user data */
122
        char                    low;    /* low on space, using seq'l ags */
123
        char                    aeof;   /* allocated space at eof */
124
        char                    conv;   /* overwriting unwritten extents */
125
} xfs_bmalloca_t;
126
 
127
#ifdef __KERNEL__
128
 
129
#if defined(XFS_BMAP_TRACE)
130
/*
131
 * Trace operations for bmap extent tracing
132
 */
133
#define XFS_BMAP_KTRACE_DELETE  1
134
#define XFS_BMAP_KTRACE_INSERT  2
135
#define XFS_BMAP_KTRACE_PRE_UP  3
136
#define XFS_BMAP_KTRACE_POST_UP 4
137
 
138
#define XFS_BMAP_TRACE_SIZE     4096    /* size of global trace buffer */
139
#define XFS_BMAP_KTRACE_SIZE    32      /* size of per-inode trace buffer */
140
extern ktrace_t *xfs_bmap_trace_buf;
141
 
142
/*
143
 * Add bmap trace insert entries for all the contents of the extent list.
144
 */
145
void
146
xfs_bmap_trace_exlist(
147
        const char              *fname,         /* function name */
148
        struct xfs_inode        *ip,            /* incore inode pointer */
149
        xfs_extnum_t            cnt,            /* count of entries in list */
150
        int                     whichfork);     /* data or attr fork */
151
#define XFS_BMAP_TRACE_EXLIST(ip,c,w)   \
152
        xfs_bmap_trace_exlist(__FUNCTION__,ip,c,w)
153
#else
154
#define XFS_BMAP_TRACE_EXLIST(ip,c,w)
155
#endif
156
 
157
/*
158
 * Convert inode from non-attributed to attributed.
159
 * Must not be in a transaction, ip must not be locked.
160
 */
161
int                                     /* error code */
162
xfs_bmap_add_attrfork(
163
        struct xfs_inode        *ip,    /* incore inode pointer */
164
        int                     size,   /* space needed for new attribute */
165
        int                     rsvd);  /* flag for reserved block allocation */
166
 
167
/*
168
 * Add the extent to the list of extents to be free at transaction end.
169
 * The list is maintained sorted (by block number).
170
 */
171
void
172
xfs_bmap_add_free(
173
        xfs_fsblock_t           bno,            /* fs block number of extent */
174
        xfs_filblks_t           len,            /* length of extent */
175
        xfs_bmap_free_t         *flist,         /* list of extents */
176
        struct xfs_mount        *mp);           /* mount point structure */
177
 
178
/*
179
 * Routine to clean up the free list data structure when
180
 * an error occurs during a transaction.
181
 */
182
void
183
xfs_bmap_cancel(
184
        xfs_bmap_free_t         *flist);        /* free list to clean up */
185
 
186
/*
187
 * Compute and fill in the value of the maximum depth of a bmap btree
188
 * in this filesystem.  Done once, during mount.
189
 */
190
void
191
xfs_bmap_compute_maxlevels(
192
        struct xfs_mount        *mp,    /* file system mount structure */
193
        int                     whichfork);     /* data or attr fork */
194
 
195
/*
196
 * Routine to be called at transaction's end by xfs_bmapi, xfs_bunmapi
197
 * caller.  Frees all the extents that need freeing, which must be done
198
 * last due to locking considerations.
199
 *
200
 * Return 1 if the given transaction was committed and a new one allocated,
201
 * and 0 otherwise.
202
 */
203
int                                             /* error */
204
xfs_bmap_finish(
205
        struct xfs_trans        **tp,           /* transaction pointer addr */
206
        xfs_bmap_free_t         *flist,         /* i/o: list extents to free */
207
        int                     *committed);    /* xact committed or not */
208
 
209
/*
210
 * Returns the file-relative block number of the first unused block in the file.
211
 * This is the lowest-address hole if the file has holes, else the first block
212
 * past the end of file.
213
 */
214
int                                             /* error */
215
xfs_bmap_first_unused(
216
        struct xfs_trans        *tp,            /* transaction pointer */
217
        struct xfs_inode        *ip,            /* incore inode */
218
        xfs_extlen_t            len,            /* size of hole to find */
219
        xfs_fileoff_t           *unused,        /* unused block num */
220
        int                     whichfork);     /* data or attr fork */
221
 
222
/*
223
 * Returns the file-relative block number of the last block + 1 before
224
 * last_block (input value) in the file.
225
 * This is not based on i_size, it is based on the extent list.
226
 * Returns 0 for local files, as they do not have an extent list.
227
 */
228
int                                             /* error */
229
xfs_bmap_last_before(
230
        struct xfs_trans        *tp,            /* transaction pointer */
231
        struct xfs_inode        *ip,            /* incore inode */
232
        xfs_fileoff_t           *last_block,    /* last block */
233
        int                     whichfork);     /* data or attr fork */
234
 
235
/*
236
 * Returns the file-relative block number of the first block past eof in
237
 * the file.  This is not based on i_size, it is based on the extent list.
238
 * Returns 0 for local files, as they do not have an extent list.
239
 */
240
int                                             /* error */
241
xfs_bmap_last_offset(
242
        struct xfs_trans        *tp,            /* transaction pointer */
243
        struct xfs_inode        *ip,            /* incore inode */
244
        xfs_fileoff_t           *unused,        /* last block num */
245
        int                     whichfork);     /* data or attr fork */
246
 
247
/*
248
 * Returns whether the selected fork of the inode has exactly one
249
 * block or not.  For the data fork we check this matches di_size,
250
 * implying the file's range is 0..bsize-1.
251
 */
252
int
253
xfs_bmap_one_block(
254
        struct xfs_inode        *ip,            /* incore inode */
255
        int                     whichfork);     /* data or attr fork */
256
 
257
/*
258
 * Read in the extents to iu_extents.
259
 * All inode fields are set up by caller, we just traverse the btree
260
 * and copy the records in.
261
 */
262
int                                             /* error */
263
xfs_bmap_read_extents(
264
        struct xfs_trans        *tp,            /* transaction pointer */
265
        struct xfs_inode        *ip,            /* incore inode */
266
        int                     whichfork);     /* data or attr fork */
267
 
268
/*
269
 * Map file blocks to filesystem blocks.
270
 * File range is given by the bno/len pair.
271
 * Adds blocks to file if a write ("flags & XFS_BMAPI_WRITE" set)
272
 * into a hole or past eof.
273
 * Only allocates blocks from a single allocation group,
274
 * to avoid locking problems.
275
 * The returned value in "firstblock" from the first call in a transaction
276
 * must be remembered and presented to subsequent calls in "firstblock".
277
 * An upper bound for the number of blocks to be allocated is supplied to
278
 * the first call in "total"; if no allocation group has that many free
279
 * blocks then the call will fail (return NULLFSBLOCK in "firstblock").
280
 */
281
int                                             /* error */
282
xfs_bmapi(
283
        struct xfs_trans        *tp,            /* transaction pointer */
284
        struct xfs_inode        *ip,            /* incore inode */
285
        xfs_fileoff_t           bno,            /* starting file offs. mapped */
286
        xfs_filblks_t           len,            /* length to map in file */
287
        int                     flags,          /* XFS_BMAPI_... */
288
        xfs_fsblock_t           *firstblock,    /* first allocated block
289
                                                   controls a.g. for allocs */
290
        xfs_extlen_t            total,          /* total blocks needed */
291
        struct xfs_bmbt_irec    *mval,          /* output: map values */
292
        int                     *nmap,          /* i/o: mval size/count */
293
        xfs_bmap_free_t         *flist,         /* i/o: list extents to free */
294
        xfs_extdelta_t          *delta);        /* o: change made to incore
295
                                                   extents */
296
 
297
/*
298
 * Map file blocks to filesystem blocks, simple version.
299
 * One block only, read-only.
300
 * For flags, only the XFS_BMAPI_ATTRFORK flag is examined.
301
 * For the other flag values, the effect is as if XFS_BMAPI_METADATA
302
 * was set and all the others were clear.
303
 */
304
int                                             /* error */
305
xfs_bmapi_single(
306
        struct xfs_trans        *tp,            /* transaction pointer */
307
        struct xfs_inode        *ip,            /* incore inode */
308
        int                     whichfork,      /* data or attr fork */
309
        xfs_fsblock_t           *fsb,           /* output: mapped block */
310
        xfs_fileoff_t           bno);           /* starting file offs. mapped */
311
 
312
/*
313
 * Unmap (remove) blocks from a file.
314
 * If nexts is nonzero then the number of extents to remove is limited to
315
 * that value.  If not all extents in the block range can be removed then
316
 * *done is set.
317
 */
318
int                                             /* error */
319
xfs_bunmapi(
320
        struct xfs_trans        *tp,            /* transaction pointer */
321
        struct xfs_inode        *ip,            /* incore inode */
322
        xfs_fileoff_t           bno,            /* starting offset to unmap */
323
        xfs_filblks_t           len,            /* length to unmap in file */
324
        int                     flags,          /* XFS_BMAPI_... */
325
        xfs_extnum_t            nexts,          /* number of extents max */
326
        xfs_fsblock_t           *firstblock,    /* first allocated block
327
                                                   controls a.g. for allocs */
328
        xfs_bmap_free_t         *flist,         /* i/o: list extents to free */
329
        xfs_extdelta_t          *delta,         /* o: change made to incore
330
                                                   extents */
331
        int                     *done);         /* set if not done yet */
332
 
333
/*
334
 * Fcntl interface to xfs_bmapi.
335
 */
336
int                                             /* error code */
337
xfs_getbmap(
338
        xfs_inode_t             *ip,
339
        struct getbmap          *bmv,           /* user bmap structure */
340
        void                    __user *ap,     /* pointer to user's array */
341
        int                     iflags);        /* interface flags */
342
 
343
/*
344
 * Check if the endoff is outside the last extent. If so the caller will grow
345
 * the allocation to a stripe unit boundary
346
 */
347
int
348
xfs_bmap_eof(
349
        struct xfs_inode        *ip,
350
        xfs_fileoff_t           endoff,
351
        int                     whichfork,
352
        int                     *eof);
353
 
354
/*
355
 * Count fsblocks of the given fork.
356
 */
357
int
358
xfs_bmap_count_blocks(
359
        xfs_trans_t             *tp,
360
        struct xfs_inode        *ip,
361
        int                     whichfork,
362
        int                     *count);
363
 
364
/*
365
 * Check an extent list, which has just been read, for
366
 * any bit in the extent flag field.
367
 */
368
int
369
xfs_check_nostate_extents(
370
        struct xfs_ifork        *ifp,
371
        xfs_extnum_t            idx,
372
        xfs_extnum_t            num);
373
 
374
/*
375
 * Search the extent records for the entry containing block bno.
376
 * If bno lies in a hole, point to the next entry.  If bno lies
377
 * past eof, *eofp will be set, and *prevp will contain the last
378
 * entry (null if none).  Else, *lastxp will be set to the index
379
 * of the found entry; *gotp will contain the entry.
380
 */
381
xfs_bmbt_rec_host_t *
382
xfs_bmap_search_multi_extents(struct xfs_ifork *, xfs_fileoff_t, int *,
383
                        xfs_extnum_t *, xfs_bmbt_irec_t *, xfs_bmbt_irec_t *);
384
 
385
#endif  /* __KERNEL__ */
386
 
387
#endif  /* __XFS_BMAP_H__ */

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.