Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

Btrfs: Simplify device selection for mirrored reads

parent f2d8d74d
Loading
Loading
Loading
Loading
+4 −4
Original line number Diff line number Diff line
@@ -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,
+7 −16
Original line number Diff line number Diff line
@@ -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