소스 검색

Btrfs: Use mutex_lock_nested for tree locking

Lockdep has the notion of locking subclasses so that you can identify
locks you expect to be taken after other locks of the same class.  This
changes the per-extent buffer btree locking routines to use a subclass based
on the level in the tree.

Unfortunately, lockdep can only handle 8 total subclasses, and the btrfs
max level is also 8.  So when lockdep is on, use a lower max level.

Signed-off-by: Chris Mason <chris.mason@oracle.com>
Chris Mason 17 년 전
부모
커밋
6dddcbeb28
2개의 변경된 파일6개의 추가작업 그리고 2개의 파일을 삭제
  1. 5 1
      fs/btrfs/ctree.h
  2. 1 1
      fs/btrfs/locking.c

+ 5 - 1
fs/btrfs/ctree.h

@@ -42,7 +42,11 @@ struct btrfs_ordered_sum;
 
 
 #define BTRFS_MAGIC "_B5RfS_M"
 #define BTRFS_MAGIC "_B5RfS_M"
 
 
-#define BTRFS_MAX_LEVEL 8
+#ifdef CONFIG_LOCKDEP
+# define BTRFS_MAX_LEVEL 7
+#else
+# define BTRFS_MAX_LEVEL 8
+#endif
 
 
 /* holds pointers to all of the tree roots */
 /* holds pointers to all of the tree roots */
 #define BTRFS_ROOT_TREE_OBJECTID 1ULL
 #define BTRFS_ROOT_TREE_OBJECTID 1ULL

+ 1 - 1
fs/btrfs/locking.c

@@ -37,7 +37,7 @@ int btrfs_tree_lock(struct extent_buffer *eb)
 			return 0;
 			return 0;
 	}
 	}
 	cpu_relax();
 	cpu_relax();
-	mutex_lock(&eb->mutex);
+	mutex_lock_nested(&eb->mutex, BTRFS_MAX_LEVEL - btrfs_header_level(eb));
 	return 0;
 	return 0;
 }
 }