Btrfs: skip locking if searching the commit root in csum lookup
authorJosef Bacik <josef@redhat.com>
Sun, 11 Sep 2011 14:52:24 +0000 (10:52 -0400)
committerChris Mason <chris.mason@oracle.com>
Sun, 11 Sep 2011 14:52:24 +0000 (10:52 -0400)
It's not enough to just search the commit root, since we could be cow'ing the
very block we need to search through, which would mean that its locked and we'll
still deadlock.  So use path->skip_locking as well.  Thanks,

Signed-off-by: Josef Bacik <josef@redhat.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/file-item.c

index b910694f61ed25bbf0f309ff673381afcf0994d8..a1cb7821becda9229d1e68712cd7a93a1e8d6fcc 100644 (file)
@@ -183,8 +183,10 @@ static int __btrfs_lookup_bio_sums(struct btrfs_root *root,
         * read from the commit root and sidestep a nasty deadlock
         * between reading the free space cache and updating the csum tree.
         */
-       if (btrfs_is_free_space_inode(root, inode))
+       if (btrfs_is_free_space_inode(root, inode)) {
                path->search_commit_root = 1;
+               path->skip_locking = 1;
+       }
 
        disk_bytenr = (u64)bio->bi_sector << 9;
        if (dio)