From 078c23cd1d954b11777985e88a215facf973e35b Mon Sep 17 00:00:00 2001 From: Chris Mason Date: Sun, 6 Nov 2011 03:26:19 -0500 Subject: [PATCH] --- yaml --- r: 274718 b: refs/heads/master c: d43317dcd074818d4bd12ddd4184a29aff98907b h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/btrfs/transaction.c | 13 ++++++++----- 2 files changed, 9 insertions(+), 6 deletions(-) diff --git a/[refs] b/[refs] index 8dfc2570d8e2..46f8067b61c7 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 56d2a48f81a1bde827c625b90221fade72fe9c61 +refs/heads/master: d43317dcd074818d4bd12ddd4184a29aff98907b diff --git a/trunk/fs/btrfs/transaction.c b/trunk/fs/btrfs/transaction.c index 29f782cc2cc9..960835eaf4da 100644 --- a/trunk/fs/btrfs/transaction.c +++ b/trunk/fs/btrfs/transaction.c @@ -55,6 +55,7 @@ static noinline int join_transaction(struct btrfs_root *root, int nofail) struct btrfs_transaction *cur_trans; spin_lock(&root->fs_info->trans_lock); +loop: if (root->fs_info->trans_no_join) { if (!nofail) { spin_unlock(&root->fs_info->trans_lock); @@ -75,16 +76,18 @@ static noinline int join_transaction(struct btrfs_root *root, int nofail) cur_trans = kmem_cache_alloc(btrfs_transaction_cachep, GFP_NOFS); if (!cur_trans) return -ENOMEM; + spin_lock(&root->fs_info->trans_lock); if (root->fs_info->running_transaction) { + /* + * someone started a transaction after we unlocked. Make sure + * to redo the trans_no_join checks above + */ kmem_cache_free(btrfs_transaction_cachep, cur_trans); cur_trans = root->fs_info->running_transaction; - atomic_inc(&cur_trans->use_count); - atomic_inc(&cur_trans->num_writers); - cur_trans->num_joined++; - spin_unlock(&root->fs_info->trans_lock); - return 0; + goto loop; } + atomic_set(&cur_trans->num_writers, 1); cur_trans->num_joined = 0; init_waitqueue_head(&cur_trans->writer_wait);