summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChris Mason <chris.mason@oracle.com>2008-07-22 11:18:09 -0400
committerChris Mason <chris.mason@oracle.com>2008-09-25 11:04:05 -0400
commit6dddcbeb28b34620ad033f1e8d9f6960bafdd7d2 (patch)
treef13d7162e219b4028e941cac904999f729e197b2
parentf421950f86bf96a11fef932e167ab2e70d4c43a0 (diff)
downloadop-kernel-dev-6dddcbeb28b34620ad033f1e8d9f6960bafdd7d2.zip
op-kernel-dev-6dddcbeb28b34620ad033f1e8d9f6960bafdd7d2.tar.gz
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>
-rw-r--r--fs/btrfs/ctree.h6
-rw-r--r--fs/btrfs/locking.c2
2 files changed, 6 insertions, 2 deletions
diff --git a/fs/btrfs/ctree.h b/fs/btrfs/ctree.h
index f8fccda..eeb5afa 100644
--- a/fs/btrfs/ctree.h
+++ b/fs/btrfs/ctree.h
@@ -42,7 +42,11 @@ struct btrfs_ordered_sum;
#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 */
#define BTRFS_ROOT_TREE_OBJECTID 1ULL
diff --git a/fs/btrfs/locking.c b/fs/btrfs/locking.c
index 01a9ac2..27a0237 100644
--- a/fs/btrfs/locking.c
+++ b/fs/btrfs/locking.c
@@ -37,7 +37,7 @@ int btrfs_tree_lock(struct extent_buffer *eb)
return 0;
}
cpu_relax();
- mutex_lock(&eb->mutex);
+ mutex_lock_nested(&eb->mutex, BTRFS_MAX_LEVEL - btrfs_header_level(eb));
return 0;
}
OpenPOWER on IntegriCloud