221ef34f2acabe00d74e6e6e414121f793a8e40d
[platform/upstream/btrfs-progs.git] / volumes.h
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 #define BTRFS_STRIPE_LEN        (64 * 1024)
23
24 struct btrfs_device {
25         struct list_head dev_list;
26         struct btrfs_root *dev_root;
27         struct btrfs_fs_devices *fs_devices;
28
29         u64 total_ios;
30
31         int fd;
32
33         int writeable;
34
35         char *name;
36
37         /* these are read off the super block, only in the progs */
38         char *label;
39         u64 total_devs;
40         u64 super_bytes_used;
41
42         u64 generation;
43
44         /* the internal btrfs device id */
45         u64 devid;
46
47         /* size of the device */
48         u64 total_bytes;
49
50         /* bytes used */
51         u64 bytes_used;
52
53         /* optimal io alignment for this device */
54         u32 io_align;
55
56         /* optimal io width for this device */
57         u32 io_width;
58
59         /* minimal io size for this device */
60         u32 sector_size;
61
62         /* type and info about this device */
63         u64 type;
64
65         /* physical drive uuid (or lvm uuid) */
66         u8 uuid[BTRFS_UUID_SIZE];
67 };
68
69 struct btrfs_fs_devices {
70         u8 fsid[BTRFS_FSID_SIZE]; /* FS specific uuid */
71
72         /* the device with this id has the most recent copy of the super */
73         u64 latest_devid;
74         u64 latest_trans;
75         u64 lowest_devid;
76         int latest_bdev;
77         int lowest_bdev;
78         struct list_head devices;
79         struct list_head list;
80
81         int seeding;
82         struct btrfs_fs_devices *seed;
83 };
84
85 struct btrfs_bio_stripe {
86         struct btrfs_device *dev;
87         u64 physical;
88 };
89
90 struct btrfs_multi_bio {
91         int error;
92         int num_stripes;
93         struct btrfs_bio_stripe stripes[];
94 };
95
96 struct map_lookup {
97         struct cache_extent ce;
98         u64 type;
99         int io_align;
100         int io_width;
101         int stripe_len;
102         int sector_size;
103         int num_stripes;
104         int sub_stripes;
105         struct btrfs_bio_stripe stripes[];
106 };
107
108 #define btrfs_multi_bio_size(n) (sizeof(struct btrfs_multi_bio) + \
109                             (sizeof(struct btrfs_bio_stripe) * (n)))
110 #define btrfs_map_lookup_size(n) (sizeof(struct map_lookup) + \
111                                  (sizeof(struct btrfs_bio_stripe) * (n)))
112
113 /*
114  * Restriper's general type filter
115  */
116 #define BTRFS_BALANCE_DATA              (1ULL << 0)
117 #define BTRFS_BALANCE_SYSTEM            (1ULL << 1)
118 #define BTRFS_BALANCE_METADATA          (1ULL << 2)
119
120 #define BTRFS_BALANCE_TYPE_MASK         (BTRFS_BALANCE_DATA |       \
121                                          BTRFS_BALANCE_SYSTEM |     \
122                                          BTRFS_BALANCE_METADATA)
123
124 #define BTRFS_BALANCE_FORCE             (1ULL << 3)
125 #define BTRFS_BALANCE_RESUME            (1ULL << 4)
126
127 /*
128  * Balance filters
129  */
130 #define BTRFS_BALANCE_ARGS_PROFILES     (1ULL << 0)
131 #define BTRFS_BALANCE_ARGS_USAGE        (1ULL << 1)
132 #define BTRFS_BALANCE_ARGS_DEVID        (1ULL << 2)
133 #define BTRFS_BALANCE_ARGS_DRANGE       (1ULL << 3)
134 #define BTRFS_BALANCE_ARGS_VRANGE       (1ULL << 4)
135 #define BTRFS_BALANCE_ARGS_LIMIT        (1ULL << 5)
136
137 /*
138  * Profile changing flags.  When SOFT is set we won't relocate chunk if
139  * it already has the target profile (even though it may be
140  * half-filled).
141  */
142 #define BTRFS_BALANCE_ARGS_CONVERT      (1ULL << 8)
143 #define BTRFS_BALANCE_ARGS_SOFT         (1ULL << 9)
144
145 #define BTRFS_RAID5_P_STRIPE ((u64)-2)
146 #define BTRFS_RAID6_Q_STRIPE ((u64)-1)
147
148
149 int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
150                       u64 logical, u64 *length, u64 *type,
151                       struct btrfs_multi_bio **multi_ret, int mirror_num,
152                       u64 **raid_map);
153 int btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
154                     u64 logical, u64 *length,
155                     struct btrfs_multi_bio **multi_ret, int mirror_num,
156                     u64 **raid_map_ret);
157 int btrfs_next_metadata(struct btrfs_mapping_tree *map_tree, u64 *logical,
158                         u64 *size);
159 int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
160                      u64 chunk_start, u64 physical, u64 devid,
161                      u64 **logical, int *naddrs, int *stripe_len);
162 int btrfs_read_sys_array(struct btrfs_root *root);
163 int btrfs_read_chunk_tree(struct btrfs_root *root);
164 int btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
165                       struct btrfs_root *extent_root, u64 *start,
166                       u64 *num_bytes, u64 type);
167 int btrfs_alloc_data_chunk(struct btrfs_trans_handle *trans,
168                            struct btrfs_root *extent_root, u64 *start,
169                            u64 num_bytes, u64 type);
170 int btrfs_read_super_device(struct btrfs_root *root, struct extent_buffer *buf);
171 int btrfs_add_device(struct btrfs_trans_handle *trans,
172                      struct btrfs_root *root,
173                      struct btrfs_device *device);
174 int btrfs_open_devices(struct btrfs_fs_devices *fs_devices,
175                        int flags);
176 int btrfs_close_devices(struct btrfs_fs_devices *fs_devices);
177 int btrfs_add_device(struct btrfs_trans_handle *trans,
178                      struct btrfs_root *root,
179                      struct btrfs_device *device);
180 int btrfs_update_device(struct btrfs_trans_handle *trans,
181                         struct btrfs_device *device);
182 int btrfs_scan_one_device(int fd, const char *path,
183                           struct btrfs_fs_devices **fs_devices_ret,
184                           u64 *total_devs, u64 super_offset, int super_recover);
185 int btrfs_num_copies(struct btrfs_mapping_tree *map_tree, u64 logical, u64 len);
186 struct list_head *btrfs_scanned_uuids(void);
187 int btrfs_add_system_chunk(struct btrfs_trans_handle *trans,
188                            struct btrfs_root *root, struct btrfs_key *key,
189                            struct btrfs_chunk *chunk, int item_size);
190 int btrfs_chunk_readonly(struct btrfs_root *root, u64 chunk_offset);
191 struct btrfs_device *
192 btrfs_find_device_by_devid(struct btrfs_fs_devices *fs_devices,
193                            u64 devid, int instance);
194 struct btrfs_device *btrfs_find_device(struct btrfs_root *root, u64 devid,
195                                        u8 *uuid, u8 *fsid);
196 int write_raid56_with_parity(struct btrfs_fs_info *info,
197                              struct extent_buffer *eb,
198                              struct btrfs_multi_bio *multi,
199                              u64 stripe_len, u64 *raid_map);
200 #endif