Direct I/O retry needs to know the number of mirror copies.

Signed-off-by: jim owens <jow...@hp.com>
---
 fs/btrfs/volumes.c |   22 ++++++++++++++--------
 fs/btrfs/volumes.h |    1 +
 2 files changed, 15 insertions(+), 8 deletions(-)

diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index 6aa04e4..3dda2ce 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -2574,10 +2574,20 @@ void btrfs_mapping_tree_free(struct btrfs_mapping_tree 
*tree)
        }
 }
 
+int btrfs_map_num_copies(struct extent_map *em)
+{
+       struct map_lookup *map = (struct map_lookup *)em->bdev;
+
+       if (map->type & (BTRFS_BLOCK_GROUP_DUP | BTRFS_BLOCK_GROUP_RAID1))
+               return map->num_stripes;
+       if (map->type & BTRFS_BLOCK_GROUP_RAID10)
+               return map->sub_stripes;
+       return 1; 
+}
+
 int btrfs_num_copies(struct btrfs_mapping_tree *map_tree, u64 logical, u64 len)
 {
        struct extent_map *em;
-       struct map_lookup *map;
        struct extent_map_tree *em_tree = &map_tree->map_tree;
        int ret;
 
@@ -2587,13 +2597,9 @@ int btrfs_num_copies(struct btrfs_mapping_tree 
*map_tree, u64 logical, u64 len)
        BUG_ON(!em);
 
        BUG_ON(em->start > logical || em->start + em->len < logical);
-       map = (struct map_lookup *)em->bdev;
-       if (map->type & (BTRFS_BLOCK_GROUP_DUP | BTRFS_BLOCK_GROUP_RAID1))
-               ret = map->num_stripes;
-       else if (map->type & BTRFS_BLOCK_GROUP_RAID10)
-               ret = map->sub_stripes;
-       else
-               ret = 1;
+
+       ret = btrfs_map_num_copies(em);
+
        free_extent_map(em);
        return ret;
 }
diff --git a/fs/btrfs/volumes.h b/fs/btrfs/volumes.h
index 226200d..732c8c5 100644
--- a/fs/btrfs/volumes.h
+++ b/fs/btrfs/volumes.h
@@ -195,4 +195,5 @@ int find_free_dev_extent(struct btrfs_trans_handle *trans,
 int btrfs_map_stripe_count(struct extent_map *em);
 struct block_device *btrfs_map_stripe_bdev(struct extent_map *em, int stripe);
 u64 btrfs_map_stripe_physical(struct extent_map *em, int stripe);
+int btrfs_map_num_copies(struct extent_map *em);
 #endif
-- 
1.5.6.3
--
To unsubscribe from this list: send the line "unsubscribe linux-btrfs" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to