]> Pileus Git - ~andy/linux/blobdiff - fs/btrfs/locking.c
Btrfs: selinux support
[~andy/linux] / fs / btrfs / locking.c
index d617c29787fac22cf5d79dcf7f1aa4eed19085b4..39bae7761db6c20ae87686a70d383a12c6285ee6 100644 (file)
 #include "extent_io.h"
 #include "locking.h"
 
+/*
+ * locks the per buffer mutex in an extent buffer.  This uses adaptive locks
+ * and the spin is not tuned very extensively.  The spinning does make a big
+ * difference in almost every workload, but spinning for the right amount of
+ * time needs some help.
+ *
+ * In general, we want to spin as long as the lock holder is doing btree
+ * searches, and we should give up if they are in more expensive code.
+ */
+
 int btrfs_tree_lock(struct extent_buffer *eb)
 {
        int i;
@@ -57,3 +67,22 @@ int btrfs_tree_locked(struct extent_buffer *eb)
        return mutex_is_locked(&eb->mutex);
 }
 
+/*
+ * btrfs_search_slot uses this to decide if it should drop its locks
+ * before doing something expensive like allocating free blocks for cow.
+ */
+int btrfs_path_lock_waiting(struct btrfs_path *path, int level)
+{
+       int i;
+       struct extent_buffer *eb;
+       for (i = level; i <= level + 1 && i < BTRFS_MAX_LEVEL; i++) {
+               eb = path->nodes[i];
+               if (!eb)
+                       break;
+               smp_mb();
+               if (!list_empty(&eb->mutex.wait_list))
+                       return 1;
+       }
+       return 0;
+}
+