mirror of
https://github.com/torvalds/linux.git
synced 2024-11-21 19:41:42 +00:00
ext4: drop EXT4_MF_FS_ABORTED flag
EXT4_MF_FS_ABORTED flag has practically the same intent as EXT4_FLAGS_SHUTDOWN flag. The shutdown flag is checked in many more places than the aborted flag which is mostly the historical artifact where we were relying on SB_RDONLY checks instead of the aborted flag checks. There are only three places - ext4_sync_file(), __ext4_remount(), and mballoc debug code - which check aborted flag and not shutdown flag and this is arguably a bug. Avoid these inconsistencies by removing EXT4_MF_FS_ABORTED flag and using EXT4_FLAGS_SHUTDOWN everywhere. Signed-off-by: Jan Kara <jack@suse.cz> Link: https://lore.kernel.org/r/20230616165109.21695-5-jack@suse.cz Signed-off-by: Theodore Ts'o <tytso@mit.edu>
This commit is contained in:
parent
22b8d707b0
commit
95257987a6
@ -1799,7 +1799,6 @@ static inline int ext4_valid_inum(struct super_block *sb, unsigned long ino)
|
|||||||
*/
|
*/
|
||||||
enum {
|
enum {
|
||||||
EXT4_MF_MNTDIR_SAMPLED,
|
EXT4_MF_MNTDIR_SAMPLED,
|
||||||
EXT4_MF_FS_ABORTED, /* Fatal error detected */
|
|
||||||
EXT4_MF_FC_INELIGIBLE /* Fast commit ineligible */
|
EXT4_MF_FC_INELIGIBLE /* Fast commit ineligible */
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -131,7 +131,6 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
|||||||
int ret = 0, err;
|
int ret = 0, err;
|
||||||
bool needs_barrier = false;
|
bool needs_barrier = false;
|
||||||
struct inode *inode = file->f_mapping->host;
|
struct inode *inode = file->f_mapping->host;
|
||||||
struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
|
|
||||||
|
|
||||||
if (unlikely(ext4_forced_shutdown(inode->i_sb)))
|
if (unlikely(ext4_forced_shutdown(inode->i_sb)))
|
||||||
return -EIO;
|
return -EIO;
|
||||||
@ -141,14 +140,14 @@ int ext4_sync_file(struct file *file, loff_t start, loff_t end, int datasync)
|
|||||||
trace_ext4_sync_file_enter(file, datasync);
|
trace_ext4_sync_file_enter(file, datasync);
|
||||||
|
|
||||||
if (sb_rdonly(inode->i_sb)) {
|
if (sb_rdonly(inode->i_sb)) {
|
||||||
/* Make sure that we read updated s_mount_flags value */
|
/* Make sure that we read updated s_ext4_flags value */
|
||||||
smp_rmb();
|
smp_rmb();
|
||||||
if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))
|
if (ext4_forced_shutdown(inode->i_sb))
|
||||||
ret = -EROFS;
|
ret = -EROFS;
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!sbi->s_journal) {
|
if (!EXT4_SB(inode->i_sb)->s_journal) {
|
||||||
ret = ext4_fsync_nojournal(file, start, end, datasync,
|
ret = ext4_fsync_nojournal(file, start, end, datasync,
|
||||||
&needs_barrier);
|
&needs_barrier);
|
||||||
if (needs_barrier)
|
if (needs_barrier)
|
||||||
|
@ -2213,8 +2213,7 @@ static int mpage_map_and_submit_extent(handle_t *handle,
|
|||||||
if (err < 0) {
|
if (err < 0) {
|
||||||
struct super_block *sb = inode->i_sb;
|
struct super_block *sb = inode->i_sb;
|
||||||
|
|
||||||
if (ext4_forced_shutdown(sb) ||
|
if (ext4_forced_shutdown(sb))
|
||||||
ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
|
|
||||||
goto invalidate_dirty_pages;
|
goto invalidate_dirty_pages;
|
||||||
/*
|
/*
|
||||||
* Let the uper layers retry transient errors.
|
* Let the uper layers retry transient errors.
|
||||||
@ -2534,14 +2533,13 @@ static int ext4_do_writepages(struct mpage_da_data *mpd)
|
|||||||
* If the filesystem has aborted, it is read-only, so return
|
* If the filesystem has aborted, it is read-only, so return
|
||||||
* right away instead of dumping stack traces later on that
|
* right away instead of dumping stack traces later on that
|
||||||
* will obscure the real source of the problem. We test
|
* will obscure the real source of the problem. We test
|
||||||
* EXT4_MF_FS_ABORTED instead of sb->s_flag's SB_RDONLY because
|
* fs shutdown state instead of sb->s_flag's SB_RDONLY because
|
||||||
* the latter could be true if the filesystem is mounted
|
* the latter could be true if the filesystem is mounted
|
||||||
* read-only, and in that case, ext4_writepages should
|
* read-only, and in that case, ext4_writepages should
|
||||||
* *never* be called, so if that ever happens, we would want
|
* *never* be called, so if that ever happens, we would want
|
||||||
* the stack trace.
|
* the stack trace.
|
||||||
*/
|
*/
|
||||||
if (unlikely(ext4_forced_shutdown(mapping->host->i_sb) ||
|
if (unlikely(ext4_forced_shutdown(mapping->host->i_sb))) {
|
||||||
ext4_test_mount_flag(inode->i_sb, EXT4_MF_FS_ABORTED))) {
|
|
||||||
ret = -EROFS;
|
ret = -EROFS;
|
||||||
goto out_writepages;
|
goto out_writepages;
|
||||||
}
|
}
|
||||||
|
@ -5664,7 +5664,7 @@ static inline void ext4_mb_show_pa(struct super_block *sb)
|
|||||||
{
|
{
|
||||||
ext4_group_t i, ngroups;
|
ext4_group_t i, ngroups;
|
||||||
|
|
||||||
if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
|
if (ext4_forced_shutdown(sb))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
ngroups = ext4_get_groups_count(sb);
|
ngroups = ext4_get_groups_count(sb);
|
||||||
@ -5698,7 +5698,7 @@ static void ext4_mb_show_ac(struct ext4_allocation_context *ac)
|
|||||||
{
|
{
|
||||||
struct super_block *sb = ac->ac_sb;
|
struct super_block *sb = ac->ac_sb;
|
||||||
|
|
||||||
if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED))
|
if (ext4_forced_shutdown(sb))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
mb_debug(sb, "Can't allocate:"
|
mb_debug(sb, "Can't allocate:"
|
||||||
|
@ -657,7 +657,7 @@ static void ext4_handle_error(struct super_block *sb, bool force_ro, int error,
|
|||||||
WARN_ON_ONCE(1);
|
WARN_ON_ONCE(1);
|
||||||
|
|
||||||
if (!continue_fs && !sb_rdonly(sb)) {
|
if (!continue_fs && !sb_rdonly(sb)) {
|
||||||
ext4_set_mount_flag(sb, EXT4_MF_FS_ABORTED);
|
set_bit(EXT4_FLAGS_SHUTDOWN, &EXT4_SB(sb)->s_ext4_flags);
|
||||||
if (journal)
|
if (journal)
|
||||||
jbd2_journal_abort(journal, -EIO);
|
jbd2_journal_abort(journal, -EIO);
|
||||||
}
|
}
|
||||||
@ -6502,7 +6502,7 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
|
|||||||
flush_work(&sbi->s_error_work);
|
flush_work(&sbi->s_error_work);
|
||||||
|
|
||||||
if ((bool)(fc->sb_flags & SB_RDONLY) != sb_rdonly(sb)) {
|
if ((bool)(fc->sb_flags & SB_RDONLY) != sb_rdonly(sb)) {
|
||||||
if (ext4_test_mount_flag(sb, EXT4_MF_FS_ABORTED)) {
|
if (ext4_forced_shutdown(sb)) {
|
||||||
err = -EROFS;
|
err = -EROFS;
|
||||||
goto restore_opts;
|
goto restore_opts;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user