Fix recursive KM_USER1 usage in btrfs_realloc_node
authorChris Mason <chris.mason@oracle.com>
Tue, 6 Nov 2007 20:09:29 +0000 (15:09 -0500)
committerChris Mason <chris.mason@oracle.com>
Thu, 25 Sep 2008 15:03:57 +0000 (11:03 -0400)
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/ctree.h
fs/btrfs/struct-funcs.c

index f7907b0..030d21d 100644 (file)
@@ -557,14 +557,9 @@ static inline unsigned long btrfs_node_key_ptr_offset(int nr)
                sizeof(struct btrfs_key_ptr) * nr;
 }
 
-static inline void btrfs_node_key(struct extent_buffer *eb,
-                          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);
-}
+void btrfs_node_key(struct extent_buffer *eb,
+                   struct btrfs_disk_key *disk_key, int nr);
+
 static inline void btrfs_set_node_key(struct extent_buffer *eb,
                                      struct btrfs_disk_key *disk_key, int nr)
 {
index cf68fcf..c5715a6 100644 (file)
@@ -95,3 +95,19 @@ void btrfs_set_##name(struct extent_buffer *eb,                              \
 
 #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);
+}