Btrfs: Simplify device selection for mirrored reads
Signed-off-by: Chris Mason <chris.mason@oracle.com>
This commit is contained in:
@@ -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,
|
|||||||
|
|
||||||
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,
|
|||||||
|
|
||||||
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
|
|||||||
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 @@ again:
|
|||||||
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 @@ again:
|
|||||||
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 @@ again:
|
|||||||
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
|
||||||
|
Reference in New Issue
Block a user