Parcourir la source

Fix recursive KM_USER1 usage in btrfs_realloc_node

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Chris Mason il y a 17 ans
Parent
commit
e644d021e3
2 fichiers modifiés avec 19 ajouts et 8 suppressions
  1. 3 8
      fs/btrfs/ctree.h
  2. 16 0
      fs/btrfs/struct-funcs.c

+ 3 - 8
fs/btrfs/ctree.h

@@ -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)
 {

+ 16 - 0
fs/btrfs/struct-funcs.c

@@ -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);
+}