[PATCH v4] Stop periodic syncing if filesystem is already shutdown.
Raghavendra D Prabhu
raghu.prabhu13 at gmail.com
Tue Jun 5 01:34:57 CDT 2012
Hi,
* On Tue, Jun 05, 2012 at 04:06:17PM +1000, Dave Chinner <david at fromorbit.com> wrote:
>On Thu, May 31, 2012 at 11:37:34PM +0530, raghu.prabhu13 at gmail.com wrote:
>> 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.
>
>I'm not sure where versions 2 and 3 went - I haven't seen them....
Actually I hadn't numbered them, but they are here http://oss.sgi.com/archives/xfs/2012-05/msg00065.html (starting from that thread). Sorry for that.
>
>>
>> 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);
>
>I don't think this is the right place for the check. Depending on
>the type of error that caused the shutdown, the log may still be
>functioning and we need to be able to force the log so we don't lose
>all the changes in memory. The internal log implementation has all
>the checks necessary to avoid writing to the log if the log has
>already been shut down, which is why you keep seeing the error
>message.
I went through the function now and noticed a couple of EIOs
returned, makes sense.
>
>What it appears to me is that you want to stop the error message
>from being emitted when the log is shut down. The way to do that is
>this:
>
> error = _xfs_log_force(mp, flags, NULL);
>- if (error)
>+ if (error && !XFS_FORCED_SHUTDOWN(mp))
> xfs_warn(mp, "%s: error %d returned.", __func__, error);
>
>Rather than avoining calling _xfs_log_force() altogether.
Yes, this should do.
>
>> 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);
>
>
>I think if someone runs sync or calls syncfs() we should emit an
>error message indicating that it failed. We can't return an error to
>sync(), so we are limited to writing to the syslog. This is not
>called periodically, so I don't see any problem with emitting an
>error message here. Being verbose in error states is desirable - you
>can never have too much information in the logs when something goes
>wrong....
Thanks, I look into this.
>
>Cheers,
>
>Dave.
>--
>Dave Chinner
>david at fromorbit.com
>
>_______________________________________________
>xfs mailing list
>xfs at oss.sgi.com
>http://oss.sgi.com/mailman/listinfo/xfs
>
Regards,
--
Raghavendra Prabhu
GPG Id : 0xD72BE977
Fingerprint: B93F EBCB 8E05 7039 CD3C A4B8 A616 DCA1 D72B E977
www: wnohang.net
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 490 bytes
Desc: not available
URL: <http://oss.sgi.com/pipermail/xfs/attachments/20120605/bd32c4fb/attachment.sig>
More information about the xfs
mailing list