Commit 3c12ac72 authored by Chris Mason's avatar Chris Mason

Btrfs: Simplify device selection for mirrored reads

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent f2d8d74d
...@@ -640,7 +640,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, ...@@ -640,7 +640,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
if (!path) if (!path)
return -ENOMEM; return -ENOMEM;
path->reada = 0; path->reada = 1;
key.objectid = bytenr; key.objectid = bytenr;
btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY);
key.offset = num_bytes; key.offset = num_bytes;
...@@ -660,7 +660,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans, ...@@ -660,7 +660,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
btrfs_release_path(root->fs_info->extent_root, path); btrfs_release_path(root->fs_info->extent_root, path);
path->reada = 0; path->reada = 1;
ret = btrfs_insert_extent_backref(trans, root->fs_info->extent_root, ret = btrfs_insert_extent_backref(trans, root->fs_info->extent_root,
path, bytenr, root_objectid, path, bytenr, root_objectid,
ref_generation, owner, owner_offset); ref_generation, owner, owner_offset);
...@@ -692,7 +692,7 @@ static int lookup_extent_ref(struct btrfs_trans_handle *trans, ...@@ -692,7 +692,7 @@ static int lookup_extent_ref(struct btrfs_trans_handle *trans,
WARN_ON(num_bytes < root->sectorsize); WARN_ON(num_bytes < root->sectorsize);
path = btrfs_alloc_path(); path = btrfs_alloc_path();
path->reada = 0; path->reada = 1;
key.objectid = bytenr; key.objectid = bytenr;
key.offset = num_bytes; key.offset = num_bytes;
btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY); btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY);
...@@ -1328,7 +1328,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root ...@@ -1328,7 +1328,7 @@ static int __free_extent(struct btrfs_trans_handle *trans, struct btrfs_root
if (!path) if (!path)
return -ENOMEM; return -ENOMEM;
path->reada = 0; path->reada = 1;
ret = lookup_extent_backref(trans, extent_root, path, ret = lookup_extent_backref(trans, extent_root, path,
bytenr, root_objectid, bytenr, root_objectid,
ref_generation, ref_generation,
......
...@@ -1029,19 +1029,8 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw, ...@@ -1029,19 +1029,8 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
else if (mirror_num) { else if (mirror_num) {
stripe_index = mirror_num - 1; stripe_index = mirror_num - 1;
} else { } else {
int i; u64 orig_stripe_nr = stripe_nr;
u64 least = (u64)-1; stripe_index = do_div(orig_stripe_nr, num_stripes);
struct btrfs_device *cur;
for (i = 0; i < map->num_stripes; i++) {
cur = map->stripes[i].dev;
spin_lock(&cur->io_lock);
if (cur->total_ios < least) {
least = cur->total_ios;
stripe_index = i;
}
spin_unlock(&cur->io_lock);
}
} }
} else if (map->type & BTRFS_BLOCK_GROUP_DUP) { } else if (map->type & BTRFS_BLOCK_GROUP_DUP) {
if (rw & (1 << BIO_RW)) if (rw & (1 << BIO_RW))
...@@ -1050,7 +1039,6 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw, ...@@ -1050,7 +1039,6 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
stripe_index = mirror_num - 1; stripe_index = mirror_num - 1;
} else if (map->type & BTRFS_BLOCK_GROUP_RAID10) { } else if (map->type & BTRFS_BLOCK_GROUP_RAID10) {
int factor = map->num_stripes / map->sub_stripes; int factor = map->num_stripes / map->sub_stripes;
int orig_stripe_nr = stripe_nr;
stripe_index = do_div(stripe_nr, factor); stripe_index = do_div(stripe_nr, factor);
stripe_index *= map->sub_stripes; stripe_index *= map->sub_stripes;
...@@ -1059,8 +1047,11 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw, ...@@ -1059,8 +1047,11 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
num_stripes = map->sub_stripes; num_stripes = map->sub_stripes;
else if (mirror_num) else if (mirror_num)
stripe_index += mirror_num - 1; stripe_index += mirror_num - 1;
else else {
stripe_index += orig_stripe_nr % map->sub_stripes; u64 orig_stripe_nr = stripe_nr;
stripe_index += do_div(orig_stripe_nr,
map->sub_stripes);
}
} else { } else {
/* /*
* after this do_div call, stripe_nr is the number of stripes * after this do_div call, stripe_nr is the number of stripes
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment