|
@@ -1082,6 +1082,9 @@ xfs_fsync(
|
|
|
if (XFS_FORCED_SHUTDOWN(ip->i_mount))
|
|
|
return XFS_ERROR(EIO);
|
|
|
|
|
|
+ if (flag & FSYNC_DATA)
|
|
|
+ filemap_fdatawait(vn_to_inode(XFS_ITOV(ip))->i_mapping);
|
|
|
+
|
|
|
/*
|
|
|
* We always need to make sure that the required inode state
|
|
|
* is safe on disk. The vnode might be clean but because
|
|
@@ -3769,12 +3772,16 @@ xfs_inode_flush(
|
|
|
sync_lsn = log->l_last_sync_lsn;
|
|
|
GRANT_UNLOCK(log, s);
|
|
|
|
|
|
- if ((XFS_LSN_CMP(iip->ili_last_lsn, sync_lsn) <= 0))
|
|
|
- return 0;
|
|
|
+ if ((XFS_LSN_CMP(iip->ili_last_lsn, sync_lsn) > 0)) {
|
|
|
+ if (flags & FLUSH_SYNC)
|
|
|
+ log_flags |= XFS_LOG_SYNC;
|
|
|
+ error = xfs_log_force(mp, iip->ili_last_lsn, log_flags);
|
|
|
+ if (error)
|
|
|
+ return error;
|
|
|
+ }
|
|
|
|
|
|
- if (flags & FLUSH_SYNC)
|
|
|
- log_flags |= XFS_LOG_SYNC;
|
|
|
- return xfs_log_force(mp, iip->ili_last_lsn, log_flags);
|
|
|
+ if (ip->i_update_core == 0)
|
|
|
+ return 0;
|
|
|
}
|
|
|
}
|
|
|
|
|
@@ -3788,9 +3795,6 @@ xfs_inode_flush(
|
|
|
if (flags & FLUSH_INODE) {
|
|
|
int flush_flags;
|
|
|
|
|
|
- if (xfs_ipincount(ip))
|
|
|
- return EAGAIN;
|
|
|
-
|
|
|
if (flags & FLUSH_SYNC) {
|
|
|
xfs_ilock(ip, XFS_ILOCK_SHARED);
|
|
|
xfs_iflock(ip);
|