diff options
author | Lachlan McIlroy <lachlan@sgi.com> | 2007-09-14 01:22:50 -0400 |
---|---|---|
committer | Tim Shimmin <tes@chook.melbourne.sgi.com> | 2007-09-18 06:12:51 -0400 |
commit | 776a75fa5cfb8f3602d3ca9d221dc34497133f4b (patch) | |
tree | 760e34fa2e426e740cd50deab16ca80f9a3e483b /fs/xfs | |
parent | 65de5567564e70edd01b6d4e95e548d7ba284872 (diff) |
[XFS] Ensure file size updates have been completed before writing inode to disk.
SGI-PV: 968767
SGI-Modid: xfs-linux-melb:xfs-kern:29675a
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: David Chinner <dgc@sgi.com>
Signed-off-by: Tim Shimmin <tes@sgi.com>
Diffstat (limited to 'fs/xfs')
-rw-r--r-- | fs/xfs/linux-2.6/xfs_aops.c | 1 | ||||
-rw-r--r-- | fs/xfs/linux-2.6/xfs_super.c | 4 | ||||
-rw-r--r-- | fs/xfs/xfs_vnodeops.c | 20 |
3 files changed, 16 insertions, 9 deletions
diff --git a/fs/xfs/linux-2.6/xfs_aops.c b/fs/xfs/linux-2.6/xfs_aops.c index d9c40fe64195..5f152f60d74d 100644 --- a/fs/xfs/linux-2.6/xfs_aops.c +++ b/fs/xfs/linux-2.6/xfs_aops.c | |||
@@ -181,6 +181,7 @@ xfs_setfilesize( | |||
181 | ip->i_d.di_size = isize; | 181 | ip->i_d.di_size = isize; |
182 | ip->i_update_core = 1; | 182 | ip->i_update_core = 1; |
183 | ip->i_update_size = 1; | 183 | ip->i_update_size = 1; |
184 | mark_inode_dirty_sync(vn_to_inode(ioend->io_vnode)); | ||
184 | } | 185 | } |
185 | 186 | ||
186 | xfs_iunlock(ip, XFS_ILOCK_EXCL); | 187 | xfs_iunlock(ip, XFS_ILOCK_EXCL); |
diff --git a/fs/xfs/linux-2.6/xfs_super.c b/fs/xfs/linux-2.6/xfs_super.c index 4528f9a3f304..491d1f4f202d 100644 --- a/fs/xfs/linux-2.6/xfs_super.c +++ b/fs/xfs/linux-2.6/xfs_super.c | |||
@@ -415,8 +415,10 @@ xfs_fs_write_inode( | |||
415 | 415 | ||
416 | if (vp) { | 416 | if (vp) { |
417 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); | 417 | vn_trace_entry(vp, __FUNCTION__, (inst_t *)__return_address); |
418 | if (sync) | 418 | if (sync) { |
419 | filemap_fdatawait(inode->i_mapping); | ||
419 | flags |= FLUSH_SYNC; | 420 | flags |= FLUSH_SYNC; |
421 | } | ||
420 | error = bhv_vop_iflush(vp, flags); | 422 | error = bhv_vop_iflush(vp, flags); |
421 | if (error == EAGAIN) | 423 | if (error == EAGAIN) |
422 | error = sync? bhv_vop_iflush(vp, flags | FLUSH_LOG) : 0; | 424 | error = sync? bhv_vop_iflush(vp, flags | FLUSH_LOG) : 0; |
diff --git a/fs/xfs/xfs_vnodeops.c b/fs/xfs/xfs_vnodeops.c index 1a5ad8cd97b0..603459229904 100644 --- a/fs/xfs/xfs_vnodeops.c +++ b/fs/xfs/xfs_vnodeops.c | |||
@@ -1082,6 +1082,9 @@ xfs_fsync( | |||
1082 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) | 1082 | if (XFS_FORCED_SHUTDOWN(ip->i_mount)) |
1083 | return XFS_ERROR(EIO); | 1083 | return XFS_ERROR(EIO); |
1084 | 1084 | ||
1085 | if (flag & FSYNC_DATA) | ||
1086 | filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping); | ||
1087 | |||
1085 | /* | 1088 | /* |
1086 | * We always need to make sure that the required inode state | 1089 | * We always need to make sure that the required inode state |
1087 | * is safe on disk. The vnode might be clean but because | 1090 | * is safe on disk. The vnode might be clean but because |
@@ -3769,12 +3772,16 @@ xfs_inode_flush( | |||
3769 | sync_lsn = log->l_last_sync_lsn; | 3772 | sync_lsn = log->l_last_sync_lsn; |
3770 | GRANT_UNLOCK(log, s); | 3773 | GRANT_UNLOCK(log, s); |
3771 | 3774 | ||
3772 | if ((XFS_LSN_CMP(iip->ili_last_lsn, sync_lsn) <= 0)) | 3775 | if ((XFS_LSN_CMP(iip->ili_last_lsn, sync_lsn) > 0)) { |
3773 | return 0; | 3776 | if (flags & FLUSH_SYNC) |
3777 | log_flags |= XFS_LOG_SYNC; | ||
3778 | error = xfs_log_force(mp, iip->ili_last_lsn, log_flags); | ||
3779 | if (error) | ||
3780 | return error; | ||
3781 | } | ||
3774 | 3782 | ||
3775 | if (flags & FLUSH_SYNC) | 3783 | if (ip->i_update_core == 0) |
3776 | log_flags |= XFS_LOG_SYNC; | 3784 | return 0; |
3777 | return xfs_log_force(mp, iip->ili_last_lsn, log_flags); | ||
3778 | } | 3785 | } |
3779 | } | 3786 | } |
3780 | 3787 | ||
@@ -3788,9 +3795,6 @@ xfs_inode_flush( | |||
3788 | if (flags & FLUSH_INODE) { | 3795 | if (flags & FLUSH_INODE) { |
3789 | int flush_flags; | 3796 | int flush_flags; |
3790 | 3797 | ||
3791 | if (xfs_ipincount(ip)) | ||
3792 | return EAGAIN; | ||
3793 | |||
3794 | if (flags & FLUSH_SYNC) { | 3798 | if (flags & FLUSH_SYNC) { |
3795 | xfs_ilock(ip, XFS_ILOCK_SHARED); | 3799 | xfs_ilock(ip, XFS_ILOCK_SHARED); |
3796 | xfs_iflock(ip); | 3800 | xfs_iflock(ip); |