|
@@ -507,7 +507,8 @@ static void ext4_put_super(struct super_block *sb)
|
|
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);
|
|
- jbd2_journal_destroy(sbi->s_journal);
|
|
|
|
|
|
+ if (jbd2_journal_destroy(sbi->s_journal) < 0)
|
|
|
|
+ ext4_abort(sb, __func__, "Couldn't clean up the journal");
|
|
sbi->s_journal = NULL;
|
|
sbi->s_journal = NULL;
|
|
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);
|
|
@@ -2853,7 +2854,9 @@ static void ext4_mark_recovery_complete(struct super_block *sb,
|
|
journal_t *journal = EXT4_SB(sb)->s_journal;
|
|
journal_t *journal = EXT4_SB(sb)->s_journal;
|
|
|
|
|
|
jbd2_journal_lock_updates(journal);
|
|
jbd2_journal_lock_updates(journal);
|
|
- jbd2_journal_flush(journal);
|
|
|
|
|
|
+ if (jbd2_journal_flush(journal) < 0)
|
|
|
|
+ goto out;
|
|
|
|
+
|
|
lock_super(sb);
|
|
lock_super(sb);
|
|
if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER) &&
|
|
if (EXT4_HAS_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER) &&
|
|
sb->s_flags & MS_RDONLY) {
|
|
sb->s_flags & MS_RDONLY) {
|
|
@@ -2862,6 +2865,8 @@ static void ext4_mark_recovery_complete(struct super_block *sb,
|
|
ext4_commit_super(sb, es, 1);
|
|
ext4_commit_super(sb, es, 1);
|
|
}
|
|
}
|
|
unlock_super(sb);
|
|
unlock_super(sb);
|
|
|
|
+
|
|
|
|
+out:
|
|
jbd2_journal_unlock_updates(journal);
|
|
jbd2_journal_unlock_updates(journal);
|
|
}
|
|
}
|
|
|
|
|
|
@@ -2962,7 +2967,13 @@ static void ext4_write_super_lockfs(struct super_block *sb)
|
|
|
|
|
|
/* Now we set up the journal barrier. */
|
|
/* Now we set up the journal barrier. */
|
|
jbd2_journal_lock_updates(journal);
|
|
jbd2_journal_lock_updates(journal);
|
|
- jbd2_journal_flush(journal);
|
|
|
|
|
|
+
|
|
|
|
+ /*
|
|
|
|
+ * We don't want to clear needs_recovery flag when we failed
|
|
|
|
+ * to flush the journal.
|
|
|
|
+ */
|
|
|
|
+ if (jbd2_journal_flush(journal) < 0)
|
|
|
|
+ return;
|
|
|
|
|
|
/* Journal blocked and flushed, clear needs_recovery flag. */
|
|
/* Journal blocked and flushed, clear needs_recovery flag. */
|
|
EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
|
|
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,
|
|
* otherwise be livelocked...
|
|
* otherwise be livelocked...
|
|
*/
|
|
*/
|
|
jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
|
|
jbd2_journal_lock_updates(EXT4_SB(sb)->s_journal);
|
|
- jbd2_journal_flush(EXT4_SB(sb)->s_journal);
|
|
|
|
|
|
+ err = jbd2_journal_flush(EXT4_SB(sb)->s_journal);
|
|
jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
|
jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
|
|
|
+ if (err) {
|
|
|
|
+ path_put(&nd.path);
|
|
|
|
+ return err;
|
|
|
|
+ }
|
|
}
|
|
}
|
|
|
|
|
|
err = vfs_quota_on_path(sb, type, format_id, &nd.path);
|
|
err = vfs_quota_on_path(sb, type, format_id, &nd.path);
|