Commit e644d021 authored by Chris Mason's avatar Chris Mason

Fix recursive KM_USER1 usage in btrfs_realloc_node

Signed-off-by: default avatarChris Mason <chris.mason@oracle.com>
parent f84a8b36
...@@ -557,14 +557,9 @@ static inline unsigned long btrfs_node_key_ptr_offset(int nr) ...@@ -557,14 +557,9 @@ static inline unsigned long btrfs_node_key_ptr_offset(int nr)
sizeof(struct btrfs_key_ptr) * nr; sizeof(struct btrfs_key_ptr) * nr;
} }
static inline void btrfs_node_key(struct extent_buffer *eb, void btrfs_node_key(struct extent_buffer *eb,
struct btrfs_disk_key *disk_key, int nr) struct btrfs_disk_key *disk_key, int nr);
{
unsigned long ptr;
ptr = btrfs_node_key_ptr_offset(nr);
read_eb_member(eb, (struct btrfs_key_ptr *)ptr,
struct btrfs_key_ptr, key, disk_key);
}
static inline void btrfs_set_node_key(struct extent_buffer *eb, static inline void btrfs_set_node_key(struct extent_buffer *eb,
struct btrfs_disk_key *disk_key, int nr) struct btrfs_disk_key *disk_key, int nr)
{ {
......
...@@ -95,3 +95,19 @@ void btrfs_set_##name(struct extent_buffer *eb, \ ...@@ -95,3 +95,19 @@ void btrfs_set_##name(struct extent_buffer *eb, \
#include "ctree.h" #include "ctree.h"
void btrfs_node_key(struct extent_buffer *eb,
struct btrfs_disk_key *disk_key, int nr)
{
unsigned long ptr = btrfs_node_key_ptr_offset(nr);
if (eb->map_token && ptr >= eb->map_start &&
ptr + sizeof(*disk_key) <= eb->map_start + eb->map_len) {
memcpy(disk_key, eb->kaddr + ptr - eb->map_start,
sizeof(*disk_key));
return;
} else if (eb->map_token) {
unmap_extent_buffer(eb, eb->map_token, KM_USER1);
eb->map_token = NULL;
}
read_eb_member(eb, (struct btrfs_key_ptr *)ptr,
struct btrfs_key_ptr, key, disk_key);
}
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment