aboutsummaryrefslogtreecommitdiffstats
path: root/fs/btrfs/volumes.c
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-12-08 16:43:10 -0500
committerChris Mason <chris.mason@oracle.com>2008-12-08 16:43:10 -0500
commit934d375bacf9ea8a37fbfff5f3cf1c093f324095 (patch)
treee81948e6e26028fd979ce59f4fc5988c1813694c /fs/btrfs/volumes.c
parenta512bbf855ff0af474257475f2e6da7acd854f52 (diff)
Btrfs: Use map_private_extent_buffer during generic_bin_search
It is possible that generic_bin_search will be called on a tree block that has not been locked. This happens because cache_block_block skips locking on the tree blocks. Since the tree block isn't locked, we aren't allowed to change the extent_buffer->map_token field. Using map_private_extent_buffer avoids any changes to the internal extent buffer fields. Signed-off-by: Chris Mason <chris.mason@oracle.com>
Diffstat (limited to 'fs/btrfs/volumes.c')
-rw-r--r--fs/btrfs/volumes.c5
1 files changed, 4 insertions, 1 deletions
diff --git a/fs/btrfs/volumes.c b/fs/btrfs/volumes.c
index a79b3cc09e94..825364fae690 100644
--- a/fs/btrfs/volumes.c
+++ b/fs/btrfs/volumes.c
@@ -2594,12 +2594,15 @@ int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
2594 stripe_nr = stripe_nr * map->num_stripes + i; 2594 stripe_nr = stripe_nr * map->num_stripes + i;
2595 } 2595 }
2596 bytenr = chunk_start + stripe_nr * map->stripe_len; 2596 bytenr = chunk_start + stripe_nr * map->stripe_len;
2597 WARN_ON(nr >= map->num_stripes);
2597 for (j = 0; j < nr; j++) { 2598 for (j = 0; j < nr; j++) {
2598 if (buf[j] == bytenr) 2599 if (buf[j] == bytenr)
2599 break; 2600 break;
2600 } 2601 }
2601 if (j == nr) 2602 if (j == nr) {
2603 WARN_ON(nr >= map->num_stripes);
2602 buf[nr++] = bytenr; 2604 buf[nr++] = bytenr;
2605 }
2603 } 2606 }
2604 2607
2605 for (i = 0; i > nr; i++) { 2608 for (i = 0; i > nr; i++) {