Btrfs: add path->really_keep_locks
authorJosef Bacik <jbacik@fusionio.com>
Wed, 12 Dec 2012 22:00:01 +0000 (17:00 -0500)
committerChris Mason <chris.mason@fusionio.com>
Mon, 17 Dec 2012 01:46:24 +0000 (20:46 -0500)
You'd think path->keep_locks would keep all the locks wouldn't you?  You'd
be wrong.  It only keeps them if the slot is pointing to the last item in
the node.  This is for use with btrfs_next_leaf, which needs this sort of
thing.  But the horrible horrible things I'm going to do to the tree log
means I really need everything held from root to leaf so I can add and
delete items in the same search.  Thanks,

Signed-off-by: Josef Bacik <jbacik@fusionio.com>
Signed-off-by: Chris Mason <chris.mason@fusionio.com>
fs/btrfs/ctree.c
fs/btrfs/ctree.h

index 01efcbc80dfbb48b5a967c966b50ba89fad46440..0c5c28ff794ffc8cf4c3a2a5a19eae1ff42c0bb2 100644 (file)
@@ -2212,6 +2212,9 @@ static noinline void unlock_up(struct btrfs_path *path, int level,
        int no_skips = 0;
        struct extent_buffer *t;
 
+       if (path->really_keep_locks)
+               return;
+
        for (i = level; i < BTRFS_MAX_LEVEL; i++) {
                if (!path->nodes[i])
                        break;
@@ -2259,7 +2262,7 @@ noinline void btrfs_unlock_up_safe(struct btrfs_path *path, int level)
 {
        int i;
 
-       if (path->keep_locks)
+       if (path->keep_locks || path->really_keep_locks)
                return;
 
        for (i = level; i < BTRFS_MAX_LEVEL; i++) {
@@ -2492,7 +2495,7 @@ int btrfs_search_slot(struct btrfs_trans_handle *trans, struct btrfs_root
        if (!cow)
                write_lock_level = -1;
 
-       if (cow && (p->keep_locks || p->lowest_level))
+       if (cow && (p->really_keep_locks || p->keep_locks || p->lowest_level))
                write_lock_level = BTRFS_MAX_LEVEL;
 
        min_write_lock_level = write_lock_level;
index 313a6adfde551052fc4536ee036a76017a52a331..9ed452f5d06269e6217be831398728ce5f1affee 100644 (file)
@@ -576,6 +576,7 @@ struct btrfs_path {
        unsigned int skip_locking:1;
        unsigned int leave_spinning:1;
        unsigned int search_commit_root:1;
+       unsigned int really_keep_locks:1;
 };
 
 /*