linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Theodore Ts'o <tytso@mit.edu>
To: stable@kernel.org
Cc: Ext4 Developers List <linux-ext4@vger.kernel.org>,
	Duane Griffin <duaneg@dghda.com>, Sami Liedes <sliedes@cc.hut.fi>,
	Andrew Morton <akpm@linux-foundation.org>,
	"Theodore Ts'o" <tytso@mit.edu>
Subject: [FOR-STABLE 09/20] jbd2: abort instead of waiting for nonexistent transaction
Date: Sun, 16 Nov 2008 11:05:29 -0500	[thread overview]
Message-ID: <1226851540-8032-10-git-send-email-tytso@mit.edu> (raw)
In-Reply-To: <1226851540-8032-9-git-send-email-tytso@mit.edu>

From: Duane Griffin <duaneg@dghda.com>

The __jbd2_log_wait_for_space function sits in a loop checkpointing
transactions until there is sufficient space free in the journal.
However, if there are no transactions to be processed (e.g.  because the
free space calculation is wrong due to a corrupted filesystem) it will
never progress.

Check for space being required when no transactions are outstanding and
abort the journal instead of endlessly looping.

This patch fixes the bug reported by Sami Liedes at:
http://bugzilla.kernel.org/show_bug.cgi?id=10976

Signed-off-by: Duane Griffin <duaneg@dghda.com>
Cc: Sami Liedes <sliedes@cc.hut.fi>
Cc: <linux-ext4@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
(cherry picked from commit 23f8b79eae8a74e42a006ffa7c456e295c7e1c0d)
---
 fs/jbd2/checkpoint.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/fs/jbd2/checkpoint.c b/fs/jbd2/checkpoint.c
index 91389c8..af4651b 100644
--- a/fs/jbd2/checkpoint.c
+++ b/fs/jbd2/checkpoint.c
@@ -126,14 +126,29 @@ void __jbd2_log_wait_for_space(journal_t *journal)
 
 		/*
 		 * Test again, another process may have checkpointed while we
-		 * were waiting for the checkpoint lock
+		 * were waiting for the checkpoint lock. If there are no
+		 * outstanding transactions there is nothing to checkpoint and
+		 * we can't make progress. Abort the journal in this case.
 		 */
 		spin_lock(&journal->j_state_lock);
+		spin_lock(&journal->j_list_lock);
 		nblocks = jbd_space_needed(journal);
 		if (__jbd2_log_space_left(journal) < nblocks) {
+			int chkpt = journal->j_checkpoint_transactions != NULL;
+
+			spin_unlock(&journal->j_list_lock);
 			spin_unlock(&journal->j_state_lock);
-			jbd2_log_do_checkpoint(journal);
+			if (chkpt) {
+				jbd2_log_do_checkpoint(journal);
+			} else {
+				printk(KERN_ERR "%s: no transactions\n",
+				       __func__);
+				jbd2_journal_abort(journal, 0);
+			}
+
 			spin_lock(&journal->j_state_lock);
+		} else {
+			spin_unlock(&journal->j_list_lock);
 		}
 		mutex_unlock(&journal->j_checkpoint_mutex);
 	}
-- 
1.6.0.4.8.g36f27.dirty


  reply	other threads:[~2008-11-16 16:36 UTC|newest]

