Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
fs
xfs
xfs_bmap.h
Go to the documentation of this file.
1
/*
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
extern
kmem_zone_t
*
xfs_bmap_free_item_zone
;
29
30
/*
31
* List of extents to be free "later".
32
* The list is kept sorted on xbf_startblock.
33
*/
34
typedef
struct
xfs_bmap_free_item
35
{
36
xfs_fsblock_t
xbfi_startblock
;
/* starting fs block number */
37
xfs_extlen_t
xbfi_blockcount
;
/* number of blocks in extent */
38
struct
xfs_bmap_free_item
*
xbfi_next
;
/* link to next entry */
39
}
xfs_bmap_free_item_t
;
40
41
/*
42
* Header for free extent list.
43
*
44
* xbf_low is used by the allocator to activate the lowspace algorithm -
45
* when free space is running low the extent allocator may choose to
46
* allocate an extent from an AG without leaving sufficient space for
47
* a btree split when inserting the new extent. In this case the allocator
48
* will enable the lowspace algorithm which is supposed to allow further
49
* allocations (such as btree splits and newroots) to allocate from
50
* sequential AGs. In order to avoid locking AGs out of order the lowspace
51
* algorithm will start searching for free space from AG 0. If the correct
52
* transaction reservations have been made then this algorithm will eventually
53
* find all the space it needs.
54
*/
55
typedef
struct
xfs_bmap_free
56
{
57
xfs_bmap_free_item_t
*
xbf_first
;
/* list of to-be-free extents */
58
int
xbf_count
;
/* count of items on list */
59
int
xbf_low
;
/* alloc in low mode */
60
}
xfs_bmap_free_t
;
61
62
#define XFS_BMAP_MAX_NMAP 4
63
64
/*
65
* Flags for xfs_bmapi_*
66
*/
67
#define XFS_BMAPI_ENTIRE 0x001
/* return entire extent, not trimmed */
68
#define XFS_BMAPI_METADATA 0x002
/* mapping metadata not user data */
69
#define XFS_BMAPI_ATTRFORK 0x004
/* use attribute fork not data */
70
#define XFS_BMAPI_PREALLOC 0x008
/* preallocation op: unwritten space */
71
#define XFS_BMAPI_IGSTATE 0x010
/* Ignore state - */
72
/* combine contig. space */
73
#define XFS_BMAPI_CONTIG 0x020
/* must allocate only one extent */
74
/*
75
* unwritten extent conversion - this needs write cache flushing and no additional
76
* allocation alignments. When specified with XFS_BMAPI_PREALLOC it converts
77
* from written to unwritten, otherwise convert from unwritten to written.
78
*/
79
#define XFS_BMAPI_CONVERT 0x040
80
#define XFS_BMAPI_STACK_SWITCH 0x080
81
82
#define XFS_BMAPI_FLAGS \
83
{ XFS_BMAPI_ENTIRE, "ENTIRE" }, \
84
{ XFS_BMAPI_METADATA, "METADATA" }, \
85
{ XFS_BMAPI_ATTRFORK, "ATTRFORK" }, \
86
{ XFS_BMAPI_PREALLOC, "PREALLOC" }, \
87
{ XFS_BMAPI_IGSTATE, "IGSTATE" }, \
88
{ XFS_BMAPI_CONTIG, "CONTIG" }, \
89
{ XFS_BMAPI_CONVERT, "CONVERT" }, \
90
{ XFS_BMAPI_STACK_SWITCH, "STACK_SWITCH" }
91
92
93
static
inline
int
xfs_bmapi_aflag(
int
w
)
94
{
95
return
(w ==
XFS_ATTR_FORK
?
XFS_BMAPI_ATTRFORK
: 0);
96
}
97
98
/*
99
* Special values for xfs_bmbt_irec_t br_startblock field.
100
*/
101
#define DELAYSTARTBLOCK ((xfs_fsblock_t)-1LL)
102
#define HOLESTARTBLOCK ((xfs_fsblock_t)-2LL)
103
104
static
inline
void
xfs_bmap_init(
xfs_bmap_free_t
*flp,
xfs_fsblock_t
*fbp)
105
{
106
((flp)->xbf_first =
NULL
, (flp)->xbf_count = 0, \
107
(flp)->xbf_low = 0, *(fbp) =
NULLFSBLOCK
);
108
}
109
110
/*
111
* Argument structure for xfs_bmap_alloc.
112
*/
113
typedef
struct
xfs_bmalloca
{
114
xfs_fsblock_t
*
firstblock
;
/* i/o first block allocated */
115
struct
xfs_bmap_free
*
flist
;
/* bmap freelist */
116
struct
xfs_trans *
tp
;
/* transaction pointer */
117
struct
xfs_inode *
ip
;
/* incore inode pointer */
118
struct
xfs_bmbt_irec
prev
;
/* extent before the new one */
119
struct
xfs_bmbt_irec
got
;
/* extent after, or delayed */
120
121
xfs_fileoff_t
offset
;
/* offset in file filling in */
122
xfs_extlen_t
length
;
/* i/o length asked/allocated */
123
xfs_fsblock_t
blkno
;
/* starting block of new extent */
124
125
struct
xfs_btree_cur
*
cur
;
/* btree cursor */
126
xfs_extnum_t
idx
;
/* current extent index */
127
int
nallocs
;
/* number of extents alloc'd */
128
int
logflags
;
/* flags for transaction logging */
129
130
xfs_extlen_t
total
;
/* total blocks needed for xaction */
131
xfs_extlen_t
minlen
;
/* minimum allocation size (blocks) */
132
xfs_extlen_t
minleft
;
/* amount must be left after alloc */
133
char
eof
;
/* set if allocating past last extent */
134
char
wasdel
;
/* replacing a delayed allocation */
135
char
userdata
;
/* set if is user data */
136
char
aeof
;
/* allocated space at eof */
137
char
conv
;
/* overwriting unwritten extents */
138
char
stack_switch
;
139
int
flags
;
140
struct
completion
*
done
;
141
struct
work_struct
work
;
142
int
result
;
143
}
xfs_bmalloca_t
;
144
145
/*
146
* Flags for xfs_bmap_add_extent*.
147
*/
148
#define BMAP_LEFT_CONTIG (1 << 0)
149
#define BMAP_RIGHT_CONTIG (1 << 1)
150
#define BMAP_LEFT_FILLING (1 << 2)
151
#define BMAP_RIGHT_FILLING (1 << 3)
152
#define BMAP_LEFT_DELAY (1 << 4)
153
#define BMAP_RIGHT_DELAY (1 << 5)
154
#define BMAP_LEFT_VALID (1 << 6)
155
#define BMAP_RIGHT_VALID (1 << 7)
156
#define BMAP_ATTRFORK (1 << 8)
157
158
#define XFS_BMAP_EXT_FLAGS \
159
{ BMAP_LEFT_CONTIG, "LC" }, \
160
{ BMAP_RIGHT_CONTIG, "RC" }, \
161
{ BMAP_LEFT_FILLING, "LF" }, \
162
{ BMAP_RIGHT_FILLING, "RF" }, \
163
{ BMAP_ATTRFORK, "ATTR" }
164
165
#if defined(__KERNEL) && defined(DEBUG)
166
void
xfs_bmap_trace_exlist(
struct
xfs_inode *
ip
,
xfs_extnum_t
cnt
,
167
int
whichfork,
unsigned
long
caller_ip);
168
#define XFS_BMAP_TRACE_EXLIST(ip,c,w) \
169
xfs_bmap_trace_exlist(ip,c,w, _THIS_IP_)
170
#else
171
#define XFS_BMAP_TRACE_EXLIST(ip,c,w)
172
#endif
173
174
int
xfs_bmap_add_attrfork
(
struct
xfs_inode *
ip
,
int
size
,
int
rsvd
);
175
void
xfs_bmap_add_free
(
xfs_fsblock_t
bno,
xfs_filblks_t
len,
176
struct
xfs_bmap_free
*flist,
struct
xfs_mount *
mp
);
177
void
xfs_bmap_cancel
(
struct
xfs_bmap_free
*flist);
178
void
xfs_bmap_compute_maxlevels
(
struct
xfs_mount *
mp
,
int
whichfork);
179
int
xfs_bmap_first_unused
(
struct
xfs_trans *tp,
struct
xfs_inode *
ip
,
180
xfs_extlen_t
len,
xfs_fileoff_t
*
unused
,
int
whichfork);
181
int
xfs_bmap_last_before
(
struct
xfs_trans *tp,
struct
xfs_inode *
ip
,
182
xfs_fileoff_t
*last_block,
int
whichfork);
183
int
xfs_bmap_last_offset
(
struct
xfs_trans *tp,
struct
xfs_inode *
ip
,
184
xfs_fileoff_t
*
unused
,
int
whichfork);
185
int
xfs_bmap_one_block
(
struct
xfs_inode *
ip
,
int
whichfork);
186
int
xfs_bmap_read_extents
(
struct
xfs_trans *tp,
struct
xfs_inode *
ip
,
187
int
whichfork);
188
int
xfs_bmapi_read
(
struct
xfs_inode *
ip
,
xfs_fileoff_t
bno,
189
xfs_filblks_t
len,
struct
xfs_bmbt_irec
*mval,
190
int
*nmap,
int
flags
);
191
int
xfs_bmapi_delay
(
struct
xfs_inode *
ip
,
xfs_fileoff_t
bno,
192
xfs_filblks_t
len,
struct
xfs_bmbt_irec
*mval,
193
int
*nmap,
int
flags
);
194
int
xfs_bmapi_write
(
struct
xfs_trans *tp,
struct
xfs_inode *
ip
,
195
xfs_fileoff_t
bno,
xfs_filblks_t
len,
int
flags
,
196
xfs_fsblock_t
*firstblock,
xfs_extlen_t
total,
197
struct
xfs_bmbt_irec
*mval,
int
*nmap,
198
struct
xfs_bmap_free
*flist);
199
int
xfs_bunmapi
(
struct
xfs_trans *tp,
struct
xfs_inode *
ip
,
200
xfs_fileoff_t
bno,
xfs_filblks_t
len,
int
flags
,
201
xfs_extnum_t
nexts,
xfs_fsblock_t
*firstblock,
202
struct
xfs_bmap_free
*flist,
int
*
done
);
203
int
xfs_check_nostate_extents
(
struct
xfs_ifork
*ifp,
xfs_extnum_t
idx
,
204
xfs_extnum_t
num);
205
uint
xfs_default_attroffset
(
struct
xfs_inode *
ip
);
206
207
#ifdef __KERNEL__
208
/* bmap to userspace formatter - copy to user & advance pointer */
209
typedef
int
(*xfs_bmap_format_t)(
void
**,
struct
getbmapx
*,
int
*);
210
211
int
xfs_bmap_finish
(
struct
xfs_trans **tp,
struct
xfs_bmap_free
*flist,
212
int
*committed);
213
int
xfs_getbmap
(
struct
xfs_inode *
ip
,
struct
getbmapx
*bmv,
214
xfs_bmap_format_t formatter,
void
*
arg
);
215
int
xfs_bmap_eof
(
struct
xfs_inode *
ip
,
xfs_fileoff_t
endoff,
216
int
whichfork,
int
*eof);
217
int
xfs_bmap_count_blocks
(
struct
xfs_trans *tp,
struct
xfs_inode *
ip
,
218
int
whichfork,
int
*
count
);
219
int
xfs_bmap_punch_delalloc_range
(
struct
xfs_inode *
ip
,
220
xfs_fileoff_t
start_fsb,
xfs_fileoff_t
length
);
221
222
xfs_daddr_t
xfs_fsb_to_db
(
struct
xfs_inode *
ip
,
xfs_fsblock_t
fsb);
223
224
#endif
/* __KERNEL__ */
225
226
#endif
/* __XFS_BMAP_H__ */
Generated on Thu Jan 10 2013 14:50:19 for Linux Kernel by
1.8.2