[PATCH v4] Stop periodic syncing if filesystem is already shutdown.
raghu.prabhu13 at gmail.com
raghu.prabhu13 at gmail.com
Thu May 31 13:07:34 CDT 2012
From: Raghavendra D Prabhu <rprabhu at wnohang.net>
This is to prevent xfs_log_force from running ad-infinitum (due to xfs_sync)
till umount if the disk has been forcefully unplugged.
This is also to prevent messages like these from being displayed repeatedly.
[ 3873.009329] XFS (sdb3): xfs_log_force: error 5 returned.
Note, that even after xfs_do_force_shutdown has been called, xfs_log_force
doesn't stop till the filesystem has been unmounted (and it keeps printing
"error 5 returned" to kernel log).
To fix it, added return statements to xfs_log_force and xfs_fs_sync_fs if the
filesystem is already shutdown -- based on XFS_FORCED_SHUTDOWN.
To simulate it, mount an xfs filesystem located on external disk, and then pull
the power to the disk.
Tested it on latest linus tree.
Now, the dmesg looks,
[ 268.307303] XFS (sdb2): xfs_do_force_shutdown(0x1) called from line 1031 of file fs/xfs/xfs_buf.c. Return address = 0xffffffff8127c13a
[ 268.307318] XFS (sdb2): I/O Error Detected. Shutting down filesystem
[ 268.307323] XFS (sdb2): Please umount the filesystem and rectify the problem(s)
---
Version 1: Removed calling xfs_syncd_stop from xfs_sync_worker.
Version 2: Removed calling xfs_fs_writable in xfs_sync_worker and xfs_flush_worker.
Version 3: Removed calling xfs_syncd_stop in xfs_bwrite.
Version 4: Added return statements to xfs_log_force and xfs_fs_sync_fs.
Signed-off-by: Raghavendra D Prabhu <rprabhu at wnohang.net>
Tested-by: Raghavendra D Prabhu <rprabhu at wnohang.net>
---
---
fs/xfs/xfs_log.c | 7 +++++++
fs/xfs/xfs_super.c | 7 +++++++
2 files changed, 14 insertions(+)
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 6db1fef..e4192b2 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -2932,6 +2932,13 @@ xfs_log_force(
{
int error;
+ /*
+ * No need to printk here since xfs_bwrite already printks about xfs
+ * shutdown if it has shutdown already.
+ */
+ if (XFS_FORCED_SHUTDOWN(mp))
+ return;
+
error = _xfs_log_force(mp, flags, NULL);
if (error)
xfs_warn(mp, "%s: error %d returned.", __func__, error);
diff --git a/fs/xfs/xfs_super.c b/fs/xfs/xfs_super.c
index dab9a5f..b0f6041 100644
--- a/fs/xfs/xfs_super.c
+++ b/fs/xfs/xfs_super.c
@@ -1010,6 +1010,13 @@ xfs_fs_sync_fs(
int error;
/*
+ * No need to printk here since xfs_bwrite already printks about xfs
+ * shutdown if it has shutdown already.
+ */
+ if (XFS_FORCED_SHUTDOWN(mp))
+ return XFS_ERROR(EIO);
+
+ /*
* Doing anything during the async pass would be counterproductive.
*/
if (!wait)
--
1.7.10.3
More information about the xfs
mailing list