Btrfs: fix deadlock caused by the race between relocation
authorMiao Xie <miaox@cn.fujitsu.com>
Fri, 11 Nov 2011 01:45:05 +0000 (20:45 -0500)
committerChris Mason <chris.mason@oracle.com>
Fri, 11 Nov 2011 01:45:05 +0000 (20:45 -0500)
We can not do flushable reservation for the relocation when we create snapshot,
because it may make the transaction commit task and the flush task wait for
each other and the deadlock happens.

Signed-off-by: Miao Xie <miaox@cn.fujitsu.com>
Signed-off-by: Chris Mason <chris.mason@oracle.com>
fs/btrfs/transaction.c

index 960835eaf4da7acfd4b9f3f11dd0fb16f811b007..6a0574e923bc6a33b4965976328222dcf0a61cb0 100644 (file)
@@ -882,8 +882,8 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans,
        btrfs_reloc_pre_snapshot(trans, pending, &to_reserve);
 
        if (to_reserve > 0) {
-               ret = btrfs_block_rsv_add(root, &pending->block_rsv,
-                                         to_reserve);
+               ret = btrfs_block_rsv_add_noflush(root, &pending->block_rsv,
+                                                 to_reserve);
                if (ret) {
                        pending->error = ret;
                        goto fail;