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
ordered-data.h
Go to the documentation of this file.
1
/*
2
* Copyright (C) 2007 Oracle. All rights reserved.
3
*
4
* This program is free software; you can redistribute it and/or
5
* modify it under the terms of the GNU General Public
6
* License v2 as published by the Free Software Foundation.
7
*
8
* This program is distributed in the hope that it will be useful,
9
* but WITHOUT ANY WARRANTY; without even the implied warranty of
10
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
11
* General Public License for more details.
12
*
13
* You should have received a copy of the GNU General Public
14
* License along with this program; if not, write to the
15
* Free Software Foundation, Inc., 59 Temple Place - Suite 330,
16
* Boston, MA 021110-1307, USA.
17
*/
18
19
#ifndef __BTRFS_ORDERED_DATA__
20
#define __BTRFS_ORDERED_DATA__
21
22
/* one of these per inode */
23
struct
btrfs_ordered_inode_tree
{
24
spinlock_t
lock
;
25
struct
rb_root
tree
;
26
struct
rb_node
*
last
;
27
};
28
29
/*
30
* these are used to collect checksums done just before bios submission.
31
* They are attached via a list into the ordered extent, and
32
* checksum items are inserted into the tree after all the blocks in
33
* the ordered extent are on disk
34
*/
35
struct
btrfs_sector_sum
{
36
/* bytenr on disk */
37
u64
bytenr
;
38
u32
sum
;
39
};
40
41
struct
btrfs_ordered_sum
{
42
/* bytenr is the start of this extent on disk */
43
u64
bytenr
;
44
45
/*
46
* this is the length in bytes covered by the sums array below.
47
*/
48
unsigned
long
len
;
49
struct
list_head
list
;
50
/* last field is a variable length array of btrfs_sector_sums */
51
struct
btrfs_sector_sum
sums
[];
52
};
53
54
/*
55
* bits for the flags field:
56
*
57
* BTRFS_ORDERED_IO_DONE is set when all of the blocks are written.
58
* It is used to make sure metadata is inserted into the tree only once
59
* per extent.
60
*
61
* BTRFS_ORDERED_COMPLETE is set when the extent is removed from the
62
* rbtree, just before waking any waiters. It is used to indicate the
63
* IO is done and any metadata is inserted into the tree.
64
*/
65
#define BTRFS_ORDERED_IO_DONE 0
/* set when all the pages are written */
66
67
#define BTRFS_ORDERED_COMPLETE 1
/* set when removed from the tree */
68
69
#define BTRFS_ORDERED_NOCOW 2
/* set when we want to write in place */
70
71
#define BTRFS_ORDERED_COMPRESSED 3
/* writing a zlib compressed extent */
72
73
#define BTRFS_ORDERED_PREALLOC 4
/* set when writing to prealloced extent */
74
75
#define BTRFS_ORDERED_DIRECT 5
/* set when we're doing DIO with this extent */
76
77
#define BTRFS_ORDERED_IOERR 6
/* We had an io error when writing this out */
78
79
#define BTRFS_ORDERED_UPDATED_ISIZE 7
/* indicates wether this ordered extent
80
* has done its due diligence in updating
81
* the isize. */
82
83
struct
btrfs_ordered_extent
{
84
/* logical offset in the file */
85
u64
file_offset
;
86
87
/* disk byte number */
88
u64
start
;
89
90
/* ram length of the extent in bytes */
91
u64
len
;
92
93
/* extent length on disk */
94
u64
disk_len
;
95
96
/* number of bytes that still need writing */
97
u64
bytes_left
;
98
99
/*
100
* the end of the ordered extent which is behind it but
101
* didn't update disk_i_size. Please see the comment of
102
* btrfs_ordered_update_i_size();
103
*/
104
u64
outstanding_isize
;
105
106
/* flags (described above) */
107
unsigned
long
flags
;
108
109
/* compression algorithm */
110
int
compress_type
;
111
112
/* reference count */
113
atomic_t
refs
;
114
115
/* the inode we belong to */
116
struct
inode
*
inode
;
117
118
/* list of checksums for insertion when the extent io is done */
119
struct
list_head
list
;
120
121
/* used to wait for the BTRFS_ORDERED_COMPLETE bit */
122
wait_queue_head_t
wait
;
123
124
/* our friendly rbtree entry */
125
struct
rb_node
rb_node
;
126
127
/* a per root list of all the pending ordered extents */
128
struct
list_head
root_extent_list
;
129
130
struct
btrfs_work
work
;
131
};
132
133
134
/*
135
* calculates the total size you need to allocate for an ordered sum
136
* structure spanning 'bytes' in the file
137
*/
138
static
inline
int
btrfs_ordered_sum_size(
struct
btrfs_root
*root,
139
unsigned
long
bytes
)
140
{
141
unsigned
long
num_sectors = (bytes + root->
sectorsize
- 1) /
142
root->
sectorsize
;
143
num_sectors++;
144
return
sizeof
(
struct
btrfs_ordered_sum
) +
145
num_sectors *
sizeof
(
struct
btrfs_sector_sum
);
146
}
147
148
static
inline
void
149
btrfs_ordered_inode_tree_init(
struct
btrfs_ordered_inode_tree
*
t
)
150
{
151
spin_lock_init
(&t->
lock
);
152
t->
tree
=
RB_ROOT
;
153
t->
last
=
NULL
;
154
}
155
156
void
btrfs_put_ordered_extent
(
struct
btrfs_ordered_extent
*
entry
);
157
void
btrfs_remove_ordered_extent
(
struct
inode
*
inode
,
158
struct
btrfs_ordered_extent
*
entry
);
159
int
btrfs_dec_test_ordered_pending
(
struct
inode
*
inode
,
160
struct
btrfs_ordered_extent
**
cached
,
161
u64
file_offset
,
u64
io_size,
int
uptodate);
162
int
btrfs_dec_test_first_ordered_pending
(
struct
inode
*
inode
,
163
struct
btrfs_ordered_extent
**
cached
,
164
u64
*
file_offset
,
u64
io_size,
165
int
uptodate);
166
int
btrfs_add_ordered_extent
(
struct
inode
*
inode
,
u64
file_offset
,
167
u64
start
,
u64
len,
u64
disk_len,
int
type
);
168
int
btrfs_add_ordered_extent_dio
(
struct
inode
*
inode
,
u64
file_offset
,
169
u64
start
,
u64
len,
u64
disk_len,
int
type
);
170
int
btrfs_add_ordered_extent_compress
(
struct
inode
*
inode
,
u64
file_offset
,
171
u64
start
,
u64
len,
u64
disk_len,
172
int
type
,
int
compress_type);
173
void
btrfs_add_ordered_sum
(
struct
inode
*
inode
,
174
struct
btrfs_ordered_extent
*
entry
,
175
struct
btrfs_ordered_sum
*
sum
);
176
struct
btrfs_ordered_extent
*
btrfs_lookup_ordered_extent
(
struct
inode
*
inode
,
177
u64
file_offset
);
178
void
btrfs_start_ordered_extent
(
struct
inode
*
inode
,
179
struct
btrfs_ordered_extent
*
entry
,
int
wait
);
180
void
btrfs_wait_ordered_range
(
struct
inode
*
inode
,
u64
start
,
u64
len
);
181
struct
btrfs_ordered_extent
*
182
btrfs_lookup_first_ordered_extent
(
struct
inode
*
inode
,
u64
file_offset
);
183
struct
btrfs_ordered_extent
*
btrfs_lookup_ordered_range
(
struct
inode
*
inode
,
184
u64
file_offset
,
185
u64
len
);
186
int
btrfs_ordered_update_i_size
(
struct
inode
*
inode
,
u64
offset
,
187
struct
btrfs_ordered_extent
*ordered);
188
int
btrfs_find_ordered_sum
(
struct
inode
*
inode
,
u64
offset
,
u64
disk_bytenr
,
u32
*
sum
);
189
void
btrfs_run_ordered_operations
(
struct
btrfs_root
*root,
int
wait
);
190
void
btrfs_add_ordered_operation
(
struct
btrfs_trans_handle
*
trans
,
191
struct
btrfs_root
*root,
192
struct
inode
*
inode
);
193
void
btrfs_wait_ordered_extents
(
struct
btrfs_root
*root,
int
delay_iput);
194
int
__init
ordered_data_init
(
void
);
195
void
ordered_data_exit
(
void
);
196
#endif
Generated on Thu Jan 10 2013 14:45:35 for Linux Kernel by
1.8.2