xfs
[Top] [All Lists]

[PATCH] ensure file size is logged on synchronous writes

To: xfs-dev <xfs-dev@xxxxxxx>
Subject: [PATCH] ensure file size is logged on synchronous writes
From: Lachlan McIlroy <lachlan@xxxxxxx>
Date: Mon, 03 Sep 2007 13:07:12 +1000
Cc: xfs-oss <xfs@xxxxxxxxxxx>
Sender: xfs-bounce@xxxxxxxxxxx
User-agent: Thunderbird 2.0.0.4 (X11/20070604)
Synchronous writes currently log inode changes before syncing
pages to disk.  Since the file size is updated on I/O completion
we wont be writing out the updated file size and if we crash the
file will have the wrong size.  This change moves the logging
after the syncing of the pages to ensure we log the correct file
size.

Lachlan
--- fs/xfs/linux-2.6/xfs_lrw.c_1.266    2007-08-30 17:38:53.000000000 +1000
+++ fs/xfs/linux-2.6/xfs_lrw.c  2007-08-31 15:38:49.000000000 +1000
@@ -895,20 +895,19 @@ retry:
 
        /* Handle various SYNC-type writes */
        if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) {
-               error = xfs_write_sync_logforce(mp, xip);
-               if (error)
-                       goto out_unlock_internal;
-
+               int error2;
                xfs_rwunlock(xip, locktype);
                if (need_i_mutex)
                        mutex_unlock(&inode->i_mutex);
-
-               error = sync_page_range(inode, mapping, pos, ret);
+               error2 = sync_page_range(inode, mapping, pos, ret);
                if (!error)
-                       error = -ret;
+                       error = error2;
                if (need_i_mutex)
                        mutex_lock(&inode->i_mutex);
                xfs_rwlock(xip, locktype);
+               error2 = xfs_write_sync_logforce(mp, xip);
+               if (!error)
+                       error = error2;
        }
 
  out_unlock_internal:
<Prev in Thread] Current Thread [Next in Thread>