|
@@ -5646,14 +5646,15 @@ int btrfs_read_chunk_tree(struct btrfs_root *root)
|
|
|
mutex_lock(&uuid_mutex);
|
|
|
lock_chunks(root);
|
|
|
|
|
|
- /* first we search for all of the device items, and then we
|
|
|
- * read in all of the chunk items. This way we can create chunk
|
|
|
- * mappings that reference all of the devices that are afound
|
|
|
+ /*
|
|
|
+ * Read all device items, and then all the chunk items. All
|
|
|
+ * device items are found before any chunk item (their object id
|
|
|
+ * is smaller than the lowest possible object id for a chunk
|
|
|
+ * item - BTRFS_FIRST_CHUNK_TREE_OBJECTID).
|
|
|
*/
|
|
|
key.objectid = BTRFS_DEV_ITEMS_OBJECTID;
|
|
|
key.offset = 0;
|
|
|
key.type = 0;
|
|
|
-again:
|
|
|
ret = btrfs_search_slot(NULL, root, &key, path, 0, 0);
|
|
|
if (ret < 0)
|
|
|
goto error;
|
|
@@ -5669,17 +5670,13 @@ again:
|
|
|
break;
|
|
|
}
|
|
|
btrfs_item_key_to_cpu(leaf, &found_key, slot);
|
|
|
- if (key.objectid == BTRFS_DEV_ITEMS_OBJECTID) {
|
|
|
- if (found_key.objectid != BTRFS_DEV_ITEMS_OBJECTID)
|
|
|
- break;
|
|
|
- if (found_key.type == BTRFS_DEV_ITEM_KEY) {
|
|
|
- struct btrfs_dev_item *dev_item;
|
|
|
- dev_item = btrfs_item_ptr(leaf, slot,
|
|
|
+ if (found_key.type == BTRFS_DEV_ITEM_KEY) {
|
|
|
+ struct btrfs_dev_item *dev_item;
|
|
|
+ dev_item = btrfs_item_ptr(leaf, slot,
|
|
|
struct btrfs_dev_item);
|
|
|
- ret = read_one_dev(root, leaf, dev_item);
|
|
|
- if (ret)
|
|
|
- goto error;
|
|
|
- }
|
|
|
+ ret = read_one_dev(root, leaf, dev_item);
|
|
|
+ if (ret)
|
|
|
+ goto error;
|
|
|
} else if (found_key.type == BTRFS_CHUNK_ITEM_KEY) {
|
|
|
struct btrfs_chunk *chunk;
|
|
|
chunk = btrfs_item_ptr(leaf, slot, struct btrfs_chunk);
|
|
@@ -5689,11 +5686,6 @@ again:
|
|
|
}
|
|
|
path->slots[0]++;
|
|
|
}
|
|
|
- if (key.objectid == BTRFS_DEV_ITEMS_OBJECTID) {
|
|
|
- key.objectid = 0;
|
|
|
- btrfs_release_path(path);
|
|
|
- goto again;
|
|
|
- }
|
|
|
ret = 0;
|
|
|
error:
|
|
|
unlock_chunks(root);
|