|
@@ -356,6 +356,8 @@ xfs_parseargs(
|
|
|
mp->m_flags |= XFS_MOUNT_DELAYLOG;
|
|
|
} else if (!strcmp(this_char, MNTOPT_NODELAYLOG)) {
|
|
|
mp->m_flags &= ~XFS_MOUNT_DELAYLOG;
|
|
|
+ xfs_warn(mp,
|
|
|
+ "nodelaylog is deprecated and will be removed in Linux 3.3");
|
|
|
} else if (!strcmp(this_char, MNTOPT_DISCARD)) {
|
|
|
mp->m_flags |= XFS_MOUNT_DISCARD;
|
|
|
} else if (!strcmp(this_char, MNTOPT_NODISCARD)) {
|
|
@@ -877,33 +879,17 @@ xfs_log_inode(
|
|
|
struct xfs_trans *tp;
|
|
|
int error;
|
|
|
|
|
|
- xfs_iunlock(ip, XFS_ILOCK_SHARED);
|
|
|
tp = xfs_trans_alloc(mp, XFS_TRANS_FSYNC_TS);
|
|
|
error = xfs_trans_reserve(tp, 0, XFS_FSYNC_TS_LOG_RES(mp), 0, 0, 0);
|
|
|
-
|
|
|
if (error) {
|
|
|
xfs_trans_cancel(tp, 0);
|
|
|
- /* we need to return with the lock hold shared */
|
|
|
- xfs_ilock(ip, XFS_ILOCK_SHARED);
|
|
|
return error;
|
|
|
}
|
|
|
|
|
|
xfs_ilock(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_ijoin_ref(tp, ip, XFS_ILOCK_EXCL);
|
|
|
xfs_trans_log_inode(tp, ip, XFS_ILOG_CORE);
|
|
|
- error = xfs_trans_commit(tp, 0);
|
|
|
- xfs_ilock_demote(ip, XFS_ILOCK_EXCL);
|
|
|
-
|
|
|
- return error;
|
|
|
+ return xfs_trans_commit(tp, 0);
|
|
|
}
|
|
|
|
|
|
STATIC int
|
|
@@ -918,7 +904,9 @@ xfs_fs_write_inode(
|
|
|
trace_xfs_write_inode(ip);
|
|
|
|
|
|
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) {
|
|
|
/*
|
|
@@ -929,12 +917,10 @@ xfs_fs_write_inode(
|
|
|
* of synchronous log foces dramatically.
|
|
|
*/
|
|
|
xfs_ioend_wait(ip);
|
|
|
- xfs_ilock(ip, XFS_ILOCK_SHARED);
|
|
|
- if (ip->i_update_core) {
|
|
|
- error = xfs_log_inode(ip);
|
|
|
- if (error)
|
|
|
- goto out_unlock;
|
|
|
- }
|
|
|
+ error = xfs_log_inode(ip);
|
|
|
+ if (error)
|
|
|
+ goto out;
|
|
|
+ return 0;
|
|
|
} else {
|
|
|
/*
|
|
|
* We make this non-blocking if the inode is contended, return
|