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