diff options
author | Chris Mason <chris.mason@oracle.com> | 2008-12-08 16:43:10 -0500 |
---|---|---|
committer | Chris Mason <chris.mason@oracle.com> | 2008-12-08 16:43:10 -0500 |
commit | 934d375bacf9ea8a37fbfff5f3cf1c093f324095 (patch) | |
tree | e81948e6e26028fd979ce59f4fc5988c1813694c /fs/btrfs/volumes.c | |
parent | a512bbf855ff0af474257475f2e6da7acd854f52 (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.c | 5 |
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++) { |