diff options
Diffstat (limited to 'fs/ext4/super.c')
-rw-r--r-- | fs/ext4/super.c | 23 |
1 files changed, 19 insertions, 4 deletions
diff --git a/fs/ext4/super.c b/fs/ext4/super.c index 0e661c569660..79bd3989e84f 100644 --- a/fs/ext4/super.c +++ b/fs/ext4/super.c | |||
@@ -507,7 +507,8 @@ static void ext4_put_super(struct super_block *sb) | |||
507 | ext4_mb_release(sb); | 507 | ext4_mb_release(sb); |
508 | ext4_ext_release(sb); | 508 | ext4_ext_release(sb); |
509 | ext4_xattr_put_super(sb); | 509 | ext4_xattr_put_super(sb); |
510 | jbd2_journal_destroy(sbi->s_journal); | 510 | if (jbd2_journal_destroy(sbi->s_journal) < 0) |
511 | ext4_abort(sb, __func__, "Couldn't clean up the journal"); | ||
511 | sbi->s_journal = NULL; | 512 | sbi->s_journal = NULL; |
512 | if (!(sb->s_flags & MS_RDONLY)) { | 513 | if (!(sb->s_flags & MS_RDONLY)) { |
513 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); | 514 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); |
@@ -2853,7 +2854,9 @@ static void ext4_mark_recovery_complete(struct super_block *sb, | |||
2853 | journal_t *journal = EXT4_SB(sb)->s_journal; | 2854 | journal_t *journal = EXT4_SB(sb)->s_journal; |
2854 | 2855 | ||
2855 | jbd2_journal_lock_updates(journal); | 2856 | jbd2_journal_lock_updates(journal); |
2856 | jbd2_journal_flush(journal); | 2857 | if (jbd2_journal_flush(journal) < 0) |
2858 | goto out; | ||
2859 | |||
2857 | lock_super(sb); | 2860 | lock_super(sb); |
2858 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER) && | 2861 | if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER) && |
2859 | sb->s_flags & MS_RDONLY) { | 2862 | sb->s_flags & MS_RDONLY) { |
@@ -2862,6 +2865,8 @@ static void ext4_mark_recovery_complete(struct super_block *sb, | |||
2862 | ext4_commit_super(sb, es, 1); | 2865 | ext4_commit_super(sb, es, 1); |
2863 | } | 2866 | } |
2864 | unlock_super(sb); | 2867 | unlock_super(sb); |
2868 | |||
2869 | out: | ||
2865 | jbd2_journal_unlock_updates(journal); | 2870 | jbd2_journal_unlock_updates(journal); |
2866 | } | 2871 | } |
2867 | 2872 | ||
@@ -2962,7 +2967,13 @@ static void ext4_write_super_lockfs(struct super_block *sb) | |||
2962 | 2967 | ||
2963 | /* Now we set up the journal barrier. */ | 2968 | /* Now we set up the journal barrier. */ |
2964 | jbd2_journal_lock_updates(journal); | 2969 | jbd2_journal_lock_updates(journal); |
2965 | jbd2_journal_flush(journal); | 2970 | |
2971 | /* | ||
2972 | * We don't want to clear needs_recovery flag when we failed | ||
2973 | * to flush the journal. | ||
2974 | */ | ||
2975 | if (jbd2_journal_flush(journal) < 0) | ||
2976 | return; | ||
2966 | 2977 | ||
2967 | /* Journal blocked and flushed, clear needs_recovery flag. */ | 2978 | /* Journal blocked and flushed, clear needs_recovery flag. */ |
2968 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); | 2979 | EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER); |
@@ -3402,8 +3413,12 @@ static int ext4_quota_on(struct super_block *sb, int type, int format_id, | |||
3402 | * otherwise be livelocked... | 3413 | * otherwise be livelocked... |
3403 | */ | 3414 | */ |
3404 | jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal); | 3415 | jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal); |
3405 | jbd2_journal_flush(EXT4_SB(sb)->s_journal); | 3416 | err = jbd2_journal_flush(EXT4_SB(sb)->s_journal); |
3406 | jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); | 3417 | jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal); |
3418 | if (err) { | ||
3419 | path_put(&nd.path); | ||
3420 | return err; | ||
3421 | } | ||
3407 | } | 3422 | } |
3408 | 3423 | ||
3409 | err = vfs_quota_on_path(sb, type, format_id, &nd.path); | 3424 | err = vfs_quota_on_path(sb, type, format_id, &nd.path); |