Btrfs: only unlock and relock if we have to
authorJosef Bacik <jbacik@fusionio.com>
Wed, 7 Nov 2012 18:44:13 +0000 (13:44 -0500)
committerChris Mason <chris.mason@fusionio.com>
Mon, 17 Dec 2012 01:46:27 +0000 (20:46 -0500)
I noticed while doing fsync tests that we were always dropping the path and
re-searching when we first cow the log root even though we've already gotten
the write lock on the root.  That's because we don't take into account that
there might not be a parent node, so fix the check to make sure there is
actually a parent node before we undo all of this work for nothing.  Thanks,

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

index e7bea1d5f75fd7aab850b789ab0052717185e82a..c7b67cf24bba54f85a6eb488ea899190961bac09 100644 (file)
@@ -2564,7 +2564,10 @@ again:
                         * must have write locks on this node and the
                         * parent
                         */
-                       if (level + 1 > write_lock_level) {
+                       if (level > write_lock_level ||
+                           (level + 1 > write_lock_level &&
+                           level + 1 < BTRFS_MAX_LEVEL &&
+                           p->nodes[level + 1])) {
                                write_lock_level = level + 1;
                                btrfs_release_path(p);
                                goto again;