提交 58d84c4e 编写于 作者: C Christoph Hellwig 提交者: Alex Elder

xfs: fix ->write_inode return values

Currently we always redirty an inode that was attempted to be written out
synchronously but has been cleaned by an AIL pushed internall, which is
rather bogus.  Fix that by doing the i_update_core check early on and
return 0 for it.  Also include async calls for it, as doing any work for
those is just as pointless.  While we're at it also fix the sign for the
EIO return in case of a filesystem shutdown, and fix the completely
non-sensical locking around xfs_log_inode.
Signed-off-by: NChristoph Hellwig <hch@lst.de>
Reviewed-by: NDave Chinner <dchinner@redhat.com>
Signed-off-by: NAlex Elder <aelder@sgi.com>
(cherry picked from commit 297db93bb74cf687510313eb235a7aec14d67e97)
Signed-off-by: NAlex Elder <aelder@sgi.com>
上级 866e4ed7
...@@ -879,33 +879,17 @@ xfs_log_inode( ...@@ -879,33 +879,17 @@ xfs_log_inode(
struct xfs_trans *tp; struct xfs_trans *tp;
int error; int error;
xfs_iunlock(ip, XFS_ILOCK_SHARED);
tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS); tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0); error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0);
if (error) { if (error) {
xfs_trans_cancel(tp, 0); xfs_trans_cancel(tp, 0);
/* we need to return with the lock hold shared */
xfs_ilock(ip, XFS_ILOCK_SHARED);
return error; return error;
} }
xfs_ilock(ip, XFS_ILOCK_EXCL); xfs_ilock(ip, XFS_ILOCK_EXCL);
xfs_trans_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);
/*
* Note - it's possible that we might have pushed ourselves out of the
* way during trans_reserve which would flush the inode. But there's
* no guarantee that the inode buffer has actually gone out yet (it's
* delwri). Plus the buffer could be pinned anyway if it's part of
* an inode in another recent transaction. So we play it safe and
* fire off the transaction anyway.
*/
xfs_trans_ijoin(tp, ip);
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE); xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
error = xfs_trans_commit(tp, 0); return xfs_trans_commit(tp, 0);
xfs_ilock_demote(ip, XFS_ILOCK_EXCL);
return error;
} }
STATIC int STATIC int
...@@ -920,7 +904,9 @@ xfs_fs_write_inode( ...@@ -920,7 +904,9 @@ xfs_fs_write_inode(
trace_xfs_write_inode(ip); trace_xfs_write_inode(ip);
if (XFS_FORCED_SHUTDOWN(mp)) if (XFS_FORCED_SHUTDOWN(mp))
return XFS_ERROR(EIO); return -XFS_ERROR(EIO);
if (!ip->i_update_core)
return 0;
if (wbc->sync_mode == WB_SYNC_ALL) { if (wbc->sync_mode == WB_SYNC_ALL) {
/* /*
...@@ -931,12 +917,10 @@ xfs_fs_write_inode( ...@@ -931,12 +917,10 @@ xfs_fs_write_inode(
* of synchronous log foces dramatically. * of synchronous log foces dramatically.
*/ */
xfs_ioend_wait(ip); xfs_ioend_wait(ip);
xfs_ilock(ip, XFS_ILOCK_SHARED); error = xfs_log_inode(ip);
if (ip->i_update_core) { if (error)
error = xfs_log_inode(ip); goto out;
if (error) return 0;
goto out_unlock;
}
} else { } else {
/* /*
* We make this non-blocking if the inode is contended, return * We make this non-blocking if the inode is contended, return
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册