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
volumes.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_VOLUMES_
20
#define __BTRFS_VOLUMES_
21
22
#include <
linux/bio.h
>
23
#include <
linux/sort.h
>
24
#include "
async-thread.h
"
25
#include "
ioctl.h
"
26
27
#define BTRFS_STRIPE_LEN (64 * 1024)
28
29
struct
buffer_head;
30
struct
btrfs_pending_bios
{
31
struct
bio *
head
;
32
struct
bio *
tail
;
33
};
34
35
struct
btrfs_device
{
36
struct
list_head
dev_list
;
37
struct
list_head
dev_alloc_list
;
38
struct
btrfs_fs_devices
*
fs_devices
;
39
struct
btrfs_root
*
dev_root
;
40
41
/* regular prio bios */
42
struct
btrfs_pending_bios
pending_bios
;
43
/* WRITE_SYNC bios */
44
struct
btrfs_pending_bios
pending_sync_bios
;
45
46
int
running_pending
;
47
u64
generation
;
48
49
int
writeable
;
50
int
in_fs_metadata
;
51
int
missing
;
52
int
can_discard
;
53
54
spinlock_t
io_lock
;
55
56
struct
block_device
*
bdev
;
57
58
/* the mode sent to blkdev_get */
59
fmode_t
mode
;
60
61
struct
rcu_string
*
name
;
62
63
/* the internal btrfs device id */
64
u64
devid
;
65
66
/* size of the device */
67
u64
total_bytes
;
68
69
/* size of the disk */
70
u64
disk_total_bytes
;
71
72
/* bytes used */
73
u64
bytes_used
;
74
75
/* optimal io alignment for this device */
76
u32
io_align
;
77
78
/* optimal io width for this device */
79
u32
io_width
;
80
81
/* minimal io size for this device */
82
u32
sector_size
;
83
84
/* type and info about this device */
85
u64
type
;
86
87
/* physical drive uuid (or lvm uuid) */
88
u8
uuid
[
BTRFS_UUID_SIZE
];
89
90
/* per-device scrub information */
91
struct
scrub_dev
*
scrub_device
;
92
93
struct
btrfs_work
work
;
94
struct
rcu_head
rcu
;
95
struct
work_struct
rcu_work
;
96
97
/* readahead state */
98
spinlock_t
reada_lock
;
99
atomic_t
reada_in_flight
;
100
u64
reada_next
;
101
struct
reada_zone
*
reada_curr_zone
;
102
struct
radix_tree_root
reada_zones
;
103
struct
radix_tree_root
reada_extents
;
104
105
/* for sending down flush barriers */
106
struct
bio *
flush_bio
;
107
struct
completion
flush_wait
;
108
int
nobarriers
;
109
110
/* disk I/O failure stats. For detailed description refer to
111
* enum btrfs_dev_stat_values in ioctl.h */
112
int
dev_stats_valid
;
113
int
dev_stats_dirty
;
/* counters need to be written to disk */
114
atomic_t
dev_stat_values
[
BTRFS_DEV_STAT_VALUES_MAX
];
115
};
116
117
struct
btrfs_fs_devices
{
118
u8
fsid
[
BTRFS_FSID_SIZE
];
/* FS specific uuid */
119
120
/* the device with this id has the most recent copy of the super */
121
u64
latest_devid
;
122
u64
latest_trans
;
123
u64
num_devices
;
124
u64
open_devices
;
125
u64
rw_devices
;
126
u64
missing_devices
;
127
u64
total_rw_bytes
;
128
u64
num_can_discard
;
129
u64
total_devices
;
130
struct
block_device
*
latest_bdev
;
131
132
/* all of the devices in the FS, protected by a mutex
133
* so we can safely walk it to write out the supers without
134
* worrying about add/remove by the multi-device code
135
*/
136
struct
mutex
device_list_mutex
;
137
struct
list_head
devices
;
138
139
/* devices not currently being allocated */
140
struct
list_head
alloc_list
;
141
struct
list_head
list
;
142
143
struct
btrfs_fs_devices
*
seed
;
144
int
seeding
;
145
146
int
opened
;
147
148
/* set when we find or add a device that doesn't have the
149
* nonrot flag set
150
*/
151
int
rotating
;
152
};
153
154
struct
btrfs_bio_stripe
{
155
struct
btrfs_device
*
dev
;
156
u64
physical
;
157
u64
length
;
/* only used for discard mappings */
158
};
159
160
struct
btrfs_bio
;
161
typedef
void
(
btrfs_bio_end_io_t
) (
struct
btrfs_bio
*bio,
int
err
);
162
163
struct
btrfs_bio
{
164
atomic_t
stripes_pending
;
165
bio_end_io_t *
end_io
;
166
struct
bio *
orig_bio
;
167
void
*
private
;
168
atomic_t
error
;
169
int
max_errors
;
170
int
num_stripes
;
171
int
mirror_num
;
172
struct
btrfs_bio_stripe
stripes
[];
173
};
174
175
struct
btrfs_device_info
{
176
struct
btrfs_device
*
dev
;
177
u64
dev_offset
;
178
u64
max_avail
;
179
u64
total_avail
;
180
};
181
182
struct
map_lookup
{
183
u64
type
;
184
int
io_align
;
185
int
io_width
;
186
int
stripe_len
;
187
int
sector_size
;
188
int
num_stripes
;
189
int
sub_stripes
;
190
struct
btrfs_bio_stripe
stripes
[];
191
};
192
193
#define map_lookup_size(n) (sizeof(struct map_lookup) + \
194
(sizeof(struct btrfs_bio_stripe) * (n)))
195
196
/*
197
* Restriper's general type filter
198
*/
199
#define BTRFS_BALANCE_DATA (1ULL << 0)
200
#define BTRFS_BALANCE_SYSTEM (1ULL << 1)
201
#define BTRFS_BALANCE_METADATA (1ULL << 2)
202
203
#define BTRFS_BALANCE_TYPE_MASK (BTRFS_BALANCE_DATA | \
204
BTRFS_BALANCE_SYSTEM | \
205
BTRFS_BALANCE_METADATA)
206
207
#define BTRFS_BALANCE_FORCE (1ULL << 3)
208
#define BTRFS_BALANCE_RESUME (1ULL << 4)
209
210
/*
211
* Balance filters
212
*/
213
#define BTRFS_BALANCE_ARGS_PROFILES (1ULL << 0)
214
#define BTRFS_BALANCE_ARGS_USAGE (1ULL << 1)
215
#define BTRFS_BALANCE_ARGS_DEVID (1ULL << 2)
216
#define BTRFS_BALANCE_ARGS_DRANGE (1ULL << 3)
217
#define BTRFS_BALANCE_ARGS_VRANGE (1ULL << 4)
218
219
/*
220
* Profile changing flags. When SOFT is set we won't relocate chunk if
221
* it already has the target profile (even though it may be
222
* half-filled).
223
*/
224
#define BTRFS_BALANCE_ARGS_CONVERT (1ULL << 8)
225
#define BTRFS_BALANCE_ARGS_SOFT (1ULL << 9)
226
227
struct
btrfs_balance_args
;
228
struct
btrfs_balance_progress
;
229
struct
btrfs_balance_control
{
230
struct
btrfs_fs_info
*
fs_info
;
231
232
struct
btrfs_balance_args
data
;
233
struct
btrfs_balance_args
meta
;
234
struct
btrfs_balance_args
sys
;
235
236
u64
flags
;
237
238
struct
btrfs_balance_progress
stat
;
239
};
240
241
int
btrfs_account_dev_extents_size
(
struct
btrfs_device
*
device
,
u64
start
,
242
u64
end
,
u64
*
length
);
243
244
#define btrfs_bio_size(n) (sizeof(struct btrfs_bio) + \
245
(sizeof(struct btrfs_bio_stripe) * (n)))
246
247
int
btrfs_alloc_dev_extent
(
struct
btrfs_trans_handle
*
trans
,
248
struct
btrfs_device
*
device
,
249
u64
chunk_tree
,
u64
chunk_objectid
,
250
u64
chunk_offset
,
u64
start
,
u64
num_bytes
);
251
int
btrfs_map_block
(
struct
btrfs_mapping_tree
*map_tree,
int
rw
,
252
u64
logical,
u64
*
length
,
253
struct
btrfs_bio
**bbio_ret,
int
mirror_num);
254
int
btrfs_rmap_block
(
struct
btrfs_mapping_tree
*map_tree,
255
u64
chunk_start,
u64
physical,
u64
devid
,
256
u64
**logical,
int
*naddrs,
int
*
stripe_len
);
257
int
btrfs_read_sys_array
(
struct
btrfs_root
*root);
258
int
btrfs_read_chunk_tree
(
struct
btrfs_root
*root);
259
int
btrfs_alloc_chunk
(
struct
btrfs_trans_handle
*
trans
,
260
struct
btrfs_root
*
extent_root
,
u64
type
);
261
void
btrfs_mapping_init
(
struct
btrfs_mapping_tree
*
tree
);
262
void
btrfs_mapping_tree_free
(
struct
btrfs_mapping_tree
*
tree
);
263
int
btrfs_map_bio
(
struct
btrfs_root
*root,
int
rw
,
struct
bio *bio,
264
int
mirror_num,
int
async_submit);
265
int
btrfs_open_devices
(
struct
btrfs_fs_devices
*fs_devices,
266
fmode_t
flags
,
void
*holder);
267
int
btrfs_scan_one_device
(
const
char
*
path
,
fmode_t
flags
,
void
*holder,
268
struct
btrfs_fs_devices
**fs_devices_ret);
269
int
btrfs_close_devices
(
struct
btrfs_fs_devices
*fs_devices);
270
void
btrfs_close_extra_devices
(
struct
btrfs_fs_devices
*fs_devices);
271
int
btrfs_add_device
(
struct
btrfs_trans_handle
*
trans
,
272
struct
btrfs_root
*root,
273
struct
btrfs_device
*
device
);
274
int
btrfs_rm_device
(
struct
btrfs_root
*root,
char
*
device_path
);
275
void
btrfs_cleanup_fs_uuids
(
void
);
276
int
btrfs_num_copies
(
struct
btrfs_mapping_tree
*map_tree,
u64
logical,
u64
len);
277
int
btrfs_grow_device
(
struct
btrfs_trans_handle
*
trans
,
278
struct
btrfs_device
*
device
,
u64
new_size);
279
struct
btrfs_device
*
btrfs_find_device
(
struct
btrfs_root
*root,
u64
devid
,
280
u8
*
uuid
,
u8
*
fsid
);
281
int
btrfs_shrink_device
(
struct
btrfs_device
*
device
,
u64
new_size);
282
int
btrfs_init_new_device
(
struct
btrfs_root
*root,
char
*
path
);
283
int
btrfs_balance
(
struct
btrfs_balance_control
*bctl,
284
struct
btrfs_ioctl_balance_args
*bargs);
285
int
btrfs_resume_balance_async
(
struct
btrfs_fs_info
*
fs_info
);
286
int
btrfs_recover_balance
(
struct
btrfs_fs_info
*
fs_info
);
287
int
btrfs_pause_balance
(
struct
btrfs_fs_info
*
fs_info
);
288
int
btrfs_cancel_balance
(
struct
btrfs_fs_info
*
fs_info
);
289
int
btrfs_chunk_readonly
(
struct
btrfs_root
*root,
u64
chunk_offset
);
290
int
find_free_dev_extent
(
struct
btrfs_device
*
device
,
u64
num_bytes
,
291
u64
*
start
,
u64
*max_avail);
292
void
btrfs_dev_stat_print_on_error
(
struct
btrfs_device
*
device
);
293
void
btrfs_dev_stat_inc_and_print
(
struct
btrfs_device
*
dev
,
int
index
);
294
int
btrfs_get_dev_stats
(
struct
btrfs_root
*root,
295
struct
btrfs_ioctl_get_dev_stats
*
stats
);
296
int
btrfs_init_dev_stats
(
struct
btrfs_fs_info
*
fs_info
);
297
int
btrfs_run_dev_stats
(
struct
btrfs_trans_handle
*
trans
,
298
struct
btrfs_fs_info
*
fs_info
);
299
300
static
inline
void
btrfs_dev_stat_inc(
struct
btrfs_device
*
dev
,
301
int
index
)
302
{
303
atomic_inc
(dev->
dev_stat_values
+ index);
304
dev->
dev_stats_dirty
= 1;
305
}
306
307
static
inline
int
btrfs_dev_stat_read(
struct
btrfs_device
*
dev
,
308
int
index
)
309
{
310
return
atomic_read
(dev->
dev_stat_values
+ index);
311
}
312
313
static
inline
int
btrfs_dev_stat_read_and_reset(
struct
btrfs_device
*
dev
,
314
int
index
)
315
{
316
int
ret
;
317
318
ret =
atomic_xchg
(dev->
dev_stat_values
+ index, 0);
319
dev->
dev_stats_dirty
= 1;
320
return
ret
;
321
}
322
323
static
inline
void
btrfs_dev_stat_set(
struct
btrfs_device
*
dev
,
324
int
index
,
unsigned
long
val
)
325
{
326
atomic_set
(dev->
dev_stat_values
+ index, val);
327
dev->
dev_stats_dirty
= 1;
328
}
329
330
static
inline
void
btrfs_dev_stat_reset(
struct
btrfs_device
*
dev
,
331
int
index
)
332
{
333
btrfs_dev_stat_set(dev, index, 0);
334
}
335
#endif
Generated on Thu Jan 10 2013 14:45:50 for Linux Kernel by
1.8.2