linux-ext4.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
* [PATCH 1/2] ext4: call ext4_error_inode() if jbd2_journal_dirty_metadata() fails
@ 2013-12-02 14:45 Theodore Ts'o
  2013-12-02 14:45 ` [PATCH 2/2] jbd2: return ENOSPC in journal_dirty_metadata if a handle runs out of space Theodore Ts'o
  2013-12-02 15:30 ` [PATCH 1/2] ext4: call ext4_error_inode() if jbd2_journal_dirty_metadata() fails Jan Kara
  0 siblings, 2 replies; 5+ messages in thread
From: Theodore Ts'o @ 2013-12-02 14:45 UTC (permalink / raw)
  To: Ext4 Developers List; +Cc: Theodore Ts'o, stable

While it's true that errors can only happen if there is a bug in
jbd2_journal_dirty_metadata(), if a bug does happen, we need to halt
the kernel or remount the file system read-only in order to avoid
further data loss.  The ext4_journal_abort_handle() function doesn't
do any of this, and while it's likely that this call (since it doesn't
adjust refcounts) will likely result in the file system eventually
deadlocking since the current transaction will never be able to close,
it's much cleaner to call let ext4's error handling system deal with
this situation.

There's a separate bug here which is that if certain jbd2 errors
errors occur and file system is mounted errors=continue, the file
system will probably eventually end grind to a halt as described
above.  But things have been this way in a long time, and usually when
we have these sorts of errors it's pretty much a disaster --- and
that's why the jbd2 layer aggressively retries memory allocations,
which is the most likely cause of these jbd2 errors.

Signed-off-by: "Theodore Ts'o" <tytso@mit.edu>
Cc: stable@vger.kernel.org
---
 fs/ext4/ext4_jbd2.c | 9 +++++++++
 1 file changed, 9 insertions(+)

diff --git a/fs/ext4/ext4_jbd2.c b/fs/ext4/ext4_jbd2.c
index 17ac112..3fe29de 100644
--- a/fs/ext4/ext4_jbd2.c
+++ b/fs/ext4/ext4_jbd2.c
@@ -259,6 +259,15 @@ int __ext4_handle_dirty_metadata(const char *where, unsigned int line,
 		if (WARN_ON_ONCE(err)) {
 			ext4_journal_abort_handle(where, line, __func__, bh,
 						  handle, err);
+			ext4_error_inode(inode, where, line,
+					 bh->b_blocknr,
+					 "journal_dirty_metadata failed: "
+					 "handle type %u started at line %u, "
+					 "credits %u/%u, errcode %d",
+					 handle->h_type,
+					 handle->h_line_no,
+					 handle->h_requested_credits,
+					 handle->h_buffer_credits, err);
 		}
 	} else {
 		if (inode)
-- 
1.8.5.rc3.362.gdf10213

^ permalink raw reply related	[flat|nested] 5+ messages in thread

end of thread, other threads:[~2013-12-03  7:34 UTC | newest]

Thread overview: 5+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2013-12-02 14:45 [PATCH 1/2] ext4: call ext4_error_inode() if jbd2_journal_dirty_metadata() fails Theodore Ts'o
2013-12-02 14:45 ` [PATCH 2/2] jbd2: return ENOSPC in journal_dirty_metadata if a handle runs out of space Theodore Ts'o
2013-12-02 15:35   ` Jan Kara
2013-12-03  7:34   ` Joel Becker
2013-12-02 15:30 ` [PATCH 1/2] ext4: call ext4_error_inode() if jbd2_journal_dirty_metadata() fails Jan Kara

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).