|
@@ -333,7 +333,8 @@ void ext4_abort(struct super_block *sb, const char *function,
|
|
EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
|
|
EXT4_SB(sb)->s_mount_state |= EXT4_ERROR_FS;
|
|
sb->s_flags |= MS_RDONLY;
|
|
sb->s_flags |= MS_RDONLY;
|
|
EXT4_SB(sb)->s_mount_opt |= EXT4_MOUNT_ABORT;
|
|
EXT4_SB(sb)->s_mount_opt |= EXT4_MOUNT_ABORT;
|
|
- jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);
|
|
|
|
|
|
+ if (EXT4_SB(sb)->s_journal)
|
|
|
|
+ jbd2_journal_abort(EXT4_SB(sb)->s_journal, -EIO);
|
|
}
|
|
}
|
|
|
|
|
|
void ext4_warning(struct super_block *sb, const char *function,
|
|
void ext4_warning(struct super_block *sb, const char *function,
|
|
@@ -442,14 +443,16 @@ static void ext4_put_super(struct super_block *sb)
|
|
{
|
|
{
|
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
struct ext4_sb_info *sbi = EXT4_SB(sb);
|
|
struct ext4_super_block *es = sbi->s_es;
|
|
struct ext4_super_block *es = sbi->s_es;
|
|
- int i;
|
|
|
|
|
|
+ int i, err;
|
|
|
|
|
|
ext4_mb_release(sb);
|
|
ext4_mb_release(sb);
|
|
ext4_ext_release(sb);
|
|
ext4_ext_release(sb);
|
|
ext4_xattr_put_super(sb);
|
|
ext4_xattr_put_super(sb);
|
|
- if (jbd2_journal_destroy(sbi->s_journal) < 0)
|
|
|
|
- ext4_abort(sb, __func__, "Couldn't clean up the journal");
|
|
|
|
|
|
+ err = jbd2_journal_destroy(sbi->s_journal);
|
|
sbi->s_journal = NULL;
|
|
sbi->s_journal = NULL;
|
|
|
|
+ if (err < 0)
|
|
|
|
+ ext4_abort(sb, __func__, "Couldn't clean up the journal");
|
|
|
|
+
|
|
if (!(sb->s_flags & MS_RDONLY)) {
|
|
if (!(sb->s_flags & MS_RDONLY)) {
|
|
EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
|
|
EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
|
|
es->s_state = cpu_to_le16(sbi->s_mount_state);
|
|
es->s_state = cpu_to_le16(sbi->s_mount_state);
|