Dynamic chunk allocation
[platform/upstream/btrfs-progs.git] / volumes.c
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 #include "ctree.h"
19 #include "disk-io.h"
20 #include "transaction.h"
21 #include "print-tree.h"
22 #include "volumes.h"
23
24 struct map_lookup {
25         struct cache_extent ce;
26         struct btrfs_device *dev;
27         u64 physical;
28 };
29
30 /*
31  * this uses a pretty simple search, the expectation is that it is
32  * called very infrequently and that a given device has a small number
33  * of extents
34  */
35 static int find_free_dev_extent(struct btrfs_trans_handle *trans,
36                                 struct btrfs_device *device,
37                                 struct btrfs_path *path,
38                                 u64 num_bytes, u64 *start)
39 {
40         struct btrfs_key key;
41         struct btrfs_root *root = device->dev_root;
42         struct btrfs_dev_extent *dev_extent = NULL;
43         u64 hole_size = 0;
44         u64 last_byte = 0;
45         u64 search_start = 0;
46         u64 search_end = device->total_bytes;
47         int ret;
48         int slot = 0;
49         int start_found;
50         struct extent_buffer *l;
51
52         start_found = 0;
53         path->reada = 2;
54
55         /* FIXME use last free of some kind */
56
57         key.objectid = device->devid;
58         key.offset = search_start;
59         key.type = BTRFS_DEV_EXTENT_KEY;
60         ret = btrfs_search_slot(trans, root, &key, path, 0, 0);
61         if (ret < 0)
62                 goto error;
63         ret = btrfs_previous_item(root, path, 0, key.type);
64         if (ret < 0)
65                 goto error;
66         l = path->nodes[0];
67         btrfs_item_key_to_cpu(l, &key, path->slots[0]);
68         while (1) {
69                 l = path->nodes[0];
70                 slot = path->slots[0];
71                 if (slot >= btrfs_header_nritems(l)) {
72                         ret = btrfs_next_leaf(root, path);
73                         if (ret == 0)
74                                 continue;
75                         if (ret < 0)
76                                 goto error;
77 no_more_items:
78                         if (!start_found) {
79                                 if (search_start >= search_end) {
80                                         ret = -ENOSPC;
81                                         goto error;
82                                 }
83                                 *start = search_start;
84                                 start_found = 1;
85                                 goto check_pending;
86                         }
87                         *start = last_byte > search_start ?
88                                 last_byte : search_start;
89                         if (search_end <= *start) {
90                                 ret = -ENOSPC;
91                                 goto error;
92                         }
93                         goto check_pending;
94                 }
95                 btrfs_item_key_to_cpu(l, &key, slot);
96
97                 if (key.objectid < device->devid)
98                         goto next;
99
100                 if (key.objectid > device->devid)
101                         goto no_more_items;
102
103                 if (key.offset >= search_start && key.offset > last_byte &&
104                     start_found) {
105                         if (last_byte < search_start)
106                                 last_byte = search_start;
107                         hole_size = key.offset - last_byte;
108                         if (key.offset > last_byte &&
109                             hole_size >= num_bytes) {
110                                 *start = last_byte;
111                                 goto check_pending;
112                         }
113                 }
114                 if (btrfs_key_type(&key) != BTRFS_DEV_EXTENT_KEY) {
115                         goto next;
116                 }
117
118                 start_found = 1;
119                 dev_extent = btrfs_item_ptr(l, slot, struct btrfs_dev_extent);
120                 last_byte = key.offset + btrfs_dev_extent_length(l, dev_extent);
121 next:
122                 path->slots[0]++;
123                 cond_resched();
124         }
125 check_pending:
126         /* we have to make sure we didn't find an extent that has already
127          * been allocated by the map tree or the original allocation
128          */
129         btrfs_release_path(root, path);
130         BUG_ON(*start < search_start);
131
132         if (*start + num_bytes > search_end) {
133                 ret = -ENOSPC;
134                 goto error;
135         }
136         /* check for pending inserts here */
137         return 0;
138
139 error:
140         btrfs_release_path(root, path);
141         return ret;
142 }
143
144 int btrfs_alloc_dev_extent(struct btrfs_trans_handle *trans,
145                            struct btrfs_device *device,
146                            u64 owner, u64 num_bytes, u64 *start)
147 {
148         int ret;
149         struct btrfs_path *path;
150         struct btrfs_root *root = device->dev_root;
151         struct btrfs_dev_extent *extent;
152         struct extent_buffer *leaf;
153         struct btrfs_key key;
154
155         path = btrfs_alloc_path();
156         if (!path)
157                 return -ENOMEM;
158
159         ret = find_free_dev_extent(trans, device, path, num_bytes, start);
160         if (ret) {
161                 goto err;
162         }
163
164         key.objectid = device->devid;
165         key.offset = *start;
166         key.type = BTRFS_DEV_EXTENT_KEY;
167         ret = btrfs_insert_empty_item(trans, root, path, &key,
168                                       sizeof(*extent));
169         BUG_ON(ret);
170
171         leaf = path->nodes[0];
172         extent = btrfs_item_ptr(leaf, path->slots[0],
173                                 struct btrfs_dev_extent);
174         btrfs_set_dev_extent_owner(leaf, extent, owner);
175         btrfs_set_dev_extent_length(leaf, extent, num_bytes);
176         btrfs_mark_buffer_dirty(leaf);
177 err:
178         btrfs_free_path(path);
179         return ret;
180 }
181
182 static int find_next_chunk(struct btrfs_root *root, u64 *objectid)
183 {
184         struct btrfs_path *path;
185         int ret;
186         struct btrfs_key key;
187         struct btrfs_key found_key;
188
189         path = btrfs_alloc_path();
190         BUG_ON(!path);
191
192         key.objectid = (u64)-1;
193         key.offset = (u64)-1;
194         key.type = BTRFS_CHUNK_ITEM_KEY;
195
196         ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
197         if (ret < 0)
198                 goto error;
199
200         BUG_ON(ret == 0);
201
202         ret = btrfs_previous_item(root, path, 0, BTRFS_CHUNK_ITEM_KEY);
203         if (ret) {
204                 *objectid = 0;
205         } else {
206                 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
207                                       path->slots[0]);
208                 *objectid = found_key.objectid + found_key.offset;
209         }
210         ret = 0;
211 error:
212         btrfs_free_path(path);
213         return ret;
214 }
215
216 static int find_next_devid(struct btrfs_root *root, struct btrfs_path *path,
217                            u64 *objectid)
218 {
219         int ret;
220         struct btrfs_key key;
221         struct btrfs_key found_key;
222
223         key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
224         key.type = BTRFS_DEV_ITEM_KEY;
225         key.offset = (u64)-1;
226
227         ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
228         if (ret < 0)
229                 goto error;
230
231         BUG_ON(ret == 0);
232
233         ret = btrfs_previous_item(root, path, BTRFS_DEV_ITEMS_OBJECTID,
234                                   BTRFS_DEV_ITEM_KEY);
235         if (ret) {
236                 *objectid = 1;
237         } else {
238                 btrfs_item_key_to_cpu(path->nodes[0], &found_key,
239                                       path->slots[0]);
240                 *objectid = found_key.offset + 1;
241         }
242         ret = 0;
243 error:
244         btrfs_release_path(root, path);
245         return ret;
246 }
247
248 /*
249  * the device information is stored in the chunk root
250  * the btrfs_device struct should be fully filled in
251  */
252 int btrfs_add_device(struct btrfs_trans_handle *trans,
253                      struct btrfs_root *root,
254                      struct btrfs_device *device)
255 {
256         int ret;
257         struct btrfs_path *path;
258         struct btrfs_dev_item *dev_item;
259         struct extent_buffer *leaf;
260         struct btrfs_key key;
261         unsigned long ptr;
262         u64 free_devid;
263
264         root = root->fs_info->chunk_root;
265
266         path = btrfs_alloc_path();
267         if (!path)
268                 return -ENOMEM;
269
270         ret = find_next_devid(root, path, &free_devid);
271         if (ret)
272                 goto out;
273
274         key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
275         key.type = BTRFS_DEV_ITEM_KEY;
276         key.offset = free_devid;
277
278         ret = btrfs_insert_empty_item(trans, root, path, &key,
279                                       sizeof(*dev_item) + device->name_len);
280         if (ret)
281                 goto out;
282
283         leaf = path->nodes[0];
284         dev_item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dev_item);
285
286         btrfs_set_device_id(leaf, dev_item, device->devid);
287         btrfs_set_device_type(leaf, dev_item, device->type);
288         btrfs_set_device_io_align(leaf, dev_item, device->io_align);
289         btrfs_set_device_io_width(leaf, dev_item, device->io_width);
290         btrfs_set_device_sector_size(leaf, dev_item, device->sector_size);
291         btrfs_set_device_rdev(leaf, dev_item, device->rdev);
292         btrfs_set_device_partition(leaf, dev_item, device->partition);
293         btrfs_set_device_name_len(leaf, dev_item, device->name_len);
294         btrfs_set_device_total_bytes(leaf, dev_item, device->total_bytes);
295         btrfs_set_device_bytes_used(leaf, dev_item, device->bytes_used);
296
297         ptr = (unsigned long)btrfs_device_name(dev_item);
298         write_extent_buffer(leaf, device->name, ptr, device->name_len);
299
300         ptr = (unsigned long)btrfs_device_uuid(dev_item);
301         write_extent_buffer(leaf, device->uuid, ptr, BTRFS_DEV_UUID_SIZE);
302         btrfs_mark_buffer_dirty(leaf);
303         ret = 0;
304
305 out:
306         btrfs_free_path(path);
307         return ret;
308 }
309 int btrfs_update_device(struct btrfs_trans_handle *trans,
310                         struct btrfs_device *device)
311 {
312         int ret;
313         struct btrfs_path *path;
314         struct btrfs_root *root;
315         struct btrfs_dev_item *dev_item;
316         struct extent_buffer *leaf;
317         struct btrfs_key key;
318
319         root = device->dev_root->fs_info->chunk_root;
320
321         path = btrfs_alloc_path();
322         if (!path)
323                 return -ENOMEM;
324
325         key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
326         key.type = BTRFS_DEV_ITEM_KEY;
327         key.offset = device->devid;
328
329         ret = btrfs_search_slot(trans, root, &key, path, 0, 1);
330         if (ret < 0)
331                 goto out;
332
333         if (ret > 0) {
334                 ret = -ENOENT;
335                 goto out;
336         }
337
338         leaf = path->nodes[0];
339         dev_item = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_dev_item);
340
341         btrfs_set_device_id(leaf, dev_item, device->devid);
342         btrfs_set_device_type(leaf, dev_item, device->type);
343         btrfs_set_device_io_align(leaf, dev_item, device->io_align);
344         btrfs_set_device_io_width(leaf, dev_item, device->io_width);
345         btrfs_set_device_sector_size(leaf, dev_item, device->sector_size);
346         btrfs_set_device_rdev(leaf, dev_item, device->rdev);
347         btrfs_set_device_partition(leaf, dev_item, device->partition);
348         btrfs_set_device_total_bytes(leaf, dev_item, device->total_bytes);
349         btrfs_set_device_bytes_used(leaf, dev_item, device->bytes_used);
350         btrfs_mark_buffer_dirty(leaf);
351
352 out:
353         btrfs_free_path(path);
354         return ret;
355 }
356
357 int btrfs_add_system_chunk(struct btrfs_trans_handle *trans,
358                            struct btrfs_root *root,
359                            struct btrfs_key *key,
360                            struct btrfs_chunk *chunk, int item_size)
361 {
362         struct btrfs_super_block *super_copy = &root->fs_info->super_copy;
363         struct btrfs_disk_key disk_key;
364         u32 array_size;
365         u8 *ptr;
366
367         array_size = btrfs_super_sys_array_size(super_copy);
368         if (array_size + item_size > BTRFS_SYSTEM_CHUNK_ARRAY_SIZE)
369                 return -EFBIG;
370
371         ptr = super_copy->sys_chunk_array + array_size;
372         btrfs_cpu_key_to_disk(&disk_key, key);
373         memcpy(ptr, &disk_key, sizeof(disk_key));
374         ptr += sizeof(disk_key);
375         memcpy(ptr, chunk, item_size);
376         item_size += sizeof(disk_key);
377         btrfs_set_super_sys_array_size(super_copy, array_size + item_size);
378         return 0;
379 }
380
381 int btrfs_alloc_chunk(struct btrfs_trans_handle *trans,
382                       struct btrfs_root *extent_root, u64 *start,
383                       u64 *num_bytes, u64 type)
384 {
385         u64 dev_offset;
386         struct btrfs_root *chunk_root = extent_root->fs_info->chunk_root;
387         struct btrfs_stripe *stripes;
388         struct btrfs_device *device = NULL;
389         struct btrfs_chunk *chunk;
390         struct list_head private_devs;
391         struct list_head *dev_list = &extent_root->fs_info->devices;
392         struct list_head *cur;
393         struct map_lookup *map;
394         u64 physical;
395         u64 calc_size = 1024 * 1024 * 1024;
396         u64 avail;
397         u64 max_avail = 0;
398         int num_stripes = 1;
399         int looped = 0;
400         int ret;
401         int index;
402         struct btrfs_key key;
403
404         if (list_empty(dev_list))
405                 return -ENOSPC;
406 again:
407         INIT_LIST_HEAD(&private_devs);
408         cur = dev_list->next;
409         index = 0;
410         /* build a private list of devices we will allocate from */
411         while(index < num_stripes) {
412                 device = list_entry(cur, struct btrfs_device, dev_list);
413                 avail = device->total_bytes - device->bytes_used;
414                 cur = cur->next;
415                 if (avail > max_avail)
416                         max_avail = avail;
417                 if (avail >= calc_size) {
418                         list_move_tail(&device->dev_list, &private_devs);
419                         index++;
420                 }
421                 if (cur == dev_list)
422                         break;
423         }
424         if (index < num_stripes) {
425                 list_splice(&private_devs, dev_list);
426                 if (!looped && max_avail > 0) {
427                         looped = 1;
428                         calc_size = max_avail;
429                         goto again;
430                 }
431                 return -ENOSPC;
432         }
433
434         ret = find_next_chunk(chunk_root, &key.objectid);
435         if (ret)
436                 return ret;
437
438         chunk = kmalloc(btrfs_chunk_item_size(num_stripes), GFP_NOFS);
439         if (!chunk)
440                 return -ENOMEM;
441
442         stripes = &chunk->stripe;
443
444         *num_bytes = calc_size;
445         index = 0;
446         while(index < num_stripes) {
447                 BUG_ON(list_empty(&private_devs));
448                 cur = private_devs.next;
449                 device = list_entry(cur, struct btrfs_device, dev_list);
450                 list_move_tail(&device->dev_list, dev_list);
451
452                 ret = btrfs_alloc_dev_extent(trans, device,
453                                              key.objectid,
454                                              calc_size, &dev_offset);
455                 BUG_ON(ret);
456
457                 device->bytes_used += calc_size;
458                 ret = btrfs_update_device(trans, device);
459                 BUG_ON(ret);
460
461                 btrfs_set_stack_stripe_devid(stripes + index, device->devid);
462                 btrfs_set_stack_stripe_offset(stripes + index, dev_offset);
463                 physical = dev_offset;
464                 index++;
465         }
466         BUG_ON(!list_empty(&private_devs));
467
468         /* key.objectid was set above */
469         key.offset = *num_bytes;
470         key.type = BTRFS_CHUNK_ITEM_KEY;
471         btrfs_set_stack_chunk_owner(chunk, extent_root->root_key.objectid);
472         btrfs_set_stack_chunk_stripe_len(chunk, 64 * 1024);
473         btrfs_set_stack_chunk_type(chunk, type);
474         btrfs_set_stack_chunk_num_stripes(chunk, num_stripes);
475         btrfs_set_stack_chunk_io_align(chunk, extent_root->sectorsize);
476         btrfs_set_stack_chunk_io_width(chunk, extent_root->sectorsize);
477         btrfs_set_stack_chunk_sector_size(chunk, extent_root->sectorsize);
478
479         ret = btrfs_insert_item(trans, chunk_root, &key, chunk,
480                                 btrfs_chunk_item_size(num_stripes));
481         BUG_ON(ret);
482         *start = key.objectid;
483
484         map = kmalloc(sizeof(*map), GFP_NOFS);
485         if (!map)
486                 return -ENOMEM;
487
488         map->ce.start = key.objectid;
489         map->ce.size = key.offset;
490
491         map->physical = physical;
492         map->dev = device;
493
494         if (!map->dev) {
495                 kfree(map);
496                 return -EIO;
497         }
498         ret = insert_existing_cache_extent(
499                            &extent_root->fs_info->mapping_tree.cache_tree,
500                            &map->ce);
501         BUG_ON(ret);
502
503         kfree(chunk);
504         return ret;
505 }
506
507 void btrfs_mapping_init(struct btrfs_mapping_tree *tree)
508 {
509         cache_tree_init(&tree->cache_tree);
510 }
511
512 int btrfs_map_block(struct btrfs_mapping_tree *map_tree,
513                     u64 logical, u64 *phys, u64 *length,
514                     struct btrfs_device **dev)
515 {
516         struct cache_extent *ce;
517         struct map_lookup *map;
518         u64 offset;
519
520         ce = find_first_cache_extent(&map_tree->cache_tree, logical);
521         BUG_ON(!ce);
522         BUG_ON(ce->start > logical || ce->start + ce->size < logical);
523         map = container_of(ce, struct map_lookup, ce);
524         offset = logical - ce->start;
525         *phys = map->physical + offset;
526         *length = ce->size - offset;
527         *dev = map->dev;
528         return 0;
529 }
530
531 struct btrfs_device *btrfs_find_device(struct btrfs_root *root, u64 devid)
532 {
533         struct btrfs_device *dev;
534         struct list_head *cur = root->fs_info->devices.next;
535         struct list_head *head = &root->fs_info->devices;
536
537         while(cur != head) {
538                 dev = list_entry(cur, struct btrfs_device, dev_list);
539                 if (dev->devid == devid)
540                         return dev;
541                 cur = cur->next;
542         }
543         return NULL;
544 }
545
546 static int read_one_chunk(struct btrfs_root *root, struct btrfs_key *key,
547                           struct extent_buffer *leaf,
548                           struct btrfs_chunk *chunk)
549 {
550         struct btrfs_mapping_tree *map_tree = &root->fs_info->mapping_tree;
551         struct map_lookup *map;
552         struct cache_extent *ce;
553         u64 logical;
554         u64 length;
555         u64 devid;
556         int ret;
557
558         logical = key->objectid;
559         length = key->offset;
560         ce = find_first_cache_extent(&map_tree->cache_tree, logical);
561
562         /* already mapped? */
563         if (ce && ce->start <= logical && ce->start + ce->size > logical) {
564                 return 0;
565         }
566
567         map = kmalloc(sizeof(*map), GFP_NOFS);
568         if (!map)
569                 return -ENOMEM;
570
571         map->ce.start = logical;
572         map->ce.size = length;
573
574         map->physical = btrfs_stripe_offset_nr(leaf, chunk, 0);
575         devid = btrfs_stripe_devid_nr(leaf, chunk, 0);
576         map->dev = btrfs_find_device(root, devid);
577
578         if (!map->dev) {
579                 kfree(map);
580                 return -EIO;
581         }
582         ret = insert_existing_cache_extent(&map_tree->cache_tree, &map->ce);
583         BUG_ON(ret);
584
585         return 0;
586 }
587
588 static int fill_device_from_item(struct extent_buffer *leaf,
589                                  struct btrfs_dev_item *dev_item,
590                                  struct btrfs_device *device)
591 {
592         unsigned long ptr;
593         char *name;
594
595         device->devid = btrfs_device_id(leaf, dev_item);
596         device->total_bytes = btrfs_device_total_bytes(leaf, dev_item);
597         device->bytes_used = btrfs_device_bytes_used(leaf, dev_item);
598         device->type = btrfs_device_type(leaf, dev_item);
599         device->io_align = btrfs_device_io_align(leaf, dev_item);
600         device->io_width = btrfs_device_io_width(leaf, dev_item);
601         device->sector_size = btrfs_device_sector_size(leaf, dev_item);
602         device->rdev = btrfs_device_rdev(leaf, dev_item);
603         device->partition = btrfs_device_partition(leaf, dev_item);
604         device->name_len = btrfs_device_name_len(leaf, dev_item);
605
606         ptr = (unsigned long)btrfs_device_uuid(dev_item);
607         read_extent_buffer(leaf, device->uuid, ptr, BTRFS_DEV_UUID_SIZE);
608
609         name = kmalloc(device->name_len + 1, GFP_NOFS);
610         if (!name)
611                 return -ENOMEM;
612         device->name = name;
613         ptr = (unsigned long)btrfs_device_name(dev_item);
614         read_extent_buffer(leaf, name, ptr, device->name_len);
615         name[device->name_len] = '\0';
616         return 0;
617 }
618
619 static int read_one_dev(struct btrfs_root *root, struct btrfs_key *key,
620                         struct extent_buffer *leaf,
621                         struct btrfs_dev_item *dev_item)
622 {
623         struct btrfs_device *device;
624         u64 devid;
625         int ret;
626
627         devid = btrfs_device_id(leaf, dev_item);
628         device = btrfs_find_device(root, devid);
629         if (!device) {
630                 device = kmalloc(sizeof(*device), GFP_NOFS);
631                 if (!device)
632                         return -ENOMEM;
633                 list_add(&device->dev_list, &root->fs_info->devices);
634         }
635
636         fill_device_from_item(leaf, dev_item, device);
637         device->dev_root = root->fs_info->dev_root;
638         device->fd = 0;
639         memcpy(&device->dev_key, key, sizeof(*key));
640         ret = btrfs_open_device(device);
641         if (ret) {
642                 kfree(device);
643         }
644         return ret;
645 }
646
647 int btrfs_read_sys_array(struct btrfs_root *root)
648 {
649         struct btrfs_super_block *super_copy = &root->fs_info->super_copy;
650         struct extent_buffer *sb = root->fs_info->sb_buffer;
651         struct btrfs_disk_key *disk_key;
652         struct btrfs_dev_item *dev_item;
653         struct btrfs_chunk *chunk;
654         struct btrfs_key key;
655         u32 num_stripes;
656         u32 array_size;
657         u32 len = 0;
658         u8 *ptr;
659         unsigned long sb_ptr;
660         u32 cur;
661         int ret;
662         int dev_only = 1;
663
664         array_size = btrfs_super_sys_array_size(super_copy);
665
666         /*
667          * we do this loop twice, once for the device items and
668          * once for all of the chunks.  This way there are device
669          * structs filled in for every chunk
670          */
671 again:
672         ptr = super_copy->sys_chunk_array;
673         sb_ptr = offsetof(struct btrfs_super_block, sys_chunk_array);
674         cur = 0;
675
676         while (cur < array_size) {
677                 disk_key = (struct btrfs_disk_key *)ptr;
678                 btrfs_disk_key_to_cpu(&key, disk_key);
679
680                 len = sizeof(*disk_key);
681                 ptr += len;
682                 sb_ptr += len;
683                 cur += len;
684
685                 if (key.objectid == BTRFS_DEV_ITEMS_OBJECTID &&
686                     key.type == BTRFS_DEV_ITEM_KEY) {
687                         dev_item = (struct btrfs_dev_item *)sb_ptr;
688                         if (dev_only) {
689                                 ret = read_one_dev(root, &key, sb, dev_item);
690                                 BUG_ON(ret);
691                         }
692                         len = sizeof(*dev_item);
693                         len += btrfs_device_name_len(sb, dev_item);
694                 } else if (key.type == BTRFS_CHUNK_ITEM_KEY) {
695
696                         chunk = (struct btrfs_chunk *)sb_ptr;
697                         if (!dev_only) {
698                                 ret = read_one_chunk(root, &key, sb, chunk);
699                                 BUG_ON(ret);
700                         }
701                         num_stripes = btrfs_chunk_num_stripes(sb, chunk);
702                         len = btrfs_chunk_item_size(num_stripes);
703                 } else {
704                         BUG();
705                 }
706                 ptr += len;
707                 sb_ptr += len;
708                 cur += len;
709         }
710         if (dev_only == 1) {
711                 dev_only = 0;
712                 goto again;
713         }
714         return 0;
715 }
716
717 int btrfs_read_chunk_tree(struct btrfs_root *root)
718 {
719         struct btrfs_path *path;
720         struct extent_buffer *leaf;
721         struct btrfs_key key;
722         struct btrfs_key found_key;
723         int ret;
724         int slot;
725
726         root = root->fs_info->chunk_root;
727
728         path = btrfs_alloc_path();
729         if (!path)
730                 return -ENOMEM;
731
732         /* first we search for all of the device items, and then we
733          * read in all of the chunk items.  This way we can create chunk
734          * mappings that reference all of the devices that are afound
735          */
736         key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
737         key.offset = 0;
738         key.type = 0;
739 again:
740         ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
741         while(1) {
742                 leaf = path->nodes[0];
743                 slot = path->slots[0];
744                 if (slot >= btrfs_header_nritems(leaf)) {
745                         ret = btrfs_next_leaf(root, path);
746                         if (ret == 0)
747                                 continue;
748                         if (ret < 0)
749                                 goto error;
750                         break;
751                 }
752                 btrfs_item_key_to_cpu(leaf, &found_key, slot);
753                 if (key.objectid == BTRFS_DEV_ITEMS_OBJECTID) {
754                         if (found_key.objectid != BTRFS_DEV_ITEMS_OBJECTID)
755                                 break;
756                         if (found_key.type == BTRFS_DEV_ITEM_KEY) {
757                                 struct btrfs_dev_item *dev_item;
758                                 dev_item = btrfs_item_ptr(leaf, slot,
759                                                   struct btrfs_dev_item);
760                                 ret = read_one_dev(root, &found_key, leaf,
761                                                    dev_item);
762                                 BUG_ON(ret);
763                         }
764                 } else if (found_key.type == BTRFS_CHUNK_ITEM_KEY) {
765                         struct btrfs_chunk *chunk;
766                         chunk = btrfs_item_ptr(leaf, slot, struct btrfs_chunk);
767                         ret = read_one_chunk(root, &found_key, leaf, chunk);
768                 }
769                 path->slots[0]++;
770         }
771         if (key.objectid == BTRFS_DEV_ITEMS_OBJECTID) {
772                 key.objectid = 0;
773                 btrfs_release_path(root, path);
774                 goto again;
775         }
776
777         btrfs_free_path(path);
778         ret = 0;
779 error:
780         return ret;
781 }
782