diff options
Diffstat (limited to 'fs/xfs/xfs_log.c')
-rw-r--r-- | fs/xfs/xfs_log.c | 41 |
1 files changed, 21 insertions, 20 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index c48bf61f17bd..9d4c4fbeb3ee 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
@@ -817,10 +817,8 @@ xfs_log_need_covered(xfs_mount_t *mp) | |||
817 | SPLDECL(s); | 817 | SPLDECL(s); |
818 | int needed = 0, gen; | 818 | int needed = 0, gen; |
819 | xlog_t *log = mp->m_log; | 819 | xlog_t *log = mp->m_log; |
820 | bhv_vfs_t *vfsp = XFS_MTOVFS(mp); | ||
821 | 820 | ||
822 | if (vfs_test_for_freeze(vfsp) || XFS_FORCED_SHUTDOWN(mp) || | 821 | if (!xfs_fs_writable(mp)) |
823 | (vfsp->vfs_flag & VFS_RDONLY)) | ||
824 | return 0; | 822 | return 0; |
825 | 823 | ||
826 | s = LOG_LOCK(log); | 824 | s = LOG_LOCK(log); |
@@ -967,14 +965,16 @@ xlog_iodone(xfs_buf_t *bp) | |||
967 | } else if (iclog->ic_state & XLOG_STATE_IOERROR) { | 965 | } else if (iclog->ic_state & XLOG_STATE_IOERROR) { |
968 | aborted = XFS_LI_ABORTED; | 966 | aborted = XFS_LI_ABORTED; |
969 | } | 967 | } |
968 | |||
969 | /* log I/O is always issued ASYNC */ | ||
970 | ASSERT(XFS_BUF_ISASYNC(bp)); | ||
970 | xlog_state_done_syncing(iclog, aborted); | 971 | xlog_state_done_syncing(iclog, aborted); |
971 | if (!(XFS_BUF_ISASYNC(bp))) { | 972 | /* |
972 | /* | 973 | * do not reference the buffer (bp) here as we could race |
973 | * Corresponding psema() will be done in bwrite(). If we don't | 974 | * with it being freed after writing the unmount record to the |
974 | * vsema() here, panic. | 975 | * log. |
975 | */ | 976 | */ |
976 | XFS_BUF_V_IODONESEMA(bp); | 977 | |
977 | } | ||
978 | } /* xlog_iodone */ | 978 | } /* xlog_iodone */ |
979 | 979 | ||
980 | /* | 980 | /* |
@@ -1199,11 +1199,18 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
1199 | *iclogp = (xlog_in_core_t *) | 1199 | *iclogp = (xlog_in_core_t *) |
1200 | kmem_zalloc(sizeof(xlog_in_core_t), KM_SLEEP); | 1200 | kmem_zalloc(sizeof(xlog_in_core_t), KM_SLEEP); |
1201 | iclog = *iclogp; | 1201 | iclog = *iclogp; |
1202 | iclog->hic_data = (xlog_in_core_2_t *) | ||
1203 | kmem_zalloc(iclogsize, KM_SLEEP | KM_LARGE); | ||
1204 | |||
1205 | iclog->ic_prev = prev_iclog; | 1202 | iclog->ic_prev = prev_iclog; |
1206 | prev_iclog = iclog; | 1203 | prev_iclog = iclog; |
1204 | |||
1205 | bp = xfs_buf_get_noaddr(log->l_iclog_size, mp->m_logdev_targp); | ||
1206 | if (!XFS_BUF_CPSEMA(bp)) | ||
1207 | ASSERT(0); | ||
1208 | XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone); | ||
1209 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xlog_bdstrat_cb); | ||
1210 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); | ||
1211 | iclog->ic_bp = bp; | ||
1212 | iclog->hic_data = bp->b_addr; | ||
1213 | |||
1207 | log->l_iclog_bak[i] = (xfs_caddr_t)&(iclog->ic_header); | 1214 | log->l_iclog_bak[i] = (xfs_caddr_t)&(iclog->ic_header); |
1208 | 1215 | ||
1209 | head = &iclog->ic_header; | 1216 | head = &iclog->ic_header; |
@@ -1216,11 +1223,6 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
1216 | INT_SET(head->h_fmt, ARCH_CONVERT, XLOG_FMT); | 1223 | INT_SET(head->h_fmt, ARCH_CONVERT, XLOG_FMT); |
1217 | memcpy(&head->h_fs_uuid, &mp->m_sb.sb_uuid, sizeof(uuid_t)); | 1224 | memcpy(&head->h_fs_uuid, &mp->m_sb.sb_uuid, sizeof(uuid_t)); |
1218 | 1225 | ||
1219 | bp = xfs_buf_get_empty(log->l_iclog_size, mp->m_logdev_targp); | ||
1220 | XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone); | ||
1221 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xlog_bdstrat_cb); | ||
1222 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); | ||
1223 | iclog->ic_bp = bp; | ||
1224 | 1226 | ||
1225 | iclog->ic_size = XFS_BUF_SIZE(bp) - log->l_iclog_hsize; | 1227 | iclog->ic_size = XFS_BUF_SIZE(bp) - log->l_iclog_hsize; |
1226 | iclog->ic_state = XLOG_STATE_ACTIVE; | 1228 | iclog->ic_state = XLOG_STATE_ACTIVE; |
@@ -1432,7 +1434,7 @@ xlog_sync(xlog_t *log, | |||
1432 | } else { | 1434 | } else { |
1433 | iclog->ic_bwritecnt = 1; | 1435 | iclog->ic_bwritecnt = 1; |
1434 | } | 1436 | } |
1435 | XFS_BUF_SET_PTR(bp, (xfs_caddr_t) &(iclog->ic_header), count); | 1437 | XFS_BUF_SET_COUNT(bp, count); |
1436 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ | 1438 | XFS_BUF_SET_FSPRIVATE(bp, iclog); /* save for later */ |
1437 | XFS_BUF_ZEROFLAGS(bp); | 1439 | XFS_BUF_ZEROFLAGS(bp); |
1438 | XFS_BUF_BUSY(bp); | 1440 | XFS_BUF_BUSY(bp); |
@@ -1528,7 +1530,6 @@ xlog_dealloc_log(xlog_t *log) | |||
1528 | } | 1530 | } |
1529 | #endif | 1531 | #endif |
1530 | next_iclog = iclog->ic_next; | 1532 | next_iclog = iclog->ic_next; |
1531 | kmem_free(iclog->hic_data, log->l_iclog_size); | ||
1532 | kmem_free(iclog, sizeof(xlog_in_core_t)); | 1533 | kmem_free(iclog, sizeof(xlog_in_core_t)); |
1533 | iclog = next_iclog; | 1534 | iclog = next_iclog; |
1534 | } | 1535 | } |