aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs
diff options
context:
space:
mode:
authorLachlan McIlroy <lachlan@sgi.com>2007-09-14 01:22:08 -0400
committerTim Shimmin <tes@chook.melbourne.sgi.com>2007-10-15 22:18:38 -0400
commit5903c4956f7b429f515ba107d9c04bbbe7ce8f9d (patch)
tree4d7d4199632f43082fbf29525c3af8a7632bbb71 /fs/xfs
parentcc92e7ac8d96418d99f0c31a9a132e9fccc54553 (diff)
[XFS] ensure file size is logged on synchronous writes
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. SGI-PV: 970334 SGI-Modid: xfs-linux-melb:xfs-kern:29649a Signed-off-by: Lachlan McIlroy <lachlan@sgi.com> Signed-off-by: Christoph Hellwig <hch@infradead.org> Signed-off-by: Tim Shimmin <tes@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r--fs/xfs/linux-2.6/xfs_lrw.c13
1 files changed, 6 insertions, 7 deletions
diff --git a/fs/xfs/linux-2.6/xfs_lrw.c b/fs/xfs/linux-2.6/xfs_lrw.c
index 5d284403b411..0f54b104a6ee 100644
--- a/fs/xfs/linux-2.6/xfs_lrw.c
+++ b/fs/xfs/linux-2.6/xfs_lrw.c
@@ -838,20 +838,19 @@ retry:
838 838
839 /* Handle various SYNC-type writes */ 839 /* Handle various SYNC-type writes */
840 if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) { 840 if ((file->f_flags & O_SYNC) || IS_SYNC(inode)) {
841 error = xfs_write_sync_logforce(mp, xip); 841 int error2;
842 if (error)
843 goto out_unlock_internal;
844
845 xfs_rwunlock(xip, locktype); 842 xfs_rwunlock(xip, locktype);
846 if (need_i_mutex) 843 if (need_i_mutex)
847 mutex_unlock(&inode->i_mutex); 844 mutex_unlock(&inode->i_mutex);
848 845 error2 = sync_page_range(inode, mapping, pos, ret);
849 error = sync_page_range(inode, mapping, pos, ret);
850 if (!error) 846 if (!error)
851 error = -ret; 847 error = error2;
852 if (need_i_mutex) 848 if (need_i_mutex)
853 mutex_lock(&inode->i_mutex); 849 mutex_lock(&inode->i_mutex);
854 xfs_rwlock(xip, locktype); 850 xfs_rwlock(xip, locktype);
851 error2 = xfs_write_sync_logforce(mp, xip);
852 if (!error)
853 error = error2;
855 } 854 }
856 855
857 out_unlock_internal: 856 out_unlock_internal: