|
@@ -241,6 +241,7 @@ handle_t *ext4_journal_start_sb(struct super_block *sb, int nblocks)
|
|
|
if (sb->s_flags & MS_RDONLY)
|
|
|
return ERR_PTR(-EROFS);
|
|
|
|
|
|
+ vfs_check_frozen(sb, SB_FREEZE_WRITE);
|
|
|
/* Special case here: if the journal has aborted behind our
|
|
|
* backs (eg. EIO in the commit thread), then we still need to
|
|
|
* take the FS itself readonly cleanly. */
|
|
@@ -3485,8 +3486,10 @@ int ext4_force_commit(struct super_block *sb)
|
|
|
return 0;
|
|
|
|
|
|
journal = EXT4_SB(sb)->s_journal;
|
|
|
- if (journal)
|
|
|
+ if (journal) {
|
|
|
+ vfs_check_frozen(sb, SB_FREEZE_WRITE);
|
|
|
ret = ext4_journal_force_commit(journal);
|
|
|
+ }
|
|
|
|
|
|
return ret;
|
|
|
}
|
|
@@ -3535,18 +3538,16 @@ static int ext4_freeze(struct super_block *sb)
|
|
|
* the journal.
|
|
|
*/
|
|
|
error = jbd2_journal_flush(journal);
|
|
|
- if (error < 0) {
|
|
|
- out:
|
|
|
- jbd2_journal_unlock_updates(journal);
|
|
|
- return error;
|
|
|
- }
|
|
|
+ if (error < 0)
|
|
|
+ goto out;
|
|
|
|
|
|
/* Journal blocked and flushed, clear needs_recovery flag. */
|
|
|
EXT4_CLEAR_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
|
|
|
error = ext4_commit_super(sb, 1);
|
|
|
- if (error)
|
|
|
- goto out;
|
|
|
- return 0;
|
|
|
+out:
|
|
|
+ /* we rely on s_frozen to stop further updates */
|
|
|
+ jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
|
|
+ return error;
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -3563,7 +3564,6 @@ static int ext4_unfreeze(struct super_block *sb)
|
|
|
EXT4_SET_INCOMPAT_FEATURE(sb, EXT4_FEATURE_INCOMPAT_RECOVER);
|
|
|
ext4_commit_super(sb, 1);
|
|
|
unlock_super(sb);
|
|
|
- jbd2_journal_unlock_updates(EXT4_SB(sb)->s_journal);
|
|
|
return 0;
|
|
|
}
|
|
|
|