Commit 8a1706c3 authored by Stephen Lord's avatar Stephen Lord

[XFS] clean up the flush logic some more, make the inode flush path less

lossy since we now depend on it. Add a sync_fs callout which waits
for flush to be done.

SGI Modid: 2.5.x-xfs:slinx:155186a
parent 8e3724ac
...@@ -506,6 +506,19 @@ linvfs_write_super( ...@@ -506,6 +506,19 @@ linvfs_write_super(
sb->s_dirt = 0; sb->s_dirt = 0;
} }
STATIC int
linvfs_sync_super(
struct super_block *sb)
{
vfs_t *vfsp = LINVFS_GET_VFS(sb);
int error;
VFS_SYNC(vfsp, SYNC_FSDATA|SYNC_WAIT, NULL, error);
sb->s_dirt = 0;
return -error;
}
STATIC int STATIC int
linvfs_statfs( linvfs_statfs(
struct super_block *sb, struct super_block *sb,
...@@ -798,6 +811,7 @@ STATIC struct super_operations linvfs_sops = { ...@@ -798,6 +811,7 @@ STATIC struct super_operations linvfs_sops = {
.clear_inode = linvfs_clear_inode, .clear_inode = linvfs_clear_inode,
.put_super = linvfs_put_super, .put_super = linvfs_put_super,
.write_super = linvfs_write_super, .write_super = linvfs_write_super,
.sync_fs = linvfs_sync_super,
.write_super_lockfs = linvfs_freeze_fs, .write_super_lockfs = linvfs_freeze_fs,
.unlockfs = linvfs_unfreeze_fs, .unlockfs = linvfs_unfreeze_fs,
.statfs = linvfs_statfs, .statfs = linvfs_statfs,
......
...@@ -1506,7 +1506,7 @@ xfs_syncsub( ...@@ -1506,7 +1506,7 @@ xfs_syncsub(
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
error = xfs_trans_commit(tp, 0, NULL); error = xfs_trans_commit(tp, 0, NULL);
xfs_iunlock(ip, XFS_ILOCK_EXCL); xfs_iunlock(ip, XFS_ILOCK_EXCL);
xfs_log_force(mp, (xfs_lsn_t)0, XFS_LOG_FORCE); xfs_log_force(mp, (xfs_lsn_t)0, log_flags);
} }
/* /*
......
...@@ -3730,9 +3730,7 @@ xfs_inode_flush( ...@@ -3730,9 +3730,7 @@ xfs_inode_flush(
int flags) int flags)
{ {
xfs_inode_t *ip; xfs_inode_t *ip;
xfs_dinode_t *dip;
xfs_mount_t *mp; xfs_mount_t *mp;
xfs_buf_t *bp;
int error = 0; int error = 0;
ip = XFS_BHVTOI(bdp); ip = XFS_BHVTOI(bdp);
...@@ -3778,44 +3776,30 @@ xfs_inode_flush( ...@@ -3778,44 +3776,30 @@ xfs_inode_flush(
* now, they get caught later by xfs_sync. * now, they get caught later by xfs_sync.
*/ */
if (flags & FLUSH_INODE) { if (flags & FLUSH_INODE) {
if (xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) {
if ((xfs_ipincount(ip) == 0) && xfs_iflock_nowait(ip)) {
int flush_flags; int flush_flags;
#if 0 if (xfs_ipincount(ip))
/* not turning this on until some
* performance analysis is done
*/
if (flags & FLUSH_SYNC)
flush_flags = XFS_IFLUSH_SYNC;
else
#endif
flush_flags = XFS_IFLUSH_DELWRI_ELSE_ASYNC;
xfs_ifunlock(ip);
xfs_iunlock(ip, XFS_ILOCK_SHARED);
error = xfs_itobp(mp, NULL, ip, &dip, &bp, 0);
if (error)
return error;
xfs_buf_relse(bp);
if (xfs_ilock_nowait(ip, XFS_ILOCK_SHARED) == 0)
return EAGAIN; return EAGAIN;
if (xfs_ipincount(ip) || if (flags & FLUSH_SYNC) {
!xfs_iflock_nowait(ip)) { xfs_ilock(ip, XFS_ILOCK_SHARED);
xfs_iflock(ip);
} else if (xfs_ilock_nowait(ip, XFS_ILOCK_SHARED)) {
if (xfs_ipincount(ip) || !xfs_iflock_nowait(ip)) {
xfs_iunlock(ip, XFS_ILOCK_SHARED); xfs_iunlock(ip, XFS_ILOCK_SHARED);
return EAGAIN; return EAGAIN;
} }
error = xfs_iflush(ip, flush_flags);
} else { } else {
error = EAGAIN; return EAGAIN;
} }
if (flags & FLUSH_SYNC)
flush_flags = XFS_IFLUSH_SYNC;
else
flush_flags = XFS_IFLUSH_ASYNC;
error = xfs_iflush(ip, flush_flags);
xfs_iunlock(ip, XFS_ILOCK_SHARED); xfs_iunlock(ip, XFS_ILOCK_SHARED);
} else {
error = EAGAIN;
}
} }
return error; return error;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment