[PATCH RFC 25/28] ext4: allow remounting read-only in the emergency state

Jan Kara jack at suse.cz
Mon Oct 12 09:38:48 PDT 2026


On Mon 12-10-26 12:21:10, Christian Brauner wrote:
> __ext4_remount() refuses any change of the read-only state with -EROFS
> while ext4_emergency_state() is set, i.e. after FS_IOC_SHUTDOWN, after
> an error with errors=remount-ro or after an error that forces the
> filesystem read-only like ext4_abort(). None of them sets SB_RDONLY
> anymore. So a plain remount to read-only fails and the filesystem stays
> read-write.
> 
> And emergency remount (sysrq u) asks every read-write superblock on a
> block device to go read-only with SB_FORCE. ext4 refuses that too and
> reconfigure_super() warns before it sets SB_RDONLY anyway:
> 
>   EXT4-fs (vda): Remounting filesystem read-only
>   sysrq: Emergency Remount R/O
>   forced remount of a ext4 fs returned -30
>   WARNING: fs/super.c:1133 at reconfigure_super+0x498/0xb20, CPU#3: kworker/3:1/50
>    do_emergency_remount_callback+0xc4/0x100
>    __iterate_supers+0x33d/0x410
>    do_emergency_remount+0x20/0x40
> 
> With panic_on_warn that's a panic from sysrq u.
> 
> Nothing may be written in the emergency state but becoming read-only
> doesn't need to write anything. So allow going read-only and skip
> everything in that branch that would touch the disk. That's
> sync_filesystem(), which fails with the emergency errno anyway,
> dquot_suspend(), the s_state update and ext4_mark_recovery_complete().
> Note that after a shutdown with FS_SHUTDOWN_FLAGS_DEFAULT the journal is
> still live and the latter would really write. Also skip the superblock
> commit a remount does for a filesystem without a journal, like
> ext4_put_super() does in that state. Going read-write is still refused
> with -EROFS and option-only remounts work as before. Quotas stay on
> until umount.
> 
> That's the rule the filesystems converted earlier in this series follow
> as well. In the emergency state going read-write fails and going
> read-only works, writing at most what was dirtied before the error.
> 
> Reproducer (the sb_rdonly selftest after this patch covers the mount(2)
> path):
> 
>   truncate -s 64M img; mkfs.ext4 -q img
>   mount -o loop,errors=remount-ro img /mnt
>   xfs_io -x -c shutdown /mnt     # or any ext4 error, e.g.
>                                  # echo x > /sys/fs/ext4/loop0/trigger_fs_error
>   mount -o remount,ro /mnt       # EROFS, stays read-write
>   echo u > /proc/sysrq-trigger   # WARNING: forced remount of a ext4 fs returned -30
> 
> Fixes: 95257987a638 ("ext4: drop EXT4_MF_FS_ABORTED flag")
> Fixes: d3476f3dad4a ("ext4: don't set SB_RDONLY after filesystem errors")
> Cc: stable at vger.kernel.org
> Signed-off-by: Christian Brauner (Amutable) <brauner at kernel.org>

Looks good. Feel free to add:

Reviewed-by: Jan Kara <jack at suse.cz>

								Honza

> ---
>  fs/ext4/super.c | 20 ++++++++++++++------
>  1 file changed, 14 insertions(+), 6 deletions(-)
> 
> diff --git a/fs/ext4/super.c b/fs/ext4/super.c
> index d636b89090a2..643c304460ec 100644
> --- a/fs/ext4/super.c
> +++ b/fs/ext4/super.c
> @@ -6711,11 +6711,18 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
>  
>  	if ((bool)(fc->sb_flags & SB_RDONLY) != sb_rdonly(sb)) {
>  		if (ext4_emergency_state(sb)) {
> -			err = -EROFS;
> -			goto restore_opts;
> -		}
> -
> -		if (fc->sb_flags & SB_RDONLY) {
> +			/*
> +			 * Nothing may be written in the emergency state. Going
> +			 * read-write stays refused, but going read-only must
> +			 * not fail or emergency remount (sysrq u) WARNs. So
> +			 * just become read-only without touching the disk.
> +			 */
> +			if (!(fc->sb_flags & SB_RDONLY)) {
> +				err = -EROFS;
> +				goto restore_opts;
> +			}
> +			sb->s_flags |= SB_RDONLY;
> +		} else if (fc->sb_flags & SB_RDONLY) {
>  			err = sync_filesystem(sb);
>  			if (err < 0)
>  				goto restore_opts;
> @@ -6826,7 +6833,8 @@ static int __ext4_remount(struct fs_context *fc, struct super_block *sb)
>  			goto restore_opts;
>  	}
>  
> -	if (sbi->s_journal == NULL && !(old_sb_flags & SB_RDONLY)) {
> +	if (sbi->s_journal == NULL && !(old_sb_flags & SB_RDONLY) &&
> +	    !ext4_emergency_state(sb)) {
>  		err = ext4_commit_super(sb);
>  		if (err)
>  			goto restore_opts;
> 
> -- 
> 2.53.0
> 
-- 
Jan Kara <jack at suse.com>
SUSE Labs, CR



More information about the linux-mtd mailing list