diff options
Diffstat (limited to 'fs/xfs/xfs_log.c')
-rw-r--r-- | fs/xfs/xfs_log.c | 78 |
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( | |||
871 | void | 871 | void |
872 | xlog_iodone(xfs_buf_t *bp) | 872 | xlog_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 | |||
1254 | xlog_bdstrat( | 1243 | xlog_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 | } |