Login | Register For Free | Help
Search for: (Advanced)

Mailing List Archive: Linux: Kernel

[ 22/46] ext4: make sure the journal sb is written in ext4_clear_journal_err()

 

 

Linux kernel RSS feed   Index | Next | Previous | View Threaded


gregkh at linuxfoundation

Aug 19, 2012, 8:58 PM

Post #1 of 1 (29 views)
Permalink
[ 22/46] ext4: make sure the journal sb is written in ext4_clear_journal_err()

From: Greg KH <gregkh [at] linuxfoundation>

3.5-stable review patch. If anyone has any objections, please let me know.

------------------

From: Theodore Ts'o <tytso [at] mit>

commit d796c52ef0b71a988364f6109aeb63d79c5b116b upstream.

After we transfer set the EXT4_ERROR_FS bit in the file system
superblock, it's not enough to call jbd2_journal_clear_err() to clear
the error indication from journal superblock --- we need to call
jbd2_journal_update_sb_errno() as well. Otherwise, when the root file
system is mounted read-only, the journal is replayed, and the error
indicator is transferred to the superblock --- but the s_errno field
in the jbd2 superblock is left set (since although we cleared it in
memory, we never flushed it out to disk).

This can end up confusing e2fsck. We should make e2fsck more robust
in this case, but the kernel shouldn't be leaving things in this
confused state, either.

Signed-off-by: "Theodore Ts'o" <tytso [at] mit>
Signed-off-by: Greg Kroah-Hartman <gregkh [at] linuxfoundation>

---
fs/ext4/super.c | 1 +
fs/jbd2/journal.c | 3 ++-
include/linux/jbd2.h | 1 +
3 files changed, 4 insertions(+), 1 deletion(-)

--- a/fs/ext4/super.c
+++ b/fs/ext4/super.c
@@ -4406,6 +4406,7 @@ static void ext4_clear_journal_err(struc
ext4_commit_super(sb, 1);

jbd2_journal_clear_err(journal);
+ jbd2_journal_update_sb_errno(journal);
}
}

--- a/fs/jbd2/journal.c
+++ b/fs/jbd2/journal.c
@@ -1377,7 +1377,7 @@ static void jbd2_mark_journal_empty(jour
* Update a journal's errno. Write updated superblock to disk waiting for IO
* to complete.
*/
-static void jbd2_journal_update_sb_errno(journal_t *journal)
+void jbd2_journal_update_sb_errno(journal_t *journal)
{
journal_superblock_t *sb = journal->j_superblock;

@@ -1390,6 +1390,7 @@ static void jbd2_journal_update_sb_errno

jbd2_write_superblock(journal, WRITE_SYNC);
}
+EXPORT_SYMBOL(jbd2_journal_update_sb_errno);

/*
* Read the superblock for a given journal, performing initial
--- a/include/linux/jbd2.h
+++ b/include/linux/jbd2.h
@@ -1125,6 +1125,7 @@ extern int jbd2_journal_destroy (j
extern int jbd2_journal_recover (journal_t *journal);
extern int jbd2_journal_wipe (journal_t *, int);
extern int jbd2_journal_skip_recovery (journal_t *);
+extern void jbd2_journal_update_sb_errno(journal_t *);
extern void jbd2_journal_update_sb_log_tail (journal_t *, tid_t,
unsigned long, int);
extern void __jbd2_journal_abort_hard (journal_t *);


--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo [at] vger
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/

Linux kernel RSS feed   Index | Next | Previous | View Threaded
 
 


Interested in having your list archived? Contact Gossamer Threads
 
  Web Applications & Managed Hosting Powered by Gossamer Threads Inc.