aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_log.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/xfs/xfs_log.c')
-rw-r--r--fs/xfs/xfs_log.c41
1 files changed, 10 insertions, 31 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 5215abc8023a..cee4ab9f8a9e 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -24,8 +24,6 @@
24#include "xfs_trans.h" 24#include "xfs_trans.h"
25#include "xfs_sb.h" 25#include "xfs_sb.h"
26#include "xfs_ag.h" 26#include "xfs_ag.h"
27#include "xfs_dir2.h"
28#include "xfs_dmapi.h"
29#include "xfs_mount.h" 27#include "xfs_mount.h"
30#include "xfs_error.h" 28#include "xfs_error.h"
31#include "xfs_log_priv.h" 29#include "xfs_log_priv.h"
@@ -35,8 +33,6 @@
35#include "xfs_ialloc_btree.h" 33#include "xfs_ialloc_btree.h"
36#include "xfs_log_recover.h" 34#include "xfs_log_recover.h"
37#include "xfs_trans_priv.h" 35#include "xfs_trans_priv.h"
38#include "xfs_dir2_sf.h"
39#include "xfs_attr_sf.h"
40#include "xfs_dinode.h" 36#include "xfs_dinode.h"
41#include "xfs_inode.h" 37#include "xfs_inode.h"
42#include "xfs_rw.h" 38#include "xfs_rw.h"
@@ -337,7 +333,6 @@ xfs_log_reserve(
337 int retval = 0; 333 int retval = 0;
338 334
339 ASSERT(client == XFS_TRANSACTION || client == XFS_LOG); 335 ASSERT(client == XFS_TRANSACTION || client == XFS_LOG);
340 ASSERT((flags & XFS_LOG_NOSLEEP) == 0);
341 336
342 if (XLOG_FORCED_SHUTDOWN(log)) 337 if (XLOG_FORCED_SHUTDOWN(log))
343 return XFS_ERROR(EIO); 338 return XFS_ERROR(EIO);
@@ -552,7 +547,7 @@ xfs_log_unmount_write(xfs_mount_t *mp)
552 .magic = XLOG_UNMOUNT_TYPE, 547 .magic = XLOG_UNMOUNT_TYPE,
553 }; 548 };
554 struct xfs_log_iovec reg = { 549 struct xfs_log_iovec reg = {
555 .i_addr = (void *)&magic, 550 .i_addr = &magic,
556 .i_len = sizeof(magic), 551 .i_len = sizeof(magic),
557 .i_type = XLOG_REG_TYPE_UNMOUNT, 552 .i_type = XLOG_REG_TYPE_UNMOUNT,
558 }; 553 };
@@ -922,19 +917,6 @@ xlog_iodone(xfs_buf_t *bp)
922 l = iclog->ic_log; 917 l = iclog->ic_log;
923 918
924 /* 919 /*
925 * If the _XFS_BARRIER_FAILED flag was set by a lower
926 * layer, it means the underlying device no longer supports
927 * barrier I/O. Warn loudly and turn off barriers.
928 */
929 if (bp->b_flags & _XFS_BARRIER_FAILED) {
930 bp->b_flags &= ~_XFS_BARRIER_FAILED;
931 l->l_mp->m_flags &= ~XFS_MOUNT_BARRIER;
932 xfs_fs_cmn_err(CE_WARN, l->l_mp,
933 "xlog_iodone: Barriers are no longer supported"
934 " by device. Disabling barriers\n");
935 }
936
937 /*
938 * Race to shutdown the filesystem if we see an error. 920 * Race to shutdown the filesystem if we see an error.
939 */ 921 */
940 if (XFS_TEST_ERROR((XFS_BUF_GETERROR(bp)), l->l_mp, 922 if (XFS_TEST_ERROR((XFS_BUF_GETERROR(bp)), l->l_mp,
@@ -1047,7 +1029,6 @@ xlog_alloc_log(xfs_mount_t *mp,
1047 xlog_in_core_t *iclog, *prev_iclog=NULL; 1029 xlog_in_core_t *iclog, *prev_iclog=NULL;
1048 xfs_buf_t *bp; 1030 xfs_buf_t *bp;
1049 int i; 1031 int i;
1050 int iclogsize;
1051 int error = ENOMEM; 1032 int error = ENOMEM;
1052 uint log2_size = 0; 1033 uint log2_size = 0;
1053 1034
@@ -1127,7 +1108,6 @@ xlog_alloc_log(xfs_mount_t *mp,
1127 * with different amounts of memory. See the definition of 1108 * with different amounts of memory. See the definition of
1128 * xlog_in_core_t in xfs_log_priv.h for details. 1109 * xlog_in_core_t in xfs_log_priv.h for details.
1129 */ 1110 */
1130 iclogsize = log->l_iclog_size;
1131 ASSERT(log->l_iclog_size >= 4096); 1111 ASSERT(log->l_iclog_size >= 4096);
1132 for (i=0; i < log->l_iclog_bufs; i++) { 1112 for (i=0; i < log->l_iclog_bufs; i++) {
1133 *iclogp = kmem_zalloc(sizeof(xlog_in_core_t), KM_MAYFAIL); 1113 *iclogp = kmem_zalloc(sizeof(xlog_in_core_t), KM_MAYFAIL);
@@ -1138,7 +1118,8 @@ xlog_alloc_log(xfs_mount_t *mp,
1138 iclog->ic_prev = prev_iclog; 1118 iclog->ic_prev = prev_iclog;
1139 prev_iclog = iclog; 1119 prev_iclog = iclog;
1140 1120
1141 bp = xfs_buf_get_noaddr(log->l_iclog_size, mp->m_logdev_targp); 1121 bp = xfs_buf_get_uncached(mp->m_logdev_targp,
1122 log->l_iclog_size, 0);
1142 if (!bp) 1123 if (!bp)
1143 goto out_free_iclog; 1124 goto out_free_iclog;
1144 if (!XFS_BUF_CPSEMA(bp)) 1125 if (!XFS_BUF_CPSEMA(bp))
@@ -1316,7 +1297,7 @@ xlog_bdstrat(
1316 if (iclog->ic_state & XLOG_STATE_IOERROR) { 1297 if (iclog->ic_state & XLOG_STATE_IOERROR) {
1317 XFS_BUF_ERROR(bp, EIO); 1298 XFS_BUF_ERROR(bp, EIO);
1318 XFS_BUF_STALE(bp); 1299 XFS_BUF_STALE(bp);
1319 xfs_biodone(bp); 1300 xfs_buf_ioend(bp, 0);
1320 /* 1301 /*
1321 * It would seem logical to return EIO here, but we rely on 1302 * It would seem logical to return EIO here, but we rely on
1322 * the log state machine to propagate I/O errors instead of 1303 * the log state machine to propagate I/O errors instead of
@@ -1428,11 +1409,8 @@ xlog_sync(xlog_t *log,
1428 XFS_BUF_BUSY(bp); 1409 XFS_BUF_BUSY(bp);
1429 XFS_BUF_ASYNC(bp); 1410 XFS_BUF_ASYNC(bp);
1430 bp->b_flags |= XBF_LOG_BUFFER; 1411 bp->b_flags |= XBF_LOG_BUFFER;
1431 /* 1412
1432 * Do an ordered write for the log block. 1413 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
1433 * Its unnecessary to flush the first split block in the log wrap case.
1434 */
1435 if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER))
1436 XFS_BUF_ORDERED(bp); 1414 XFS_BUF_ORDERED(bp);
1437 1415
1438 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); 1416 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
@@ -3025,7 +3003,8 @@ _xfs_log_force(
3025 3003
3026 XFS_STATS_INC(xs_log_force); 3004 XFS_STATS_INC(xs_log_force);
3027 3005
3028 xlog_cil_push(log, 1); 3006 if (log->l_cilp)
3007 xlog_cil_force(log);
3029 3008
3030 spin_lock(&log->l_icloglock); 3009 spin_lock(&log->l_icloglock);
3031 3010
@@ -3177,7 +3156,7 @@ _xfs_log_force_lsn(
3177 XFS_STATS_INC(xs_log_force); 3156 XFS_STATS_INC(xs_log_force);
3178 3157
3179 if (log->l_cilp) { 3158 if (log->l_cilp) {
3180 lsn = xlog_cil_push_lsn(log, lsn); 3159 lsn = xlog_cil_force_lsn(log, lsn);
3181 if (lsn == NULLCOMMITLSN) 3160 if (lsn == NULLCOMMITLSN)
3182 return 0; 3161 return 0;
3183 } 3162 }
@@ -3734,7 +3713,7 @@ xfs_log_force_umount(
3734 * call below. 3713 * call below.
3735 */ 3714 */
3736 if (!logerror && (mp->m_flags & XFS_MOUNT_DELAYLOG)) 3715 if (!logerror && (mp->m_flags & XFS_MOUNT_DELAYLOG))
3737 xlog_cil_push(log, 1); 3716 xlog_cil_force(log);
3738 3717
3739 /* 3718 /*
3740 * We must hold both the GRANT lock and the LOG lock, 3719 * We must hold both the GRANT lock and the LOG lock,