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.c78
1 files changed, 32 insertions, 46 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c
index 41d5b8f2bf9..3a8d4f66d70 100644
--- a/fs/xfs/xfs_log.c
+++ b/fs/xfs/xfs_log.c
@@ -871,20 +871,14 @@ xlog_space_left(
871void 871void
872xlog_iodone(xfs_buf_t *bp) 872xlog_iodone(xfs_buf_t *bp)
873{ 873{
874 xlog_in_core_t *iclog; 874 xlog_in_core_t *iclog = bp->b_fspriv;
875 xlog_t *l; 875 xlog_t *l = iclog->ic_log;
876 int aborted; 876 int aborted = 0;
877
878 iclog = XFS_BUF_FSPRIVATE(bp, xlog_in_core_t *);
879 ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long) 2);
880 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1);
881 aborted = 0;
882 l = iclog->ic_log;
883 877
884 /* 878 /*
885 * Race to shutdown the filesystem if we see an error. 879 * Race to shutdown the filesystem if we see an error.
886 */ 880 */
887 if (XFS_TEST_ERROR((XFS_BUF_GETERROR(bp)), l->l_mp, 881 if (XFS_TEST_ERROR((xfs_buf_geterror(bp)), l->l_mp,
888 XFS_ERRTAG_IODONE_IOERR, XFS_RANDOM_IODONE_IOERR)) { 882 XFS_ERRTAG_IODONE_IOERR, XFS_RANDOM_IODONE_IOERR)) {
889 xfs_ioerror_alert("xlog_iodone", l->l_mp, bp, XFS_BUF_ADDR(bp)); 883 xfs_ioerror_alert("xlog_iodone", l->l_mp, bp, XFS_BUF_ADDR(bp));
890 XFS_BUF_STALE(bp); 884 XFS_BUF_STALE(bp);
@@ -1056,10 +1050,8 @@ xlog_alloc_log(xfs_mount_t *mp,
1056 bp = xfs_buf_get_empty(log->l_iclog_size, mp->m_logdev_targp); 1050 bp = xfs_buf_get_empty(log->l_iclog_size, mp->m_logdev_targp);
1057 if (!bp) 1051 if (!bp)
1058 goto out_free_log; 1052 goto out_free_log;
1059 XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone); 1053 bp->b_iodone = xlog_iodone;
1060 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); 1054 ASSERT(xfs_buf_islocked(bp));
1061 ASSERT(XFS_BUF_ISBUSY(bp));
1062 ASSERT(XFS_BUF_VALUSEMA(bp) <= 0);
1063 log->l_xbuf = bp; 1055 log->l_xbuf = bp;
1064 1056
1065 spin_lock_init(&log->l_icloglock); 1057 spin_lock_init(&log->l_icloglock);
@@ -1090,10 +1082,8 @@ xlog_alloc_log(xfs_mount_t *mp,
1090 log->l_iclog_size, 0); 1082 log->l_iclog_size, 0);
1091 if (!bp) 1083 if (!bp)
1092 goto out_free_iclog; 1084 goto out_free_iclog;
1093 if (!XFS_BUF_CPSEMA(bp)) 1085
1094 ASSERT(0); 1086 bp->b_iodone = xlog_iodone;
1095 XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone);
1096 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1);
1097 iclog->ic_bp = bp; 1087 iclog->ic_bp = bp;
1098 iclog->ic_data = bp->b_addr; 1088 iclog->ic_data = bp->b_addr;
1099#ifdef DEBUG 1089#ifdef DEBUG
@@ -1117,8 +1107,7 @@ xlog_alloc_log(xfs_mount_t *mp,
1117 iclog->ic_callback_tail = &(iclog->ic_callback); 1107 iclog->ic_callback_tail = &(iclog->ic_callback);
1118 iclog->ic_datap = (char *)iclog->ic_data + log->l_iclog_hsize; 1108 iclog->ic_datap = (char *)iclog->ic_data + log->l_iclog_hsize;
1119 1109
1120 ASSERT(XFS_BUF_ISBUSY(iclog->ic_bp)); 1110 ASSERT(xfs_buf_islocked(iclog->ic_bp));
1121 ASSERT(XFS_BUF_VALUSEMA(iclog->ic_bp) <= 0);
1122 init_waitqueue_head(&iclog->ic_force_wait); 1111 init_waitqueue_head(&iclog->ic_force_wait);
1123 init_waitqueue_head(&iclog->ic_write_wait); 1112 init_waitqueue_head(&iclog->ic_write_wait);
1124 1113
@@ -1254,11 +1243,10 @@ STATIC int
1254xlog_bdstrat( 1243xlog_bdstrat(
1255 struct xfs_buf *bp) 1244 struct xfs_buf *bp)
1256{ 1245{
1257 struct xlog_in_core *iclog; 1246 struct xlog_in_core *iclog = bp->b_fspriv;
1258 1247
1259 iclog = XFS_BUF_FSPRIVATE(bp, xlog_in_core_t *);
1260 if (iclog->ic_state & XLOG_STATE_IOERROR) { 1248 if (iclog->ic_state & XLOG_STATE_IOERROR) {
1261 XFS_BUF_ERROR(bp, EIO); 1249 xfs_buf_ioerror(bp, EIO);
1262 XFS_BUF_STALE(bp); 1250 XFS_BUF_STALE(bp);
1263 xfs_buf_ioend(bp, 0); 1251 xfs_buf_ioend(bp, 0);
1264 /* 1252 /*
@@ -1269,7 +1257,6 @@ xlog_bdstrat(
1269 return 0; 1257 return 0;
1270 } 1258 }
1271 1259
1272 bp->b_flags |= _XBF_RUN_QUEUES;
1273 xfs_buf_iorequest(bp); 1260 xfs_buf_iorequest(bp);
1274 return 0; 1261 return 0;
1275} 1262}
@@ -1351,8 +1338,6 @@ xlog_sync(xlog_t *log,
1351 } 1338 }
1352 1339
1353 bp = iclog->ic_bp; 1340 bp = iclog->ic_bp;
1354 ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1);
1355 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2);
1356 XFS_BUF_SET_ADDR(bp, BLOCK_LSN(be64_to_cpu(iclog->ic_header.h_lsn))); 1341 XFS_BUF_SET_ADDR(bp, BLOCK_LSN(be64_to_cpu(iclog->ic_header.h_lsn)));
1357 1342
1358 XFS_STATS_ADD(xs_log_blocks, BTOBB(count)); 1343 XFS_STATS_ADD(xs_log_blocks, BTOBB(count));
@@ -1366,22 +1351,27 @@ xlog_sync(xlog_t *log,
1366 iclog->ic_bwritecnt = 1; 1351 iclog->ic_bwritecnt = 1;
1367 } 1352 }
1368 XFS_BUF_SET_COUNT(bp, count); 1353 XFS_BUF_SET_COUNT(bp, count);
1369 XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ 1354 bp->b_fspriv = iclog;
1370 XFS_BUF_ZEROFLAGS(bp); 1355 XFS_BUF_ZEROFLAGS(bp);
1371 XFS_BUF_BUSY(bp);
1372 XFS_BUF_ASYNC(bp); 1356 XFS_BUF_ASYNC(bp);
1373 bp->b_flags |= XBF_LOG_BUFFER; 1357 bp->b_flags |= XBF_SYNCIO;
1374 1358
1375 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) { 1359 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) {
1360 bp->b_flags |= XBF_FUA;
1361
1376 /* 1362 /*
1377 * If we have an external log device, flush the data device 1363 * Flush the data device before flushing the log to make
1378 * before flushing the log to make sure all meta data 1364 * sure all meta data written back from the AIL actually made
1379 * written back from the AIL actually made it to disk 1365 * it to disk before stamping the new log tail LSN into the
1380 * before writing out the new log tail LSN in the log buffer. 1366 * log buffer. For an external log we need to issue the
1367 * flush explicitly, and unfortunately synchronously here;
1368 * for an internal log we can simply use the block layer
1369 * state machine for preflushes.
1381 */ 1370 */
1382 if (log->l_mp->m_logdev_targp != log->l_mp->m_ddev_targp) 1371 if (log->l_mp->m_logdev_targp != log->l_mp->m_ddev_targp)
1383 xfs_blkdev_issue_flush(log->l_mp->m_ddev_targp); 1372 xfs_blkdev_issue_flush(log->l_mp->m_ddev_targp);
1384 XFS_BUF_ORDERED(bp); 1373 else
1374 bp->b_flags |= XBF_FLUSH;
1385 } 1375 }
1386 1376
1387 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); 1377 ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1);
@@ -1404,20 +1394,16 @@ xlog_sync(xlog_t *log,
1404 } 1394 }
1405 if (split) { 1395 if (split) {
1406 bp = iclog->ic_log->l_xbuf; 1396 bp = iclog->ic_log->l_xbuf;
1407 ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) ==
1408 (unsigned long)1);
1409 XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2);
1410 XFS_BUF_SET_ADDR(bp, 0); /* logical 0 */ 1397 XFS_BUF_SET_ADDR(bp, 0); /* logical 0 */
1411 XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ 1398 xfs_buf_associate_memory(bp,
1412 (__psint_t)count), split); 1399 (char *)&iclog->ic_header + count, split);
1413 XFS_BUF_SET_FSPRIVATE(bp, iclog); 1400 bp->b_fspriv = iclog;
1414 XFS_BUF_ZEROFLAGS(bp); 1401 XFS_BUF_ZEROFLAGS(bp);
1415 XFS_BUF_BUSY(bp);
1416 XFS_BUF_ASYNC(bp); 1402 XFS_BUF_ASYNC(bp);
1417 bp->b_flags |= XBF_LOG_BUFFER; 1403 bp->b_flags |= XBF_SYNCIO;
1418 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) 1404 if (log->l_mp->m_flags & XFS_MOUNT_BARRIER)
1419 XFS_BUF_ORDERED(bp); 1405 bp->b_flags |= XBF_FUA;
1420 dptr = XFS_BUF_PTR(bp); 1406 dptr = bp->b_addr;
1421 /* 1407 /*
1422 * Bump the cycle numbers at the start of each block 1408 * Bump the cycle numbers at the start of each block
1423 * since this part of the buffer is at the start of 1409 * since this part of the buffer is at the start of
@@ -3521,13 +3507,13 @@ xlog_verify_iclog(xlog_t *log,
3521 spin_unlock(&log->l_icloglock); 3507 spin_unlock(&log->l_icloglock);
3522 3508
3523 /* check log magic numbers */ 3509 /* check log magic numbers */
3524 if (be32_to_cpu(iclog->ic_header.h_magicno) != XLOG_HEADER_MAGIC_NUM) 3510 if (iclog->ic_header.h_magicno != cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3525 xfs_emerg(log->l_mp, "%s: invalid magic num", __func__); 3511 xfs_emerg(log->l_mp, "%s: invalid magic num", __func__);
3526 3512
3527 ptr = (xfs_caddr_t) &iclog->ic_header; 3513 ptr = (xfs_caddr_t) &iclog->ic_header;
3528 for (ptr += BBSIZE; ptr < ((xfs_caddr_t)&iclog->ic_header) + count; 3514 for (ptr += BBSIZE; ptr < ((xfs_caddr_t)&iclog->ic_header) + count;
3529 ptr += BBSIZE) { 3515 ptr += BBSIZE) {
3530 if (be32_to_cpu(*(__be32 *)ptr) == XLOG_HEADER_MAGIC_NUM) 3516 if (*(__be32 *)ptr == cpu_to_be32(XLOG_HEADER_MAGIC_NUM))
3531 xfs_emerg(log->l_mp, "%s: unexpected magic num", 3517 xfs_emerg(log->l_mp, "%s: unexpected magic num",
3532 __func__); 3518 __func__);
3533 } 3519 }