xfs_remount_ro() starts with sync_filesystem() which fails with EIO after a shutdown. So a shut down xfs can't be remounted read-only and emergency remount (sysrq u) WARNs in reconfigure_super(), a panic with panic_on_warn: forced remount of a xfs fs returned -5 Going read-only doesn't need to write anything. So ignore the errors from flushing and from freeing the COW and post-EOF blocks once xfs is shut down, also if the flush shut it down itself. The rest of xfs_remount_ro() copes with a shutdown like unmount does. And refuse going back to read-write with EIO, xfs_remount_rw() didn't check for a shutdown at all. Fixes: b97cca3ba909 ("xfs: only bother with sync_filesystem during readonly remount") Cc: stable@vger.kernel.org Reviewed-by: Christoph Hellwig Signed-off-by: Christian Brauner (Amutable) --- fs/xfs/xfs_super.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c index 5a06132aa384..59c83438d402 100644 --- a/fs/xfs/xfs_super.c +++ b/fs/xfs/xfs_super.c @@ -2041,6 +2041,10 @@ xfs_remount_rw( struct xfs_sb *sbp = &mp->m_sb; int error; + /* Nothing can be written anymore after a shutdown. */ + if (xfs_is_shutdown(mp)) + return -EIO; + if (mp->m_logdev_targp && mp->m_logdev_targp != mp->m_ddev_targp && xfs_readonly_buftarg(mp->m_logdev_targp)) { xfs_warn(mp, @@ -2115,9 +2119,12 @@ xfs_remount_ro( }; int error; - /* Flush all the dirty data to disk. */ + /* + * Flush all the dirty data to disk. That fails after a shutdown, also + * one the flush itself caused, but going read-only still has to work. + */ error = sync_filesystem(mp->m_super); - if (error) + if (error && !xfs_is_shutdown(mp)) return error; /* @@ -2133,7 +2140,7 @@ xfs_remount_ro( * cached inode, so this requires a synchronous cache scan. */ error = xfs_blockgc_free_space(mp, &icw); - if (error) { + if (error && !xfs_is_shutdown(mp)) { xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE); return error; } -- 2.53.0