Thread overview: 41+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-16 16:05 [FOR-STABLE 0/20] Theodore Ts'o
2008-11-16 16:05 ` [FOR-STABLE 01/20] Update flex_bg free blocks and free inodes counters when resizing Theodore Ts'o
2008-11-16 16:05   ` [FOR-STABLE 02/20] ext4: fix #11321: create /proc/ext4/*/stats more carefully Theodore Ts'o
2008-11-16 16:05     ` [FOR-STABLE 03/20] jbd2: fix /proc setup for devices that contain '/' in their names Theodore Ts'o
2008-11-16 16:05       ` [FOR-STABLE 04/20] ext4: add missing unlock in ext4_check_descriptors() on error path Theodore Ts'o
2008-11-16 16:05         ` [FOR-STABLE 05/20] ext4: elevate write count for migrate ioctl Theodore Ts'o
2008-11-16 16:05           ` [FOR-STABLE 06/20] ext4: Renumber EXT4_IOC_MIGRATE Theodore Ts'o
2008-11-16 16:05             ` [FOR-STABLE 07/20] ext4/jbd2: Avoid WARN() messages when failing to write to the superblock Theodore Ts'o
2008-11-16 16:05               ` [FOR-STABLE 08/20] ext4: fix initialization of UNINIT bitmap blocks Theodore Ts'o
2008-11-16 16:05                 ` Theodore Ts'o [this message]
2008-11-16 16:05                   ` [FOR-STABLE 10/20] jbd2: Fix buffer head leak when writing the commit block Theodore Ts'o
2008-11-16 16:05                     ` [FOR-STABLE 11/20] ext4: fix xattr deadlock Theodore Ts'o
2008-11-16 16:05                       ` [FOR-STABLE 12/20] ext4: Free ext4_prealloc_space using kmem_cache_free Theodore Ts'o
2008-11-16 16:05                         ` [FOR-STABLE 13/20] ext4: Do mballoc init before doing filesystem recovery Theodore Ts'o
2008-11-16 16:05                           ` [FOR-STABLE 14/20] ext4: Fix duplicate entries returned from getdents() system call Theodore Ts'o
2008-11-16 16:05                             ` [FOR-STABLE 15/20] jbd2: don't give up looking for space so easily in __jbd2_log_wait_for_space Theodore Ts'o
2008-11-16 16:05                               ` [FOR-STABLE 16/20] ext4: Convert to host order before using the values Theodore Ts'o
2008-11-16 16:05                                 ` [FOR-STABLE 17/20] ext4: wait on all pending commits in ext4_sync_fs() Theodore Ts'o
2008-11-16 16:05                                   ` [FOR-STABLE 18/20] ext4: calculate journal credits correctly Theodore Ts'o
2008-11-16 16:05                                     ` [FOR-STABLE 19/20] ext4: Mark the buffer_heads as dirty and uptodate after prepare_write Theodore Ts'o
2008-11-16 16:05                                       ` [FOR-STABLE 20/20] ext4: add checksum calculation when clearing UNINIT flag in ext4_new_inode Theodore Ts'o
2008-12-03 18:55                                         ` patch ext4-add-checksum-calculation-when-clearing-uninit-flag-in-ext4_new_inode.patch added to 2.6.27-stable tree gregkh
2008-12-03 18:56                                       ` patch ext4-mark-the-buffer_heads-as-dirty-and-uptodate-after-prepare_write.patch " gregkh
2008-12-03 18:55                                     ` patch ext4-calculate-journal-credits-correctly.patch " gregkh
2008-12-03 18:56                                   ` patch ext4-wait-on-all-pending-commits-in-ext4_sync_fs.patch " gregkh
2008-12-03 18:55                                 ` patch ext4-convert-to-host-order-before-using-the-values.patch " gregkh
2008-12-03 18:56                               ` patch jbd2-don-t-give-up-looking-for-space-so-easily-in-__jbd2_log_wait_for_space.patch " gregkh
2008-12-03 18:55                             ` patch ext4-fix-duplicate-entries-returned-from-getdents-system-call.patch " gregkh
2008-12-03 18:55                           ` patch ext4-do-mballoc-init-before-doing-filesystem-recovery.patch " gregkh
2008-12-03 18:55                         ` patch ext4-free-ext4_prealloc_space-using-kmem_cache_free.patch " gregkh
2008-12-03 18:55                       ` patch ext4-fix-xattr-deadlock.patch " gregkh
2008-12-03 18:56                     ` patch jbd2-fix-buffer-head-leak-when-writing-the-commit-block.patch " gregkh
2008-12-03 18:56                   ` patch jbd2-abort-instead-of-waiting-for-nonexistent-transaction.patch " gregkh
2008-12-03 18:55                 ` patch ext4-fix-initialization-of-uninit-bitmap-blocks.patch " gregkh
2008-12-03 18:56               ` patch ext4-jbd2-avoid-warn-messages-when-failing-to-write-to-the-superblock.patch " gregkh
2008-12-03 18:56             ` patch ext4-renumber-ext4_ioc_migrate.patch " gregkh
2008-12-03 18:55           ` patch ext4-elevate-write-count-for-migrate-ioctl.patch " gregkh
2008-12-03 18:55         ` patch ext4-add-missing-unlock-in-ext4_check_descriptors-on-error-path.patch " gregkh
2008-12-03 18:56       ` patch jbd2-fix-proc-setup-for-devices-that-contain-in-their-names.patch " gregkh
2008-12-03 18:55     ` patch ext4-fix-11321-create-proc-ext4-stats-more-carefully.patch " gregkh
2008-12-03 18:56   ` patch ext4-update-flex_bg-free-blocks-and-free-inodes-counters-when-resizing.patch " gregkh

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=1226851540-8032-10-git-send-email-tytso@mit.edu \
    --to=tytso@mit.edu \
    --cc=akpm@linux-foundation.org \
    --cc=duaneg@dghda.com \
    --cc=linux-ext4@vger.kernel.org \
    --cc=sliedes@cc.hut.fi \
    --cc=stable@kernel.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).