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>
This commit is contained in:
Chris Mason
2008-12-08 16:43:10 -05:00
parent a512bbf855
commit 934d375bac
3 changed files with 9 additions and 2 deletions

View File

@ -813,7 +813,8 @@ static noinline int generic_bin_search(struct extent_buffer *eb,
unmap_extent_buffer(eb, map_token, KM_USER0);
map_token = NULL;
}
err = map_extent_buffer(eb, offset,
err = map_private_extent_buffer(eb, offset,
sizeof(struct btrfs_disk_key),
&map_token, &kaddr,
&map_start, &map_len, KM_USER0);
@ -3585,6 +3586,7 @@ int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
int level;
int ret = 1;
WARN_ON(!path->keep_locks);
again:
cur = btrfs_lock_root_node(root);
level = btrfs_header_level(cur);
@ -3708,6 +3710,7 @@ int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
int slot;
struct extent_buffer *c;
WARN_ON(!path->keep_locks);
while(level < BTRFS_MAX_LEVEL) {
if (!path->nodes[level])
return 1;