linux/fs/ext4
Daeho Jeong abf7bef5d7 ext4, jbd2: ensure entering into panic after recording an error in superblock
commit 4327ba52af upstream.

If a EXT4 filesystem utilizes JBD2 journaling and an error occurs, the
journaling will be aborted first and the error number will be recorded
into JBD2 superblock and, finally, the system will enter into the
panic state in "errors=panic" option.  But, in the rare case, this
sequence is little twisted like the below figure and it will happen
that the system enters into panic state, which means the system reset
in mobile environment, before completion of recording an error in the
journal superblock. In this case, e2fsck cannot recognize that the
filesystem failure occurred in the previous run and the corruption
wouldn't be fixed.

Task A                        Task B
ext4_handle_error()
-> jbd2_journal_abort()
  -> __journal_abort_soft()
    -> __jbd2_journal_abort_hard()
    | -> journal->j_flags |= JBD2_ABORT;
    |
    |                         __ext4_abort()
    |                         -> jbd2_journal_abort()
    |                         | -> __journal_abort_soft()
    |                         |   -> if (journal->j_flags & JBD2_ABORT)
    |                         |           return;
    |                         -> panic()
    |
    -> jbd2_journal_update_sb_errno()

Tested-by: Hobin Woo <hobin.woo@samsung.com>
Signed-off-by: Daeho Jeong <daeho.jeong@samsung.com>
Signed-off-by: Theodore Ts'o <tytso@mit.edu>
Signed-off-by: Luis Henriques <luis.henriques@canonical.com>
History 2015-12-13 17:48:48 +00:00
..
acl.c ext2/3/4: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00
acl.h ext2/3/4: use generic posix ACL infrastructure 2014-01-25 23:58:19 -05:00
balloc.c ext4: move error report out of atomic context in ext4_init_block_bitmap() 2014-11-05 11:43:06 +00:00
bitmap.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
block_validity.c fs/ext4: use rbtree postorder iteration helper instead of opencoding 2014-01-23 16:37:03 -08:00
dir.c ext4: remove unused local variable "stored" from ext4_readdir(...) 2014-05-27 12:48:55 -04:00
ext4.h ext4: fix accidental flag aliasing in ext4_map_blocks flags 2015-05-06 23:58:31 +01:00
ext4_extents.h ext4: rename uninitialized extents to unwritten 2014-04-20 23:45:47 -04:00
ext4_jbd2.c ext4: fix potential use after free in __ext4_journal_stop 2015-12-13 17:48:47 +00:00
ext4_jbd2.h ext4: make local functions static 2014-05-12 10:50:23 -04:00
extents.c ext4: fix loss of delalloc extent info in ext4_zero_range() 2015-09-30 13:20:54 +01:00
extents_status.c ext4: fix data corruption caused by unwritten and delayed extents 2015-05-12 09:36:39 +01:00
extents_status.h ext4: add ext4_es_store_pblock_status() 2014-02-19 20:15:15 -05:00
file.c ext4: prevent bugon on race between write/fcntl 2014-11-13 11:48:59 +00:00
fsync.c ext4: Fix fsync error handling after filesystem abort 2013-06-12 22:38:04 -04:00
hash.c ext4: reduce one "if" comparison in ext4_dirhash() 2013-02-01 22:33:21 -05:00
ialloc.c ext4: fix oops when loading block bitmap failed 2014-11-13 11:48:58 +00:00
indirect.c ext4: don't retry file block mapping on bigalloc fs with non-extent file 2015-07-15 10:00:48 +01:00
inline.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
inode.c ext4: fix reservation release on invalidatepage for delalloc fs 2015-07-20 14:38:52 +01:00
ioctl.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
Kconfig ext4: fix Kconfig documentation for CONFIG_EXT4_DEBUG 2013-04-21 20:32:03 -04:00
Makefile ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
mballoc.c ext4: replace open coded nofail allocation in ext4_free_blocks() 2015-07-20 14:38:53 +01:00
mballoc.h ext4: remove unused ac_ex_scanned 2014-02-20 13:32:10 -05:00
migrate.c ext4: correctly migrate a file with a hole at the beginning 2015-07-20 14:38:52 +01:00
mmp.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
move_extent.c ext4: add missing BUFFER_TRACE before ext4_journal_get_write_access 2014-05-12 22:06:43 -04:00
namei.c ext4: make fsync to sync parent dir in no-journal for real this time 2015-05-05 11:09:43 +01:00
page-io.c Clean ups and miscellaneous bug fixes, in particular for the new 2014-06-08 13:03:35 -07:00
resize.c [PATCH] fix calculation of meta_bg descriptor backups 2015-12-13 17:48:47 +00:00
super.c ext4, jbd2: ensure entering into panic after recording an error in superblock 2015-12-13 17:48:48 +00:00
symlink.c ext4: Remove CONFIG_EXT4_FS_XATTR 2012-12-10 16:30:43 -05:00
truncate.h ext4: move common truncate functions to header file 2011-06-27 19:16:04 -04:00
xattr.c ext4: Replace open coded mdata csum feature to helper function 2014-11-05 11:43:06 +00:00
xattr.h ext4: each filesystem creates and uses its own mb_cache 2014-03-18 19:24:49 -04:00
xattr_security.c Merge branch 'for_linus' into for_linus_merged 2012-01-10 11:54:07 -05:00
xattr_trusted.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00
xattr_user.c ext2/3/4: delete unneeded includes of module.h 2012-01-09 13:52:10 +01:00