diff options
Diffstat (limited to 'fs/xfs/xfs_log.c')
| -rw-r--r-- | fs/xfs/xfs_log.c | 35 |
1 files changed, 22 insertions, 13 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index d8f5d4cbe8b7..c48bf61f17bd 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
| @@ -617,7 +617,8 @@ xfs_log_unmount_write(xfs_mount_t *mp) | |||
| 617 | reg[0].i_len = sizeof(magic); | 617 | reg[0].i_len = sizeof(magic); |
| 618 | XLOG_VEC_SET_TYPE(®[0], XLOG_REG_TYPE_UNMOUNT); | 618 | XLOG_VEC_SET_TYPE(®[0], XLOG_REG_TYPE_UNMOUNT); |
| 619 | 619 | ||
| 620 | error = xfs_log_reserve(mp, 600, 1, &tic, XFS_LOG, 0, 0); | 620 | error = xfs_log_reserve(mp, 600, 1, &tic, |
| 621 | XFS_LOG, 0, XLOG_UNMOUNT_REC_TYPE); | ||
| 621 | if (!error) { | 622 | if (!error) { |
| 622 | /* remove inited flag */ | 623 | /* remove inited flag */ |
| 623 | ((xlog_ticket_t *)tic)->t_flags = 0; | 624 | ((xlog_ticket_t *)tic)->t_flags = 0; |
| @@ -655,8 +656,11 @@ xfs_log_unmount_write(xfs_mount_t *mp) | |||
| 655 | } else { | 656 | } else { |
| 656 | LOG_UNLOCK(log, s); | 657 | LOG_UNLOCK(log, s); |
| 657 | } | 658 | } |
| 658 | if (tic) | 659 | if (tic) { |
| 660 | xlog_trace_loggrant(log, tic, "unmount rec"); | ||
| 661 | xlog_ungrant_log_space(log, tic); | ||
| 659 | xlog_state_put_ticket(log, tic); | 662 | xlog_state_put_ticket(log, tic); |
| 663 | } | ||
| 660 | } else { | 664 | } else { |
| 661 | /* | 665 | /* |
| 662 | * We're already in forced_shutdown mode, couldn't | 666 | * We're already in forced_shutdown mode, couldn't |
| @@ -1196,7 +1200,7 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
| 1196 | kmem_zalloc(sizeof(xlog_in_core_t), KM_SLEEP); | 1200 | kmem_zalloc(sizeof(xlog_in_core_t), KM_SLEEP); |
| 1197 | iclog = *iclogp; | 1201 | iclog = *iclogp; |
| 1198 | iclog->hic_data = (xlog_in_core_2_t *) | 1202 | iclog->hic_data = (xlog_in_core_2_t *) |
| 1199 | kmem_zalloc(iclogsize, KM_SLEEP); | 1203 | kmem_zalloc(iclogsize, KM_SLEEP | KM_LARGE); |
| 1200 | 1204 | ||
| 1201 | iclog->ic_prev = prev_iclog; | 1205 | iclog->ic_prev = prev_iclog; |
| 1202 | prev_iclog = iclog; | 1206 | prev_iclog = iclog; |
| @@ -1413,7 +1417,7 @@ xlog_sync(xlog_t *log, | |||
| 1413 | ops = iclog->ic_header.h_num_logops; | 1417 | ops = iclog->ic_header.h_num_logops; |
| 1414 | INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); | 1418 | INT_SET(iclog->ic_header.h_num_logops, ARCH_CONVERT, ops); |
| 1415 | 1419 | ||
| 1416 | bp = iclog->ic_bp; | 1420 | bp = iclog->ic_bp; |
| 1417 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); | 1421 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == (unsigned long)1); |
| 1418 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); | 1422 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); |
| 1419 | XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); | 1423 | XFS_BUF_SET_ADDR(bp, BLOCK_LSN(INT_GET(iclog->ic_header.h_lsn, ARCH_CONVERT))); |
| @@ -1430,15 +1434,14 @@ xlog_sync(xlog_t *log, | |||
| 1430 | } | 1434 | } |
| 1431 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); | 1435 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); |
| 1432 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ | 1436 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ |
| 1437 | XFS_BUF_ZEROFLAGS(bp); | ||
| 1433 | XFS_BUF_BUSY(bp); | 1438 | XFS_BUF_BUSY(bp); |
| 1434 | XFS_BUF_ASYNC(bp); | 1439 | XFS_BUF_ASYNC(bp); |
| 1435 | /* | 1440 | /* |
| 1436 | * Do an ordered write for the log block. | 1441 | * Do an ordered write for the log block. |
| 1437 | * | 1442 | * Its unnecessary to flush the first split block in the log wrap case. |
| 1438 | * It may not be needed to flush the first split block in the log wrap | ||
| 1439 | * case, but do it anyways to be safe -AK | ||
| 1440 | */ | 1443 | */ |
| 1441 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) | 1444 | if (!split && (log->l_mp->m_flags & XFS_MOUNT_BARRIER)) |
| 1442 | XFS_BUF_ORDERED(bp); | 1445 | XFS_BUF_ORDERED(bp); |
| 1443 | 1446 | ||
| 1444 | ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); | 1447 | ASSERT(XFS_BUF_ADDR(bp) <= log->l_logBBsize-1); |
| @@ -1460,7 +1463,7 @@ xlog_sync(xlog_t *log, | |||
| 1460 | return error; | 1463 | return error; |
| 1461 | } | 1464 | } |
| 1462 | if (split) { | 1465 | if (split) { |
| 1463 | bp = iclog->ic_log->l_xbuf; | 1466 | bp = iclog->ic_log->l_xbuf; |
| 1464 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == | 1467 | ASSERT(XFS_BUF_FSPRIVATE2(bp, unsigned long) == |
| 1465 | (unsigned long)1); | 1468 | (unsigned long)1); |
| 1466 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); | 1469 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)2); |
| @@ -1468,6 +1471,7 @@ xlog_sync(xlog_t *log, | |||
| 1468 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ | 1471 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t)((__psint_t)&(iclog->ic_header)+ |
| 1469 | (__psint_t)count), split); | 1472 | (__psint_t)count), split); |
| 1470 | XFS_BUF_SET_FSPRIVATE(bp, iclog); | 1473 | XFS_BUF_SET_FSPRIVATE(bp, iclog); |
| 1474 | XFS_BUF_ZEROFLAGS(bp); | ||
| 1471 | XFS_BUF_BUSY(bp); | 1475 | XFS_BUF_BUSY(bp); |
| 1472 | XFS_BUF_ASYNC(bp); | 1476 | XFS_BUF_ASYNC(bp); |
| 1473 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) | 1477 | if (log->l_mp->m_flags & XFS_MOUNT_BARRIER) |
| @@ -1740,10 +1744,10 @@ xlog_write(xfs_mount_t * mp, | |||
| 1740 | xlog_in_core_t **commit_iclog, | 1744 | xlog_in_core_t **commit_iclog, |
| 1741 | uint flags) | 1745 | uint flags) |
| 1742 | { | 1746 | { |
| 1743 | xlog_t *log = mp->m_log; | 1747 | xlog_t *log = mp->m_log; |
| 1744 | xlog_ticket_t *ticket = (xlog_ticket_t *)tic; | 1748 | xlog_ticket_t *ticket = (xlog_ticket_t *)tic; |
| 1749 | xlog_in_core_t *iclog = NULL; /* ptr to current in-core log */ | ||
| 1745 | xlog_op_header_t *logop_head; /* ptr to log operation header */ | 1750 | xlog_op_header_t *logop_head; /* ptr to log operation header */ |
| 1746 | xlog_in_core_t *iclog; /* ptr to current in-core log */ | ||
| 1747 | __psint_t ptr; /* copy address into data region */ | 1751 | __psint_t ptr; /* copy address into data region */ |
| 1748 | int len; /* # xlog_write() bytes 2 still copy */ | 1752 | int len; /* # xlog_write() bytes 2 still copy */ |
| 1749 | int index; /* region index currently copying */ | 1753 | int index; /* region index currently copying */ |
| @@ -2212,9 +2216,13 @@ xlog_state_do_callback( | |||
| 2212 | 2216 | ||
| 2213 | iclog = iclog->ic_next; | 2217 | iclog = iclog->ic_next; |
| 2214 | } while (first_iclog != iclog); | 2218 | } while (first_iclog != iclog); |
| 2215 | if (repeats && (repeats % 10) == 0) { | 2219 | |
| 2220 | if (repeats > 5000) { | ||
| 2221 | flushcnt += repeats; | ||
| 2222 | repeats = 0; | ||
| 2216 | xfs_fs_cmn_err(CE_WARN, log->l_mp, | 2223 | xfs_fs_cmn_err(CE_WARN, log->l_mp, |
| 2217 | "xlog_state_do_callback: looping %d", repeats); | 2224 | "%s: possible infinite loop (%d iterations)", |
| 2225 | __FUNCTION__, flushcnt); | ||
| 2218 | } | 2226 | } |
| 2219 | } while (!ioerrors && loopdidcallbacks); | 2227 | } while (!ioerrors && loopdidcallbacks); |
| 2220 | 2228 | ||
| @@ -2246,6 +2254,7 @@ xlog_state_do_callback( | |||
| 2246 | } | 2254 | } |
| 2247 | #endif | 2255 | #endif |
| 2248 | 2256 | ||
| 2257 | flushcnt = 0; | ||
| 2249 | if (log->l_iclog->ic_state & (XLOG_STATE_ACTIVE|XLOG_STATE_IOERROR)) { | 2258 | if (log->l_iclog->ic_state & (XLOG_STATE_ACTIVE|XLOG_STATE_IOERROR)) { |
| 2250 | flushcnt = log->l_flushcnt; | 2259 | flushcnt = log->l_flushcnt; |
| 2251 | log->l_flushcnt = 0; | 2260 | log->l_flushcnt = 0; |
