mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
Btrfs: Simplify device selection for mirrored reads
Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
parent
f2d8d74d78
commit
3c12ac7205
2 changed files with 11 additions and 20 deletions
|
@ -640,7 +640,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
|
|||
if (!path)
|
||||
return -ENOMEM;
|
||||
|
||||
path->reada = 0;
|
||||
path->reada = 1;
|
||||
key.objectid = bytenr;
|
||||
btrfs_set_key_type(&key, BTRFS_EXTENT_ITEM_KEY);
|
||||
key.offset = num_bytes;
|
||||
|
@ -660,7 +660,7 @@ int btrfs_inc_extent_ref(struct btrfs_trans_handle *trans,
|
|||
|
||||
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,
|
||||
path, bytenr, root_objectid,
|
||||
ref_generation, owner, owner_offset);
|
||||
|
@ -692,7 +692,7 @@ static int lookup_extent_ref(struct btrfs_trans_handle *trans,
|
|||
|
||||
WARN_ON(num_bytes < root->sectorsize);
|
||||
path = btrfs_alloc_path();
|
||||
path->reada = 0;
|
||||
path->reada = 1;
|
||||
key.objectid = bytenr;
|
||||
key.offset = num_bytes;
|
||||
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
|
|||
if (!path)
|
||||
return -ENOMEM;
|
||||
|
||||
path->reada = 0;
|
||||
path->reada = 1;
|
||||
ret = lookup_extent_backref(trans, extent_root, path,
|
||||
bytenr, root_objectid,
|
||||
ref_generation,
|
||||
|
|
|
@ -1029,19 +1029,8 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
|
|||
else if (mirror_num) {
|
||||
stripe_index = mirror_num - 1;
|
||||
} else {
|
||||
int i;
|
||||
u64 least = (u64)-1;
|
||||
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);
|
||||
}
|
||||
u64 orig_stripe_nr = stripe_nr;
|
||||
stripe_index = do_div(orig_stripe_nr, num_stripes);
|
||||
}
|
||||
} else if (map->type & BTRFS_BLOCK_GROUP_DUP) {
|
||||
if (rw & (1 << BIO_RW))
|
||||
|
@ -1050,7 +1039,6 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
|
|||
stripe_index = mirror_num - 1;
|
||||
} else if (map->type & BTRFS_BLOCK_GROUP_RAID10) {
|
||||
int factor = map->num_stripes / map->sub_stripes;
|
||||
int orig_stripe_nr = stripe_nr;
|
||||
|
||||
stripe_index = do_div(stripe_nr, factor);
|
||||
stripe_index *= map->sub_stripes;
|
||||
|
@ -1059,8 +1047,11 @@ static int __btrfs_map_block(struct btrfs_mapping_tree *map_tree, int rw,
|
|||
num_stripes = map->sub_stripes;
|
||||
else if (mirror_num)
|
||||
stripe_index += mirror_num - 1;
|
||||
else
|
||||
stripe_index += orig_stripe_nr % map->sub_stripes;
|
||||
else {
|
||||
u64 orig_stripe_nr = stripe_nr;
|
||||
stripe_index += do_div(orig_stripe_nr,
|
||||
map->sub_stripes);
|
||||
}
|
||||
} else {
|
||||
/*
|
||||
* after this do_div call, stripe_nr is the number of stripes
|
||||
|
|
Loading…
Reference in a new issue