xfs
[Top] [All Lists]

[PATCH] Ensure sync flushes all dirty data to disk

To: xfs@xxxxxxxxxxx
Subject: [PATCH] Ensure sync flushes all dirty data to disk
From: Lachlan McIlroy <lachlan@xxxxxxx>
Date: Fri, 28 Sep 2007 18:04:12 +1000
Reply-to: lachlan@xxxxxxx
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Thunderbird 2.0.0.4 (X11/20070604)
In xfs_fs_sync_super() treat a sync the same as a filesystem freeze.
This is needed to force the log to disk for inodes which are not marked
dirty in the Linux inode (the inodes are marked dirty on completion of
the log I/O) and so sync_inodes() will not flush them.

In xfs_fs_write_inode() a synchronous flush will not get an EAGAIN
from xfs_inode_flush() and if an asynchronous flush returns EAGAIN
we should pass it on to the caller.  If we get an error while flushing
the inode then re-dirty it so we can try again later.
--- fs/xfs/linux-2.6/xfs_super.c_1.398  2007-09-28 12:37:17.000000000 +1000
+++ fs/xfs/linux-2.6/xfs_super.c        2007-09-28 17:22:24.000000000 +1000
@@ -409,13 +409,8 @@ xfs_fs_write_inode(
                flags |= FLUSH_SYNC;
        }
        error = xfs_inode_flush(XFS_I(inode), flags);
-       if (error == EAGAIN) {
-               if (sync)
-                       error = xfs_inode_flush(XFS_I(inode),
-                                                      flags | FLUSH_LOG);
-               else
-                       error = 0;
-       }
+       if (error)
+               mark_inode_dirty_sync(inode);
 
        return -error;
 }
@@ -620,7 +615,7 @@ xfs_fs_sync_super(
        int                     error;
        int                     flags;
 
-       if (unlikely(sb->s_frozen == SB_FREEZE_WRITE)) {
+       if (wait || unlikely(sb->s_frozen == SB_FREEZE_WRITE)) {
                /*
                 * First stage of freeze - no more writers will make progress
                 * now we are here, so we flush delwri and delalloc buffers
@@ -631,7 +626,7 @@ xfs_fs_sync_super(
                 */
                flags = SYNC_DATA_QUIESCE;
        } else
-               flags = SYNC_FSDATA | (wait ? SYNC_WAIT : 0);
+               flags = SYNC_FSDATA;
 
        error = xfs_sync(mp, flags);
        sb->s_dirt = 0;
<Prev in Thread] Current Thread [Next in Thread>
  • [PATCH] Ensure sync flushes all dirty data to disk, Lachlan McIlroy <=