diff options
| -rw-r--r-- | fs/xfs/xfs_log.c | 39 |
1 files changed, 36 insertions, 3 deletions
diff --git a/fs/xfs/xfs_log.c b/fs/xfs/xfs_log.c index 0b02c6443551..3608a0f0a5f6 100644 --- a/fs/xfs/xfs_log.c +++ b/fs/xfs/xfs_log.c | |||
| @@ -563,6 +563,11 @@ xfs_log_mount( | |||
| 563 | } | 563 | } |
| 564 | 564 | ||
| 565 | mp->m_log = xlog_alloc_log(mp, log_target, blk_offset, num_bblks); | 565 | mp->m_log = xlog_alloc_log(mp, log_target, blk_offset, num_bblks); |
| 566 | if (!mp->m_log) { | ||
| 567 | cmn_err(CE_WARN, "XFS: Log allocation failed: No memory!"); | ||
| 568 | error = ENOMEM; | ||
| 569 | goto out; | ||
| 570 | } | ||
| 566 | 571 | ||
| 567 | /* | 572 | /* |
| 568 | * Initialize the AIL now we have a log. | 573 | * Initialize the AIL now we have a log. |
| @@ -601,6 +606,7 @@ xfs_log_mount( | |||
| 601 | return 0; | 606 | return 0; |
| 602 | error: | 607 | error: |
| 603 | xfs_log_unmount_dealloc(mp); | 608 | xfs_log_unmount_dealloc(mp); |
| 609 | out: | ||
| 604 | return error; | 610 | return error; |
| 605 | } /* xfs_log_mount */ | 611 | } /* xfs_log_mount */ |
| 606 | 612 | ||
| @@ -1217,7 +1223,9 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
| 1217 | int i; | 1223 | int i; |
| 1218 | int iclogsize; | 1224 | int iclogsize; |
| 1219 | 1225 | ||
| 1220 | log = (xlog_t *)kmem_zalloc(sizeof(xlog_t), KM_SLEEP); | 1226 | log = kmem_zalloc(sizeof(xlog_t), KM_MAYFAIL); |
| 1227 | if (!log) | ||
| 1228 | return NULL; | ||
| 1221 | 1229 | ||
| 1222 | log->l_mp = mp; | 1230 | log->l_mp = mp; |
| 1223 | log->l_targ = log_target; | 1231 | log->l_targ = log_target; |
| @@ -1249,6 +1257,8 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
| 1249 | xlog_get_iclog_buffer_size(mp, log); | 1257 | xlog_get_iclog_buffer_size(mp, log); |
| 1250 | 1258 | ||
| 1251 | bp = xfs_buf_get_empty(log->l_iclog_size, mp->m_logdev_targp); | 1259 | bp = xfs_buf_get_empty(log->l_iclog_size, mp->m_logdev_targp); |
| 1260 | if (!bp) | ||
| 1261 | goto out_free_log; | ||
| 1252 | XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone); | 1262 | XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone); |
| 1253 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xlog_bdstrat_cb); | 1263 | XFS_BUF_SET_BDSTRAT_FUNC(bp, xlog_bdstrat_cb); |
| 1254 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); | 1264 | XFS_BUF_SET_FSPRIVATE2(bp, (unsigned long)1); |
| @@ -1275,13 +1285,17 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
| 1275 | iclogsize = log->l_iclog_size; | 1285 | iclogsize = log->l_iclog_size; |
| 1276 | ASSERT(log->l_iclog_size >= 4096); | 1286 | ASSERT(log->l_iclog_size >= 4096); |
| 1277 | for (i=0; i < log->l_iclog_bufs; i++) { | 1287 | for (i=0; i < log->l_iclog_bufs; i++) { |
| 1278 | *iclogp = (xlog_in_core_t *) | 1288 | *iclogp = kmem_zalloc(sizeof(xlog_in_core_t), KM_MAYFAIL); |
| 1279 | kmem_zalloc(sizeof(xlog_in_core_t), KM_SLEEP); | 1289 | if (!*iclogp) |
| 1290 | goto out_free_iclog; | ||
| 1291 | |||
| 1280 | iclog = *iclogp; | 1292 | iclog = *iclogp; |
| 1281 | iclog->ic_prev = prev_iclog; | 1293 | iclog->ic_prev = prev_iclog; |
| 1282 | prev_iclog = iclog; | 1294 | prev_iclog = iclog; |
| 1283 | 1295 | ||
| 1284 | bp = xfs_buf_get_noaddr(log->l_iclog_size, mp->m_logdev_targp); | 1296 | bp = xfs_buf_get_noaddr(log->l_iclog_size, mp->m_logdev_targp); |
| 1297 | if (!bp) | ||
| 1298 | goto out_free_iclog; | ||
| 1285 | if (!XFS_BUF_CPSEMA(bp)) | 1299 | if (!XFS_BUF_CPSEMA(bp)) |
| 1286 | ASSERT(0); | 1300 | ASSERT(0); |
| 1287 | XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone); | 1301 | XFS_BUF_SET_IODONE_FUNC(bp, xlog_iodone); |
| @@ -1323,6 +1337,25 @@ xlog_alloc_log(xfs_mount_t *mp, | |||
| 1323 | log->l_iclog->ic_prev = prev_iclog; /* re-write 1st prev ptr */ | 1337 | log->l_iclog->ic_prev = prev_iclog; /* re-write 1st prev ptr */ |
| 1324 | 1338 | ||
| 1325 | return log; | 1339 | return log; |
| 1340 | |||
| 1341 | out_free_iclog: | ||
| 1342 | for (iclog = log->l_iclog; iclog; iclog = prev_iclog) { | ||
| 1343 | prev_iclog = iclog->ic_next; | ||
| 1344 | if (iclog->ic_bp) { | ||
| 1345 | sv_destroy(&iclog->ic_force_wait); | ||
| 1346 | sv_destroy(&iclog->ic_write_wait); | ||
| 1347 | xfs_buf_free(iclog->ic_bp); | ||
| 1348 | xlog_trace_iclog_dealloc(iclog); | ||
| 1349 | } | ||
| 1350 | kmem_free(iclog); | ||
| 1351 | } | ||
| 1352 | spinlock_destroy(&log->l_icloglock); | ||
| 1353 | spinlock_destroy(&log->l_grant_lock); | ||
| 1354 | xlog_trace_loggrant_dealloc(log); | ||
| 1355 | xfs_buf_free(log->l_xbuf); | ||
| 1356 | out_free_log: | ||
| 1357 | kmem_free(log); | ||
| 1358 | return NULL; | ||
| 1326 | } /* xlog_alloc_log */ | 1359 | } /* xlog_alloc_log */ |
| 1327 | 1360 | ||
| 1328 | 1361 | ||
