diff options
Diffstat (limited to 'fs/xfs/xfs_buf_item.c')
-rw-r--r-- | fs/xfs/xfs_buf_item.c | 221 |
1 files changed, 108 insertions, 113 deletions
diff --git a/fs/xfs/xfs_buf_item.c b/fs/xfs/xfs_buf_item.c index f3c49e69eab9..02a80984aa05 100644 --- a/fs/xfs/xfs_buf_item.c +++ b/fs/xfs/xfs_buf_item.c | |||
@@ -64,7 +64,7 @@ xfs_buf_item_log_debug( | |||
64 | nbytes = last - first + 1; | 64 | nbytes = last - first + 1; |
65 | bfset(bip->bli_logged, first, nbytes); | 65 | bfset(bip->bli_logged, first, nbytes); |
66 | for (x = 0; x < nbytes; x++) { | 66 | for (x = 0; x < nbytes; x++) { |
67 | chunk_num = byte >> XFS_BLI_SHIFT; | 67 | chunk_num = byte >> XFS_BLF_SHIFT; |
68 | word_num = chunk_num >> BIT_TO_WORD_SHIFT; | 68 | word_num = chunk_num >> BIT_TO_WORD_SHIFT; |
69 | bit_num = chunk_num & (NBWORD - 1); | 69 | bit_num = chunk_num & (NBWORD - 1); |
70 | wordp = &(bip->bli_format.blf_data_map[word_num]); | 70 | wordp = &(bip->bli_format.blf_data_map[word_num]); |
@@ -166,7 +166,7 @@ xfs_buf_item_size( | |||
166 | * cancel flag in it. | 166 | * cancel flag in it. |
167 | */ | 167 | */ |
168 | trace_xfs_buf_item_size_stale(bip); | 168 | trace_xfs_buf_item_size_stale(bip); |
169 | ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); | 169 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); |
170 | return 1; | 170 | return 1; |
171 | } | 171 | } |
172 | 172 | ||
@@ -197,9 +197,9 @@ xfs_buf_item_size( | |||
197 | } else if (next_bit != last_bit + 1) { | 197 | } else if (next_bit != last_bit + 1) { |
198 | last_bit = next_bit; | 198 | last_bit = next_bit; |
199 | nvecs++; | 199 | nvecs++; |
200 | } else if (xfs_buf_offset(bp, next_bit * XFS_BLI_CHUNK) != | 200 | } else if (xfs_buf_offset(bp, next_bit * XFS_BLF_CHUNK) != |
201 | (xfs_buf_offset(bp, last_bit * XFS_BLI_CHUNK) + | 201 | (xfs_buf_offset(bp, last_bit * XFS_BLF_CHUNK) + |
202 | XFS_BLI_CHUNK)) { | 202 | XFS_BLF_CHUNK)) { |
203 | last_bit = next_bit; | 203 | last_bit = next_bit; |
204 | nvecs++; | 204 | nvecs++; |
205 | } else { | 205 | } else { |
@@ -254,6 +254,20 @@ xfs_buf_item_format( | |||
254 | vecp++; | 254 | vecp++; |
255 | nvecs = 1; | 255 | nvecs = 1; |
256 | 256 | ||
257 | /* | ||
258 | * If it is an inode buffer, transfer the in-memory state to the | ||
259 | * format flags and clear the in-memory state. We do not transfer | ||
260 | * this state if the inode buffer allocation has not yet been committed | ||
261 | * to the log as setting the XFS_BLI_INODE_BUF flag will prevent | ||
262 | * correct replay of the inode allocation. | ||
263 | */ | ||
264 | if (bip->bli_flags & XFS_BLI_INODE_BUF) { | ||
265 | if (!((bip->bli_flags & XFS_BLI_INODE_ALLOC_BUF) && | ||
266 | xfs_log_item_in_current_chkpt(&bip->bli_item))) | ||
267 | bip->bli_format.blf_flags |= XFS_BLF_INODE_BUF; | ||
268 | bip->bli_flags &= ~XFS_BLI_INODE_BUF; | ||
269 | } | ||
270 | |||
257 | if (bip->bli_flags & XFS_BLI_STALE) { | 271 | if (bip->bli_flags & XFS_BLI_STALE) { |
258 | /* | 272 | /* |
259 | * The buffer is stale, so all we need to log | 273 | * The buffer is stale, so all we need to log |
@@ -261,7 +275,7 @@ xfs_buf_item_format( | |||
261 | * cancel flag in it. | 275 | * cancel flag in it. |
262 | */ | 276 | */ |
263 | trace_xfs_buf_item_format_stale(bip); | 277 | trace_xfs_buf_item_format_stale(bip); |
264 | ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); | 278 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); |
265 | bip->bli_format.blf_size = nvecs; | 279 | bip->bli_format.blf_size = nvecs; |
266 | return; | 280 | return; |
267 | } | 281 | } |
@@ -294,28 +308,28 @@ xfs_buf_item_format( | |||
294 | * keep counting and scanning. | 308 | * keep counting and scanning. |
295 | */ | 309 | */ |
296 | if (next_bit == -1) { | 310 | if (next_bit == -1) { |
297 | buffer_offset = first_bit * XFS_BLI_CHUNK; | 311 | buffer_offset = first_bit * XFS_BLF_CHUNK; |
298 | vecp->i_addr = xfs_buf_offset(bp, buffer_offset); | 312 | vecp->i_addr = xfs_buf_offset(bp, buffer_offset); |
299 | vecp->i_len = nbits * XFS_BLI_CHUNK; | 313 | vecp->i_len = nbits * XFS_BLF_CHUNK; |
300 | vecp->i_type = XLOG_REG_TYPE_BCHUNK; | 314 | vecp->i_type = XLOG_REG_TYPE_BCHUNK; |
301 | nvecs++; | 315 | nvecs++; |
302 | break; | 316 | break; |
303 | } else if (next_bit != last_bit + 1) { | 317 | } else if (next_bit != last_bit + 1) { |
304 | buffer_offset = first_bit * XFS_BLI_CHUNK; | 318 | buffer_offset = first_bit * XFS_BLF_CHUNK; |
305 | vecp->i_addr = xfs_buf_offset(bp, buffer_offset); | 319 | vecp->i_addr = xfs_buf_offset(bp, buffer_offset); |
306 | vecp->i_len = nbits * XFS_BLI_CHUNK; | 320 | vecp->i_len = nbits * XFS_BLF_CHUNK; |
307 | vecp->i_type = XLOG_REG_TYPE_BCHUNK; | 321 | vecp->i_type = XLOG_REG_TYPE_BCHUNK; |
308 | nvecs++; | 322 | nvecs++; |
309 | vecp++; | 323 | vecp++; |
310 | first_bit = next_bit; | 324 | first_bit = next_bit; |
311 | last_bit = next_bit; | 325 | last_bit = next_bit; |
312 | nbits = 1; | 326 | nbits = 1; |
313 | } else if (xfs_buf_offset(bp, next_bit << XFS_BLI_SHIFT) != | 327 | } else if (xfs_buf_offset(bp, next_bit << XFS_BLF_SHIFT) != |
314 | (xfs_buf_offset(bp, last_bit << XFS_BLI_SHIFT) + | 328 | (xfs_buf_offset(bp, last_bit << XFS_BLF_SHIFT) + |
315 | XFS_BLI_CHUNK)) { | 329 | XFS_BLF_CHUNK)) { |
316 | buffer_offset = first_bit * XFS_BLI_CHUNK; | 330 | buffer_offset = first_bit * XFS_BLF_CHUNK; |
317 | vecp->i_addr = xfs_buf_offset(bp, buffer_offset); | 331 | vecp->i_addr = xfs_buf_offset(bp, buffer_offset); |
318 | vecp->i_len = nbits * XFS_BLI_CHUNK; | 332 | vecp->i_len = nbits * XFS_BLF_CHUNK; |
319 | vecp->i_type = XLOG_REG_TYPE_BCHUNK; | 333 | vecp->i_type = XLOG_REG_TYPE_BCHUNK; |
320 | /* You would think we need to bump the nvecs here too, but we do not | 334 | /* You would think we need to bump the nvecs here too, but we do not |
321 | * this number is used by recovery, and it gets confused by the boundary | 335 | * this number is used by recovery, and it gets confused by the boundary |
@@ -341,10 +355,15 @@ xfs_buf_item_format( | |||
341 | } | 355 | } |
342 | 356 | ||
343 | /* | 357 | /* |
344 | * This is called to pin the buffer associated with the buf log | 358 | * This is called to pin the buffer associated with the buf log item in memory |
345 | * item in memory so it cannot be written out. Simply call bpin() | 359 | * so it cannot be written out. Simply call bpin() on the buffer to do this. |
346 | * on the buffer to do this. | 360 | * |
361 | * We also always take a reference to the buffer log item here so that the bli | ||
362 | * is held while the item is pinned in memory. This means that we can | ||
363 | * unconditionally drop the reference count a transaction holds when the | ||
364 | * transaction is completed. | ||
347 | */ | 365 | */ |
366 | |||
348 | STATIC void | 367 | STATIC void |
349 | xfs_buf_item_pin( | 368 | xfs_buf_item_pin( |
350 | xfs_buf_log_item_t *bip) | 369 | xfs_buf_log_item_t *bip) |
@@ -356,6 +375,7 @@ xfs_buf_item_pin( | |||
356 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 375 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
357 | ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || | 376 | ASSERT((bip->bli_flags & XFS_BLI_LOGGED) || |
358 | (bip->bli_flags & XFS_BLI_STALE)); | 377 | (bip->bli_flags & XFS_BLI_STALE)); |
378 | atomic_inc(&bip->bli_refcount); | ||
359 | trace_xfs_buf_item_pin(bip); | 379 | trace_xfs_buf_item_pin(bip); |
360 | xfs_bpin(bp); | 380 | xfs_bpin(bp); |
361 | } | 381 | } |
@@ -372,12 +392,12 @@ xfs_buf_item_pin( | |||
372 | */ | 392 | */ |
373 | STATIC void | 393 | STATIC void |
374 | xfs_buf_item_unpin( | 394 | xfs_buf_item_unpin( |
375 | xfs_buf_log_item_t *bip, | 395 | xfs_buf_log_item_t *bip) |
376 | int stale) | ||
377 | { | 396 | { |
378 | struct xfs_ail *ailp; | 397 | struct xfs_ail *ailp; |
379 | xfs_buf_t *bp; | 398 | xfs_buf_t *bp; |
380 | int freed; | 399 | int freed; |
400 | int stale = bip->bli_flags & XFS_BLI_STALE; | ||
381 | 401 | ||
382 | bp = bip->bli_buf; | 402 | bp = bip->bli_buf; |
383 | ASSERT(bp != NULL); | 403 | ASSERT(bp != NULL); |
@@ -393,7 +413,7 @@ xfs_buf_item_unpin( | |||
393 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); | 413 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); |
394 | ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); | 414 | ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); |
395 | ASSERT(XFS_BUF_ISSTALE(bp)); | 415 | ASSERT(XFS_BUF_ISSTALE(bp)); |
396 | ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); | 416 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); |
397 | trace_xfs_buf_item_unpin_stale(bip); | 417 | trace_xfs_buf_item_unpin_stale(bip); |
398 | 418 | ||
399 | /* | 419 | /* |
@@ -428,40 +448,34 @@ xfs_buf_item_unpin_remove( | |||
428 | xfs_buf_log_item_t *bip, | 448 | xfs_buf_log_item_t *bip, |
429 | xfs_trans_t *tp) | 449 | xfs_trans_t *tp) |
430 | { | 450 | { |
431 | xfs_buf_t *bp; | 451 | /* will xfs_buf_item_unpin() call xfs_buf_item_relse()? */ |
432 | xfs_log_item_desc_t *lidp; | ||
433 | int stale = 0; | ||
434 | |||
435 | bp = bip->bli_buf; | ||
436 | /* | ||
437 | * will xfs_buf_item_unpin() call xfs_buf_item_relse()? | ||
438 | */ | ||
439 | if ((atomic_read(&bip->bli_refcount) == 1) && | 452 | if ((atomic_read(&bip->bli_refcount) == 1) && |
440 | (bip->bli_flags & XFS_BLI_STALE)) { | 453 | (bip->bli_flags & XFS_BLI_STALE)) { |
454 | /* | ||
455 | * yes -- We can safely do some work here and then call | ||
456 | * buf_item_unpin to do the rest because we are | ||
457 | * are holding the buffer locked so no one else will be | ||
458 | * able to bump up the refcount. We have to remove the | ||
459 | * log item from the transaction as we are about to release | ||
460 | * our reference to the buffer. If we don't, the unlock that | ||
461 | * occurs later in the xfs_trans_uncommit() will try to | ||
462 | * reference the buffer which we no longer have a hold on. | ||
463 | */ | ||
464 | struct xfs_log_item_desc *lidp; | ||
465 | |||
441 | ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); | 466 | ASSERT(XFS_BUF_VALUSEMA(bip->bli_buf) <= 0); |
442 | trace_xfs_buf_item_unpin_stale(bip); | 467 | trace_xfs_buf_item_unpin_stale(bip); |
443 | 468 | ||
444 | /* | 469 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t *)bip); |
445 | * yes -- clear the xaction descriptor in-use flag | ||
446 | * and free the chunk if required. We can safely | ||
447 | * do some work here and then call buf_item_unpin | ||
448 | * to do the rest because if the if is true, then | ||
449 | * we are holding the buffer locked so no one else | ||
450 | * will be able to bump up the refcount. | ||
451 | */ | ||
452 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t *) bip); | ||
453 | stale = lidp->lid_flags & XFS_LID_BUF_STALE; | ||
454 | xfs_trans_free_item(tp, lidp); | 470 | xfs_trans_free_item(tp, lidp); |
471 | |||
455 | /* | 472 | /* |
456 | * Since the transaction no longer refers to the buffer, | 473 | * Since the transaction no longer refers to the buffer, the |
457 | * the buffer should no longer refer to the transaction. | 474 | * buffer should no longer refer to the transaction. |
458 | */ | 475 | */ |
459 | XFS_BUF_SET_FSPRIVATE2(bp, NULL); | 476 | XFS_BUF_SET_FSPRIVATE2(bip->bli_buf, NULL); |
460 | } | 477 | } |
461 | 478 | xfs_buf_item_unpin(bip); | |
462 | xfs_buf_item_unpin(bip, stale); | ||
463 | |||
464 | return; | ||
465 | } | 479 | } |
466 | 480 | ||
467 | /* | 481 | /* |
@@ -495,20 +509,23 @@ xfs_buf_item_trylock( | |||
495 | } | 509 | } |
496 | 510 | ||
497 | /* | 511 | /* |
498 | * Release the buffer associated with the buf log item. | 512 | * Release the buffer associated with the buf log item. If there is no dirty |
499 | * If there is no dirty logged data associated with the | 513 | * logged data associated with the buffer recorded in the buf log item, then |
500 | * buffer recorded in the buf log item, then free the | 514 | * free the buf log item and remove the reference to it in the buffer. |
501 | * buf log item and remove the reference to it in the | 515 | * |
502 | * buffer. | 516 | * This call ignores the recursion count. It is only called when the buffer |
517 | * should REALLY be unlocked, regardless of the recursion count. | ||
503 | * | 518 | * |
504 | * This call ignores the recursion count. It is only called | 519 | * We unconditionally drop the transaction's reference to the log item. If the |
505 | * when the buffer should REALLY be unlocked, regardless | 520 | * item was logged, then another reference was taken when it was pinned, so we |
506 | * of the recursion count. | 521 | * can safely drop the transaction reference now. This also allows us to avoid |
522 | * potential races with the unpin code freeing the bli by not referencing the | ||
523 | * bli after we've dropped the reference count. | ||
507 | * | 524 | * |
508 | * If the XFS_BLI_HOLD flag is set in the buf log item, then | 525 | * If the XFS_BLI_HOLD flag is set in the buf log item, then free the log item |
509 | * free the log item if necessary but do not unlock the buffer. | 526 | * if necessary but do not unlock the buffer. This is for support of |
510 | * This is for support of xfs_trans_bhold(). Make sure the | 527 | * xfs_trans_bhold(). Make sure the XFS_BLI_HOLD field is cleared if we don't |
511 | * XFS_BLI_HOLD field is cleared if we don't free the item. | 528 | * free the item. |
512 | */ | 529 | */ |
513 | STATIC void | 530 | STATIC void |
514 | xfs_buf_item_unlock( | 531 | xfs_buf_item_unlock( |
@@ -520,73 +537,54 @@ xfs_buf_item_unlock( | |||
520 | 537 | ||
521 | bp = bip->bli_buf; | 538 | bp = bip->bli_buf; |
522 | 539 | ||
523 | /* | 540 | /* Clear the buffer's association with this transaction. */ |
524 | * Clear the buffer's association with this transaction. | ||
525 | */ | ||
526 | XFS_BUF_SET_FSPRIVATE2(bp, NULL); | 541 | XFS_BUF_SET_FSPRIVATE2(bp, NULL); |
527 | 542 | ||
528 | /* | 543 | /* |
529 | * If this is a transaction abort, don't return early. | 544 | * If this is a transaction abort, don't return early. Instead, allow |
530 | * Instead, allow the brelse to happen. | 545 | * the brelse to happen. Normally it would be done for stale |
531 | * Normally it would be done for stale (cancelled) buffers | 546 | * (cancelled) buffers at unpin time, but we'll never go through the |
532 | * at unpin time, but we'll never go through the pin/unpin | 547 | * pin/unpin cycle if we abort inside commit. |
533 | * cycle if we abort inside commit. | ||
534 | */ | 548 | */ |
535 | aborted = (bip->bli_item.li_flags & XFS_LI_ABORTED) != 0; | 549 | aborted = (bip->bli_item.li_flags & XFS_LI_ABORTED) != 0; |
536 | 550 | ||
537 | /* | 551 | /* |
538 | * If the buf item is marked stale, then don't do anything. | 552 | * Before possibly freeing the buf item, determine if we should |
539 | * We'll unlock the buffer and free the buf item when the | 553 | * release the buffer at the end of this routine. |
540 | * buffer is unpinned for the last time. | ||
541 | */ | 554 | */ |
542 | if (bip->bli_flags & XFS_BLI_STALE) { | 555 | hold = bip->bli_flags & XFS_BLI_HOLD; |
543 | bip->bli_flags &= ~XFS_BLI_LOGGED; | 556 | |
544 | trace_xfs_buf_item_unlock_stale(bip); | 557 | /* Clear the per transaction state. */ |
545 | ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); | 558 | bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_HOLD); |
546 | if (!aborted) | ||
547 | return; | ||
548 | } | ||
549 | 559 | ||
550 | /* | 560 | /* |
551 | * Drop the transaction's reference to the log item if | 561 | * If the buf item is marked stale, then don't do anything. We'll |
552 | * it was not logged as part of the transaction. Otherwise | 562 | * unlock the buffer and free the buf item when the buffer is unpinned |
553 | * we'll drop the reference in xfs_buf_item_unpin() when | 563 | * for the last time. |
554 | * the transaction is really through with the buffer. | ||
555 | */ | 564 | */ |
556 | if (!(bip->bli_flags & XFS_BLI_LOGGED)) { | 565 | if (bip->bli_flags & XFS_BLI_STALE) { |
557 | atomic_dec(&bip->bli_refcount); | 566 | trace_xfs_buf_item_unlock_stale(bip); |
558 | } else { | 567 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); |
559 | /* | 568 | if (!aborted) { |
560 | * Clear the logged flag since this is per | 569 | atomic_dec(&bip->bli_refcount); |
561 | * transaction state. | 570 | return; |
562 | */ | 571 | } |
563 | bip->bli_flags &= ~XFS_BLI_LOGGED; | ||
564 | } | 572 | } |
565 | 573 | ||
566 | /* | ||
567 | * Before possibly freeing the buf item, determine if we should | ||
568 | * release the buffer at the end of this routine. | ||
569 | */ | ||
570 | hold = bip->bli_flags & XFS_BLI_HOLD; | ||
571 | trace_xfs_buf_item_unlock(bip); | 574 | trace_xfs_buf_item_unlock(bip); |
572 | 575 | ||
573 | /* | 576 | /* |
574 | * If the buf item isn't tracking any data, free it. | 577 | * If the buf item isn't tracking any data, free it, otherwise drop the |
575 | * Otherwise, if XFS_BLI_HOLD is set clear it. | 578 | * reference we hold to it. |
576 | */ | 579 | */ |
577 | if (xfs_bitmap_empty(bip->bli_format.blf_data_map, | 580 | if (xfs_bitmap_empty(bip->bli_format.blf_data_map, |
578 | bip->bli_format.blf_map_size)) { | 581 | bip->bli_format.blf_map_size)) |
579 | xfs_buf_item_relse(bp); | 582 | xfs_buf_item_relse(bp); |
580 | } else if (hold) { | 583 | else |
581 | bip->bli_flags &= ~XFS_BLI_HOLD; | 584 | atomic_dec(&bip->bli_refcount); |
582 | } | ||
583 | 585 | ||
584 | /* | 586 | if (!hold) |
585 | * Release the buffer if XFS_BLI_HOLD was not set. | ||
586 | */ | ||
587 | if (!hold) { | ||
588 | xfs_buf_relse(bp); | 587 | xfs_buf_relse(bp); |
589 | } | ||
590 | } | 588 | } |
591 | 589 | ||
592 | /* | 590 | /* |
@@ -675,7 +673,7 @@ static struct xfs_item_ops xfs_buf_item_ops = { | |||
675 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) | 673 | .iop_format = (void(*)(xfs_log_item_t*, xfs_log_iovec_t*)) |
676 | xfs_buf_item_format, | 674 | xfs_buf_item_format, |
677 | .iop_pin = (void(*)(xfs_log_item_t*))xfs_buf_item_pin, | 675 | .iop_pin = (void(*)(xfs_log_item_t*))xfs_buf_item_pin, |
678 | .iop_unpin = (void(*)(xfs_log_item_t*, int))xfs_buf_item_unpin, | 676 | .iop_unpin = (void(*)(xfs_log_item_t*))xfs_buf_item_unpin, |
679 | .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t *)) | 677 | .iop_unpin_remove = (void(*)(xfs_log_item_t*, xfs_trans_t *)) |
680 | xfs_buf_item_unpin_remove, | 678 | xfs_buf_item_unpin_remove, |
681 | .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_buf_item_trylock, | 679 | .iop_trylock = (uint(*)(xfs_log_item_t*))xfs_buf_item_trylock, |
@@ -723,20 +721,17 @@ xfs_buf_item_init( | |||
723 | } | 721 | } |
724 | 722 | ||
725 | /* | 723 | /* |
726 | * chunks is the number of XFS_BLI_CHUNK size pieces | 724 | * chunks is the number of XFS_BLF_CHUNK size pieces |
727 | * the buffer can be divided into. Make sure not to | 725 | * the buffer can be divided into. Make sure not to |
728 | * truncate any pieces. map_size is the size of the | 726 | * truncate any pieces. map_size is the size of the |
729 | * bitmap needed to describe the chunks of the buffer. | 727 | * bitmap needed to describe the chunks of the buffer. |
730 | */ | 728 | */ |
731 | chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLI_CHUNK - 1)) >> XFS_BLI_SHIFT); | 729 | chunks = (int)((XFS_BUF_COUNT(bp) + (XFS_BLF_CHUNK - 1)) >> XFS_BLF_SHIFT); |
732 | map_size = (int)((chunks + NBWORD) >> BIT_TO_WORD_SHIFT); | 730 | map_size = (int)((chunks + NBWORD) >> BIT_TO_WORD_SHIFT); |
733 | 731 | ||
734 | bip = (xfs_buf_log_item_t*)kmem_zone_zalloc(xfs_buf_item_zone, | 732 | bip = (xfs_buf_log_item_t*)kmem_zone_zalloc(xfs_buf_item_zone, |
735 | KM_SLEEP); | 733 | KM_SLEEP); |
736 | bip->bli_item.li_type = XFS_LI_BUF; | 734 | xfs_log_item_init(mp, &bip->bli_item, XFS_LI_BUF, &xfs_buf_item_ops); |
737 | bip->bli_item.li_ops = &xfs_buf_item_ops; | ||
738 | bip->bli_item.li_mountp = mp; | ||
739 | bip->bli_item.li_ailp = mp->m_ail; | ||
740 | bip->bli_buf = bp; | 735 | bip->bli_buf = bp; |
741 | xfs_buf_hold(bp); | 736 | xfs_buf_hold(bp); |
742 | bip->bli_format.blf_type = XFS_LI_BUF; | 737 | bip->bli_format.blf_type = XFS_LI_BUF; |
@@ -799,8 +794,8 @@ xfs_buf_item_log( | |||
799 | /* | 794 | /* |
800 | * Convert byte offsets to bit numbers. | 795 | * Convert byte offsets to bit numbers. |
801 | */ | 796 | */ |
802 | first_bit = first >> XFS_BLI_SHIFT; | 797 | first_bit = first >> XFS_BLF_SHIFT; |
803 | last_bit = last >> XFS_BLI_SHIFT; | 798 | last_bit = last >> XFS_BLF_SHIFT; |
804 | 799 | ||
805 | /* | 800 | /* |
806 | * Calculate the total number of bits to be set. | 801 | * Calculate the total number of bits to be set. |