From b02c2e9977e839778d95c90362dee0ef70b1f380 Mon Sep 17 00:00:00 2001 From: Jan Kara Date: Mon, 12 Mar 2012 16:05:50 +0100 Subject: [PATCH] --- yaml --- r: 297888 b: refs/heads/master c: 914b20070b413ca10f832c45a58b2894990f065f h: refs/heads/master v: v3 --- [refs] | 2 +- trunk/fs/btrfs/disk-io.c | 9 +++++++-- 2 files changed, 8 insertions(+), 3 deletions(-) diff --git a/[refs] b/[refs] index b262b35c7059..77117e0fc527 100644 --- a/[refs] +++ b/[refs] @@ -1,2 +1,2 @@ --- -refs/heads/master: 79787eaab46121d4713ed03c8fc63b9ec3eaec76 +refs/heads/master: 914b20070b413ca10f832c45a58b2894990f065f diff --git a/trunk/fs/btrfs/disk-io.c b/trunk/fs/btrfs/disk-io.c index 16a0cada26c2..438993e3d832 100644 --- a/trunk/fs/btrfs/disk-io.c +++ b/trunk/fs/btrfs/disk-io.c @@ -1640,8 +1640,10 @@ static int transaction_kthread(void *arg) u64 transid; unsigned long now; unsigned long delay; + bool cannot_commit; do { + cannot_commit = false; delay = HZ * 30; vfs_check_frozen(root->fs_info->sb, SB_FREEZE_WRITE); mutex_lock(&root->fs_info->transaction_kthread_mutex); @@ -1665,8 +1667,10 @@ static int transaction_kthread(void *arg) /* If the file system is aborted, this will always fail. */ trans = btrfs_join_transaction(root); - if (IS_ERR(trans)) + if (IS_ERR(trans)) { + cannot_commit = true; goto sleep; + } if (transid == trans->transid) { btrfs_commit_transaction(trans, root); } else { @@ -1679,7 +1683,8 @@ static int transaction_kthread(void *arg) if (!try_to_freeze()) { set_current_state(TASK_INTERRUPTIBLE); if (!kthread_should_stop() && - !btrfs_transaction_blocked(root->fs_info)) + (!btrfs_transaction_blocked(root->fs_info) || + cannot_commit)) schedule_timeout(delay); __set_current_state(TASK_RUNNING); }