Btrfs: Simplify device selection for mirrored reads
authorChris Mason <chris.mason@oracle.com>
Mon, 21 Apr 2008 16:01:38 +0000 (12:01 -0400)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:04:02 +0000 (11:04 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/extent-tree.c
fs/btrfs/volumes.c

index 593011e5d455f8359667f91b163265ec0776cd8f..cc0d7f30c36b7be2b3d3f3796bae41d7b7f92a1d 100644 (file)
@@ -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,
index 460240706505764f82169b2becea0a37b82488ce..107fc74c3ab846613a6d34c9d921c15b04d0a6eb 100644 (file)
@@ -1029,19 +1029,8 @@ again:
                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 @@ again:
                        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 @@ again:
                        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