提交 934d375b 编写于 作者: C Chris Mason

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: NChris Mason <chris.mason@oracle.com>
上级 a512bbf8
...@@ -813,7 +813,8 @@ static noinline int generic_bin_search(struct extent_buffer *eb, ...@@ -813,7 +813,8 @@ static noinline int generic_bin_search(struct extent_buffer *eb,
unmap_extent_buffer(eb, map_token, KM_USER0); unmap_extent_buffer(eb, map_token, KM_USER0);
map_token = NULL; map_token = NULL;
} }
err = map_extent_buffer(eb, offset,
err = map_private_extent_buffer(eb, offset,
sizeof(struct btrfs_disk_key), sizeof(struct btrfs_disk_key),
&map_token, &kaddr, &map_token, &kaddr,
&map_start, &map_len, KM_USER0); &map_start, &map_len, KM_USER0);
...@@ -3585,6 +3586,7 @@ int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key, ...@@ -3585,6 +3586,7 @@ int btrfs_search_forward(struct btrfs_root *root, struct btrfs_key *min_key,
int level; int level;
int ret = 1; int ret = 1;
WARN_ON(!path->keep_locks);
again: again:
cur = btrfs_lock_root_node(root); cur = btrfs_lock_root_node(root);
level = btrfs_header_level(cur); level = btrfs_header_level(cur);
...@@ -3708,6 +3710,7 @@ int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path, ...@@ -3708,6 +3710,7 @@ int btrfs_find_next_key(struct btrfs_root *root, struct btrfs_path *path,
int slot; int slot;
struct extent_buffer *c; struct extent_buffer *c;
WARN_ON(!path->keep_locks);
while(level < BTRFS_MAX_LEVEL) { while(level < BTRFS_MAX_LEVEL) {
if (!path->nodes[level]) if (!path->nodes[level])
return 1; return 1;
......
...@@ -3471,6 +3471,7 @@ int map_extent_buffer(struct extent_buffer *eb, unsigned long start, ...@@ -3471,6 +3471,7 @@ int map_extent_buffer(struct extent_buffer *eb, unsigned long start,
unmap_extent_buffer(eb, eb->map_token, km); unmap_extent_buffer(eb, eb->map_token, km);
eb->map_token = NULL; eb->map_token = NULL;
save = 1; save = 1;
WARN_ON(!mutex_is_locked(&eb->mutex));
} }
err = map_private_extent_buffer(eb, start, min_len, token, map, err = map_private_extent_buffer(eb, start, min_len, token, map,
map_start, map_len, km); map_start, map_len, km);
......
...@@ -2594,12 +2594,15 @@ int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree, ...@@ -2594,12 +2594,15 @@ int btrfs_rmap_block(struct btrfs_mapping_tree *map_tree,
stripe_nr = stripe_nr * map->num_stripes + i; stripe_nr = stripe_nr * map->num_stripes + i;
} }
bytenr = chunk_start + stripe_nr * map->stripe_len; bytenr = chunk_start + stripe_nr * map->stripe_len;
WARN_ON(nr >= map->num_stripes);
for (j = 0; j < nr; j++) { for (j = 0; j < nr; j++) {
if (buf[j] == bytenr) if (buf[j] == bytenr)
break; break;
} }
if (j == nr) if (j == nr) {
WARN_ON(nr >= map->num_stripes);
buf[nr++] = bytenr; buf[nr++] = bytenr;
}
} }
for (i = 0; i > nr; i++) { for (i = 0; i > nr; i++) {
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册