]> git.ipfire.org Git - thirdparty/kernel/linux.git/commitdiff
xfs: report fs metadata errors via fsnotify
authorDarrick J. Wong <djwong@kernel.org>
Tue, 13 Jan 2026 00:31:56 +0000 (16:31 -0800)
committerChristian Brauner <brauner@kernel.org>
Tue, 13 Jan 2026 08:58:01 +0000 (09:58 +0100)
Report filesystem corruption problems to the fserror helpers so that
fsnotify can also convey metadata problems to userspace.

Signed-off-by: Darrick J. Wong <djwong@kernel.org>
Link: https://patch.msgid.link/176826402652.3490369.2609467634858507969.stgit@frogsfrogsfrogs
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Christian Brauner <brauner@kernel.org>
fs/xfs/xfs_fsops.c
fs/xfs/xfs_health.c

index 0ada735693945cd048d5cf0531b476499e7ee412..b7c21f68edc78d9954da688fb472601dc53455a3 100644 (file)
@@ -26,6 +26,8 @@
 #include "xfs_rtrefcount_btree.h"
 #include "xfs_metafile.h"
 
+#include <linux/fserror.h>
+
 /*
  * Write new AG headers to disk. Non-transactional, but need to be
  * written and completed prior to the growfs transaction being logged.
@@ -540,6 +542,8 @@ xfs_do_force_shutdown(
                "Please unmount the filesystem and rectify the problem(s)");
        if (xfs_error_level >= XFS_ERRLEVEL_HIGH)
                xfs_stack_trace();
+
+       fserror_report_shutdown(mp->m_super, GFP_KERNEL);
 }
 
 /*
index 3c1557fb1cf0838064db7819f4c7ace294d1c425..fbb8886c72fe5e3a14e58ee7a948352dc1651ebe 100644 (file)
@@ -20,6 +20,8 @@
 #include "xfs_quota_defs.h"
 #include "xfs_rtgroup.h"
 
+#include <linux/fserror.h>
+
 static void
 xfs_health_unmount_group(
        struct xfs_group        *xg,
@@ -111,6 +113,8 @@ xfs_fs_mark_sick(
        spin_lock(&mp->m_sb_lock);
        mp->m_fs_sick |= mask;
        spin_unlock(&mp->m_sb_lock);
+
+       fserror_report_metadata(mp->m_super, -EFSCORRUPTED, GFP_NOFS);
 }
 
 /* Mark per-fs metadata as having been checked and found unhealthy by fsck. */
@@ -126,6 +130,8 @@ xfs_fs_mark_corrupt(
        mp->m_fs_sick |= mask;
        mp->m_fs_checked |= mask;
        spin_unlock(&mp->m_sb_lock);
+
+       fserror_report_metadata(mp->m_super, -EFSCORRUPTED, GFP_NOFS);
 }
 
 /* Mark a per-fs metadata healed. */
@@ -198,6 +204,8 @@ xfs_group_mark_sick(
        spin_lock(&xg->xg_state_lock);
        xg->xg_sick |= mask;
        spin_unlock(&xg->xg_state_lock);
+
+       fserror_report_metadata(xg->xg_mount->m_super, -EFSCORRUPTED, GFP_NOFS);
 }
 
 /*
@@ -215,6 +223,8 @@ xfs_group_mark_corrupt(
        xg->xg_sick |= mask;
        xg->xg_checked |= mask;
        spin_unlock(&xg->xg_state_lock);
+
+       fserror_report_metadata(xg->xg_mount->m_super, -EFSCORRUPTED, GFP_NOFS);
 }
 
 /*
@@ -287,6 +297,8 @@ xfs_inode_mark_sick(
        spin_lock(&VFS_I(ip)->i_lock);
        inode_state_clear(VFS_I(ip), I_DONTCACHE);
        spin_unlock(&VFS_I(ip)->i_lock);
+
+       fserror_report_file_metadata(VFS_I(ip), -EFSCORRUPTED, GFP_NOFS);
 }
 
 /* Mark inode metadata as having been checked and found unhealthy by fsck. */
@@ -311,6 +323,8 @@ xfs_inode_mark_corrupt(
        spin_lock(&VFS_I(ip)->i_lock);
        inode_state_clear(VFS_I(ip), I_DONTCACHE);
        spin_unlock(&VFS_I(ip)->i_lock);
+
+       fserror_report_file_metadata(VFS_I(ip), -EFSCORRUPTED, GFP_NOFS);
 }
 
 /* Mark parts of an inode healed. */