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
btrfs
extent_io.h
Go to the documentation of this file.
1
#ifndef __EXTENTIO__
2
#define __EXTENTIO__
3
4
#include <linux/rbtree.h>
5
6
/* bits for the extent state */
7
#define EXTENT_DIRTY 1
8
#define EXTENT_WRITEBACK (1 << 1)
9
#define EXTENT_UPTODATE (1 << 2)
10
#define EXTENT_LOCKED (1 << 3)
11
#define EXTENT_NEW (1 << 4)
12
#define EXTENT_DELALLOC (1 << 5)
13
#define EXTENT_DEFRAG (1 << 6)
14
#define EXTENT_DEFRAG_DONE (1 << 7)
15
#define EXTENT_BUFFER_FILLED (1 << 8)
16
#define EXTENT_BOUNDARY (1 << 9)
17
#define EXTENT_NODATASUM (1 << 10)
18
#define EXTENT_DO_ACCOUNTING (1 << 11)
19
#define EXTENT_FIRST_DELALLOC (1 << 12)
20
#define EXTENT_NEED_WAIT (1 << 13)
21
#define EXTENT_DAMAGED (1 << 14)
22
#define EXTENT_IOBITS (EXTENT_LOCKED | EXTENT_WRITEBACK)
23
#define EXTENT_CTLBITS (EXTENT_DO_ACCOUNTING | EXTENT_FIRST_DELALLOC)
24
25
/*
26
* flags for bio submission. The high bits indicate the compression
27
* type for this bio
28
*/
29
#define EXTENT_BIO_COMPRESSED 1
30
#define EXTENT_BIO_TREE_LOG 2
31
#define EXTENT_BIO_FLAG_SHIFT 16
32
33
/* these are bit numbers for test/set bit */
34
#define EXTENT_BUFFER_UPTODATE 0
35
#define EXTENT_BUFFER_BLOCKING 1
36
#define EXTENT_BUFFER_DIRTY 2
37
#define EXTENT_BUFFER_CORRUPT 3
38
#define EXTENT_BUFFER_READAHEAD 4
/* this got triggered by readahead */
39
#define EXTENT_BUFFER_TREE_REF 5
40
#define EXTENT_BUFFER_STALE 6
41
#define EXTENT_BUFFER_WRITEBACK 7
42
#define EXTENT_BUFFER_IOERR 8
43
#define EXTENT_BUFFER_DUMMY 9
44
45
/* these are flags for extent_clear_unlock_delalloc */
46
#define EXTENT_CLEAR_UNLOCK_PAGE 0x1
47
#define EXTENT_CLEAR_UNLOCK 0x2
48
#define EXTENT_CLEAR_DELALLOC 0x4
49
#define EXTENT_CLEAR_DIRTY 0x8
50
#define EXTENT_SET_WRITEBACK 0x10
51
#define EXTENT_END_WRITEBACK 0x20
52
#define EXTENT_SET_PRIVATE2 0x40
53
#define EXTENT_CLEAR_ACCOUNTING 0x80
54
55
/*
56
* page->private values. Every page that is controlled by the extent
57
* map has page->private set to one.
58
*/
59
#define EXTENT_PAGE_PRIVATE 1
60
#define EXTENT_PAGE_PRIVATE_FIRST_PAGE 3
61
62
struct
extent_state
;
63
struct
btrfs_root
;
64
65
typedef
int
(
extent_submit_bio_hook_t
)(
struct
inode
*
inode
,
int
rw
,
66
struct
bio *bio,
int
mirror_num,
67
unsigned
long
bio_flags,
u64
bio_offset);
68
struct
extent_io_ops
{
69
int
(*
fill_delalloc
)(
struct
inode *
inode
,
struct
page
*locked_page,
70
u64
start
,
u64
end
,
int
*page_started,
71
unsigned
long
*nr_written);
72
int
(*
writepage_start_hook
)(
struct
page
*
page
,
u64
start
,
u64
end
);
73
int
(*
writepage_io_hook
)(
struct
page
*
page
,
u64
start
,
u64
end
);
74
extent_submit_bio_hook_t
*
submit_bio_hook
;
75
int
(*
merge_bio_hook
)(
struct
page
*
page
,
unsigned
long
offset
,
76
size_t
size
,
struct
bio *bio,
77
unsigned
long
bio_flags);
78
int
(*
readpage_io_hook
)(
struct
page
*
page
,
u64
start
,
u64
end
);
79
int
(*
readpage_io_failed_hook
)(
struct
page
*
page
,
int
failed_mirror);
80
int
(*
readpage_end_io_hook
)(
struct
page
*
page
,
u64
start
,
u64
end
,
81
struct
extent_state
*
state
,
int
mirror
);
82
int
(*
writepage_end_io_hook
)(
struct
page
*
page
,
u64
start
,
u64
end
,
83
struct
extent_state
*
state
,
int
uptodate);
84
void
(*
set_bit_hook
)(
struct
inode *
inode
,
struct
extent_state
*
state
,
85
int
*
bits
);
86
void
(*
clear_bit_hook
)(
struct
inode *
inode
,
struct
extent_state
*
state
,
87
int
*
bits
);
88
void
(*
merge_extent_hook
)(
struct
inode *
inode
,
89
struct
extent_state
*
new
,
90
struct
extent_state
*
other
);
91
void
(*
split_extent_hook
)(
struct
inode *
inode
,
92
struct
extent_state
*orig,
u64
split
);
93
int
(*
write_cache_pages_lock_hook
)(
struct
page
*
page
,
void
*
data
,
94
void
(*flush_fn)(
void
*));
95
};
96
97
struct
extent_io_tree
{
98
struct
rb_root
state
;
99
struct
radix_tree_root
buffer
;
100
struct
address_space
*
mapping
;
101
u64
dirty_bytes
;
102
int
track_uptodate
;
103
spinlock_t
lock
;
104
spinlock_t
buffer_lock
;
105
struct
extent_io_ops
*
ops
;
106
};
107
108
struct
extent_state
{
109
u64
start
;
110
u64
end
;
/* inclusive */
111
struct
rb_node
rb_node
;
112
113
/* ADD NEW ELEMENTS AFTER THIS */
114
struct
extent_io_tree
*
tree
;
115
wait_queue_head_t
wq
;
116
atomic_t
refs
;
117
unsigned
long
state
;
118
119
/* for use by the FS */
120
u64
private
;
121
122
struct
list_head
leak_list
;
123
};
124
125
#define INLINE_EXTENT_BUFFER_PAGES 16
126
#define MAX_INLINE_EXTENT_BUFFER_SIZE (INLINE_EXTENT_BUFFER_PAGES * PAGE_CACHE_SIZE)
127
struct
extent_buffer
{
128
u64
start
;
129
unsigned
long
len
;
130
unsigned
long
map_start
;
131
unsigned
long
map_len
;
132
unsigned
long
bflags
;
133
struct
extent_io_tree
*
tree
;
134
spinlock_t
refs_lock
;
135
atomic_t
refs
;
136
atomic_t
io_pages
;
137
int
read_mirror
;
138
struct
list_head
leak_list
;
139
struct
rcu_head
rcu_head
;
140
pid_t
lock_owner
;
141
142
/* count of read lock holders on the extent buffer */
143
atomic_t
write_locks
;
144
atomic_t
read_locks
;
145
atomic_t
blocking_writers
;
146
atomic_t
blocking_readers
;
147
atomic_t
spinning_readers
;
148
atomic_t
spinning_writers
;
149
int
lock_nested
;
150
151
/* protects write locks */
152
rwlock_t
lock
;
153
154
/* readers use lock_wq while they wait for the write
155
* lock holders to unlock
156
*/
157
wait_queue_head_t
write_lock_wq
;
158
159
/* writers use read_lock_wq while they wait for readers
160
* to unlock
161
*/
162
wait_queue_head_t
read_lock_wq
;
163
wait_queue_head_t
lock_wq
;
164
struct
page
*
inline_pages
[
INLINE_EXTENT_BUFFER_PAGES
];
165
struct
page
**
pages
;
166
};
167
168
static
inline
void
extent_set_compress_type(
unsigned
long
*bio_flags,
169
int
compress_type)
170
{
171
*bio_flags |= compress_type <<
EXTENT_BIO_FLAG_SHIFT
;
172
}
173
174
static
inline
int
extent_compress_type(
unsigned
long
bio_flags)
175
{
176
return
bio_flags >>
EXTENT_BIO_FLAG_SHIFT
;
177
}
178
179
struct
extent_map_tree
;
180
181
typedef
struct
extent_map
*(
get_extent_t
)(
struct
inode *inode,
182
struct
page
*
page
,
183
size_t
pg_offset,
184
u64
start
,
u64
len
,
185
int
create
);
186
187
void
extent_io_tree_init
(
struct
extent_io_tree
*
tree
,
188
struct
address_space
*
mapping
);
189
int
try_release_extent_mapping
(
struct
extent_map_tree
*
map
,
190
struct
extent_io_tree
*
tree
,
struct
page *page,
191
gfp_t
mask
);
192
int
try_release_extent_buffer
(
struct
page *page,
gfp_t
mask
);
193
int
try_release_extent_state
(
struct
extent_map_tree
*
map
,
194
struct
extent_io_tree
*
tree
,
struct
page *page,
195
gfp_t
mask
);
196
int
lock_extent
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
);
197
int
lock_extent_bits
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
198
int
bits
,
struct
extent_state
**
cached
);
199
int
unlock_extent
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
);
200
int
unlock_extent_cached
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
201
struct
extent_state
**
cached
,
gfp_t
mask
);
202
int
try_lock_extent
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
);
203
int
extent_read_full_page
(
struct
extent_io_tree
*
tree
,
struct
page *page,
204
get_extent_t
*get_extent,
int
mirror_num);
205
int
__init
extent_io_init
(
void
);
206
void
extent_io_exit
(
void
);
207
208
u64
count_range_bits
(
struct
extent_io_tree
*
tree
,
209
u64
*start,
u64
search_end,
210
u64
max_bytes
,
unsigned
long
bits
,
int
contig);
211
212
void
free_extent_state
(
struct
extent_state
*
state
);
213
int
test_range_bit
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
214
int
bits
,
int
filled,
struct
extent_state
*cached_state);
215
int
clear_extent_bits
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
216
int
bits
,
gfp_t
mask
);
217
int
clear_extent_bit
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
218
int
bits
,
int
wake,
int
delete
,
struct
extent_state
**
cached
,
219
gfp_t
mask
);
220
int
set_extent_bits
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
221
int
bits
,
gfp_t
mask
);
222
int
set_extent_bit
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
223
int
bits
,
u64
*failed_start,
224
struct
extent_state
**cached_state,
gfp_t
mask
);
225
int
set_extent_uptodate
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
226
struct
extent_state
**cached_state,
gfp_t
mask
);
227
int
clear_extent_uptodate
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
228
struct
extent_state
**cached_state,
gfp_t
mask
);
229
int
set_extent_new
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
230
gfp_t
mask
);
231
int
set_extent_dirty
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
232
gfp_t
mask
);
233
int
clear_extent_dirty
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
234
gfp_t
mask
);
235
int
convert_extent_bit
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
236
int
bits
,
int
clear_bits,
237
struct
extent_state
**cached_state,
gfp_t
mask
);
238
int
set_extent_delalloc
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
239
struct
extent_state
**cached_state,
gfp_t
mask
);
240
int
set_extent_defrag
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
241
struct
extent_state
**cached_state,
gfp_t
mask
);
242
int
find_first_extent_bit
(
struct
extent_io_tree
*
tree
,
u64
start,
243
u64
*start_ret,
u64
*end_ret,
int
bits
,
244
struct
extent_state
**cached_state);
245
struct
extent_state
*
find_first_extent_bit_state
(
struct
extent_io_tree
*
tree
,
246
u64
start,
int
bits
);
247
int
extent_invalidatepage
(
struct
extent_io_tree
*
tree
,
248
struct
page *page,
unsigned
long
offset
);
249
int
extent_write_full_page
(
struct
extent_io_tree
*
tree
,
struct
page *page,
250
get_extent_t
*get_extent,
251
struct
writeback_control
*wbc);
252
int
extent_write_locked_range
(
struct
extent_io_tree
*
tree
,
struct
inode *inode,
253
u64
start,
u64
end
,
get_extent_t
*get_extent,
254
int
mode
);
255
int
extent_writepages
(
struct
extent_io_tree
*
tree
,
256
struct
address_space
*
mapping
,
257
get_extent_t
*get_extent,
258
struct
writeback_control
*wbc);
259
int
btree_write_cache_pages
(
struct
address_space
*
mapping
,
260
struct
writeback_control
*wbc);
261
int
extent_readpages
(
struct
extent_io_tree
*
tree
,
262
struct
address_space
*
mapping
,
263
struct
list_head
*
pages
,
unsigned
nr_pages,
264
get_extent_t
get_extent);
265
int
extent_fiemap
(
struct
inode *inode,
struct
fiemap_extent_info
*fieinfo,
266
__u64
start,
__u64
len,
get_extent_t
*get_extent);
267
int
set_state_private
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
private
);
268
int
get_state_private
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
*
private
);
269
void
set_page_extent_mapped
(
struct
page *page);
270
271
struct
extent_buffer
*
alloc_extent_buffer
(
struct
extent_io_tree
*
tree
,
272
u64
start,
unsigned
long
len);
273
struct
extent_buffer
*
alloc_dummy_extent_buffer
(
u64
start,
unsigned
long
len);
274
struct
extent_buffer
*
btrfs_clone_extent_buffer
(
struct
extent_buffer
*
src
);
275
struct
extent_buffer
*
find_extent_buffer
(
struct
extent_io_tree
*
tree
,
276
u64
start,
unsigned
long
len);
277
void
free_extent_buffer
(
struct
extent_buffer
*
eb
);
278
void
free_extent_buffer_stale
(
struct
extent_buffer
*
eb
);
279
#define WAIT_NONE 0
280
#define WAIT_COMPLETE 1
281
#define WAIT_PAGE_LOCK 2
282
int
read_extent_buffer_pages
(
struct
extent_io_tree
*
tree
,
283
struct
extent_buffer
*
eb
,
u64
start,
int
wait
,
284
get_extent_t
*get_extent,
int
mirror_num);
285
286
static
inline
unsigned
long
num_extent_pages(
u64
start,
u64
len)
287
{
288
return
((start + len +
PAGE_CACHE_SIZE
- 1) >>
PAGE_CACHE_SHIFT
) -
289
(start >>
PAGE_CACHE_SHIFT
);
290
}
291
292
static
inline
struct
page *extent_buffer_page(
struct
extent_buffer
*
eb
,
293
unsigned
long
i
)
294
{
295
return
eb->
pages
[
i
];
296
}
297
298
static
inline
void
extent_buffer_get(
struct
extent_buffer
*
eb
)
299
{
300
atomic_inc
(&eb->
refs
);
301
}
302
303
int
memcmp_extent_buffer
(
struct
extent_buffer
*
eb
,
const
void
*ptrv,
304
unsigned
long
start,
305
unsigned
long
len);
306
void
read_extent_buffer
(
struct
extent_buffer
*
eb
,
void
*
dst
,
307
unsigned
long
start,
308
unsigned
long
len);
309
void
write_extent_buffer
(
struct
extent_buffer
*
eb
,
const
void
*
src
,
310
unsigned
long
start,
unsigned
long
len);
311
void
copy_extent_buffer
(
struct
extent_buffer
*
dst
,
struct
extent_buffer
*
src
,
312
unsigned
long
dst_offset,
unsigned
long
src_offset,
313
unsigned
long
len);
314
void
memcpy_extent_buffer
(
struct
extent_buffer
*
dst
,
unsigned
long
dst_offset,
315
unsigned
long
src_offset,
unsigned
long
len);
316
void
memmove_extent_buffer
(
struct
extent_buffer
*
dst
,
unsigned
long
dst_offset,
317
unsigned
long
src_offset,
unsigned
long
len);
318
void
memset_extent_buffer
(
struct
extent_buffer
*
eb
,
char
c
,
319
unsigned
long
start,
unsigned
long
len);
320
void
wait_extent_bit
(
struct
extent_io_tree
*
tree
,
u64
start,
u64
end
,
int
bits
);
321
void
clear_extent_buffer_dirty
(
struct
extent_buffer
*
eb
);
322
int
set_extent_buffer_dirty
(
struct
extent_buffer
*
eb
);
323
int
set_extent_buffer_uptodate
(
struct
extent_buffer
*
eb
);
324
int
clear_extent_buffer_uptodate
(
struct
extent_buffer
*
eb
);
325
int
extent_buffer_uptodate
(
struct
extent_buffer
*
eb
);
326
int
map_private_extent_buffer
(
struct
extent_buffer
*
eb
,
unsigned
long
offset
,
327
unsigned
long
min_len,
char
**
map
,
328
unsigned
long
*map_start,
329
unsigned
long
*map_len);
330
int
extent_range_uptodate
(
struct
extent_io_tree
*
tree
,
331
u64
start,
u64
end
);
332
int
extent_clear_unlock_delalloc
(
struct
inode *inode,
333
struct
extent_io_tree
*
tree
,
334
u64
start,
u64
end
,
struct
page *locked_page,
335
unsigned
long
op
);
336
struct
bio *
337
btrfs_bio_alloc
(
struct
block_device
*bdev,
u64
first_sector,
int
nr_vecs,
338
gfp_t
gfp_flags);
339
340
struct
btrfs_mapping_tree
;
341
342
int
repair_io_failure
(
struct
btrfs_mapping_tree
*
map_tree
,
u64
start,
343
u64
length
,
u64
logical,
struct
page *page,
344
int
mirror_num);
345
int
end_extent_writepage
(
struct
page *page,
int
err
,
u64
start,
u64
end
);
346
int
repair_eb_io_failure
(
struct
btrfs_root
*root,
struct
extent_buffer
*
eb
,
347
int
mirror_num);
348
#endif
Generated on Thu Jan 10 2013 14:45:32 for Linux Kernel by
1.8.2