diff options
Diffstat (limited to 'fs/xfs/xfs_trans_buf.c')
-rw-r--r-- | fs/xfs/xfs_trans_buf.c | 62 |
1 files changed, 26 insertions, 36 deletions
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 03a1f701fea8..49130628d5ef 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c | |||
@@ -38,6 +38,7 @@ | |||
38 | #include "xfs_trans_priv.h" | 38 | #include "xfs_trans_priv.h" |
39 | #include "xfs_error.h" | 39 | #include "xfs_error.h" |
40 | #include "xfs_rw.h" | 40 | #include "xfs_rw.h" |
41 | #include "xfs_trace.h" | ||
41 | 42 | ||
42 | 43 | ||
43 | STATIC xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, xfs_buftarg_t *, | 44 | STATIC xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, xfs_buftarg_t *, |
@@ -95,26 +96,23 @@ xfs_trans_get_buf(xfs_trans_t *tp, | |||
95 | } | 96 | } |
96 | if (bp != NULL) { | 97 | if (bp != NULL) { |
97 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); | 98 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); |
98 | if (XFS_FORCED_SHUTDOWN(tp->t_mountp)) { | 99 | if (XFS_FORCED_SHUTDOWN(tp->t_mountp)) |
99 | xfs_buftrace("TRANS GET RECUR SHUT", bp); | ||
100 | XFS_BUF_SUPER_STALE(bp); | 100 | XFS_BUF_SUPER_STALE(bp); |
101 | } | 101 | |
102 | /* | 102 | /* |
103 | * If the buffer is stale then it was binval'ed | 103 | * If the buffer is stale then it was binval'ed |
104 | * since last read. This doesn't matter since the | 104 | * since last read. This doesn't matter since the |
105 | * caller isn't allowed to use the data anyway. | 105 | * caller isn't allowed to use the data anyway. |
106 | */ | 106 | */ |
107 | else if (XFS_BUF_ISSTALE(bp)) { | 107 | else if (XFS_BUF_ISSTALE(bp)) |
108 | xfs_buftrace("TRANS GET RECUR STALE", bp); | ||
109 | ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); | 108 | ASSERT(!XFS_BUF_ISDELAYWRITE(bp)); |
110 | } | 109 | |
111 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); | 110 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); |
112 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 111 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
113 | ASSERT(bip != NULL); | 112 | ASSERT(bip != NULL); |
114 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 113 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
115 | bip->bli_recur++; | 114 | bip->bli_recur++; |
116 | xfs_buftrace("TRANS GET RECUR", bp); | 115 | trace_xfs_trans_get_buf_recur(bip); |
117 | xfs_buf_item_trace("GET RECUR", bip); | ||
118 | return (bp); | 116 | return (bp); |
119 | } | 117 | } |
120 | 118 | ||
@@ -166,8 +164,7 @@ xfs_trans_get_buf(xfs_trans_t *tp, | |||
166 | */ | 164 | */ |
167 | XFS_BUF_SET_FSPRIVATE2(bp, tp); | 165 | XFS_BUF_SET_FSPRIVATE2(bp, tp); |
168 | 166 | ||
169 | xfs_buftrace("TRANS GET", bp); | 167 | trace_xfs_trans_get_buf(bip); |
170 | xfs_buf_item_trace("GET", bip); | ||
171 | return (bp); | 168 | return (bp); |
172 | } | 169 | } |
173 | 170 | ||
@@ -207,7 +204,7 @@ xfs_trans_getsb(xfs_trans_t *tp, | |||
207 | ASSERT(bip != NULL); | 204 | ASSERT(bip != NULL); |
208 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 205 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
209 | bip->bli_recur++; | 206 | bip->bli_recur++; |
210 | xfs_buf_item_trace("GETSB RECUR", bip); | 207 | trace_xfs_trans_getsb_recur(bip); |
211 | return (bp); | 208 | return (bp); |
212 | } | 209 | } |
213 | 210 | ||
@@ -249,7 +246,7 @@ xfs_trans_getsb(xfs_trans_t *tp, | |||
249 | */ | 246 | */ |
250 | XFS_BUF_SET_FSPRIVATE2(bp, tp); | 247 | XFS_BUF_SET_FSPRIVATE2(bp, tp); |
251 | 248 | ||
252 | xfs_buf_item_trace("GETSB", bip); | 249 | trace_xfs_trans_getsb(bip); |
253 | return (bp); | 250 | return (bp); |
254 | } | 251 | } |
255 | 252 | ||
@@ -347,7 +344,7 @@ xfs_trans_read_buf( | |||
347 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); | 344 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); |
348 | ASSERT((XFS_BUF_ISERROR(bp)) == 0); | 345 | ASSERT((XFS_BUF_ISERROR(bp)) == 0); |
349 | if (!(XFS_BUF_ISDONE(bp))) { | 346 | if (!(XFS_BUF_ISDONE(bp))) { |
350 | xfs_buftrace("READ_BUF_INCORE !DONE", bp); | 347 | trace_xfs_trans_read_buf_io(bp, _RET_IP_); |
351 | ASSERT(!XFS_BUF_ISASYNC(bp)); | 348 | ASSERT(!XFS_BUF_ISASYNC(bp)); |
352 | XFS_BUF_READ(bp); | 349 | XFS_BUF_READ(bp); |
353 | xfsbdstrat(tp->t_mountp, bp); | 350 | xfsbdstrat(tp->t_mountp, bp); |
@@ -372,7 +369,7 @@ xfs_trans_read_buf( | |||
372 | * brelse it either. Just get out. | 369 | * brelse it either. Just get out. |
373 | */ | 370 | */ |
374 | if (XFS_FORCED_SHUTDOWN(mp)) { | 371 | if (XFS_FORCED_SHUTDOWN(mp)) { |
375 | xfs_buftrace("READ_BUF_INCORE XFSSHUTDN", bp); | 372 | trace_xfs_trans_read_buf_shut(bp, _RET_IP_); |
376 | *bpp = NULL; | 373 | *bpp = NULL; |
377 | return XFS_ERROR(EIO); | 374 | return XFS_ERROR(EIO); |
378 | } | 375 | } |
@@ -382,7 +379,7 @@ xfs_trans_read_buf( | |||
382 | bip->bli_recur++; | 379 | bip->bli_recur++; |
383 | 380 | ||
384 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 381 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
385 | xfs_buf_item_trace("READ RECUR", bip); | 382 | trace_xfs_trans_read_buf_recur(bip); |
386 | *bpp = bp; | 383 | *bpp = bp; |
387 | return 0; | 384 | return 0; |
388 | } | 385 | } |
@@ -402,7 +399,6 @@ xfs_trans_read_buf( | |||
402 | } | 399 | } |
403 | if (XFS_BUF_GETERROR(bp) != 0) { | 400 | if (XFS_BUF_GETERROR(bp) != 0) { |
404 | XFS_BUF_SUPER_STALE(bp); | 401 | XFS_BUF_SUPER_STALE(bp); |
405 | xfs_buftrace("READ ERROR", bp); | ||
406 | error = XFS_BUF_GETERROR(bp); | 402 | error = XFS_BUF_GETERROR(bp); |
407 | 403 | ||
408 | xfs_ioerror_alert("xfs_trans_read_buf", mp, | 404 | xfs_ioerror_alert("xfs_trans_read_buf", mp, |
@@ -461,8 +457,7 @@ xfs_trans_read_buf( | |||
461 | */ | 457 | */ |
462 | XFS_BUF_SET_FSPRIVATE2(bp, tp); | 458 | XFS_BUF_SET_FSPRIVATE2(bp, tp); |
463 | 459 | ||
464 | xfs_buftrace("TRANS READ", bp); | 460 | trace_xfs_trans_read_buf(bip); |
465 | xfs_buf_item_trace("READ", bip); | ||
466 | *bpp = bp; | 461 | *bpp = bp; |
467 | return 0; | 462 | return 0; |
468 | 463 | ||
@@ -480,7 +475,7 @@ shutdown_abort: | |||
480 | ASSERT((XFS_BUF_BFLAGS(bp) & (XFS_B_STALE|XFS_B_DELWRI)) != | 475 | ASSERT((XFS_BUF_BFLAGS(bp) & (XFS_B_STALE|XFS_B_DELWRI)) != |
481 | (XFS_B_STALE|XFS_B_DELWRI)); | 476 | (XFS_B_STALE|XFS_B_DELWRI)); |
482 | 477 | ||
483 | xfs_buftrace("READ_BUF XFSSHUTDN", bp); | 478 | trace_xfs_trans_read_buf_shut(bp, _RET_IP_); |
484 | xfs_buf_relse(bp); | 479 | xfs_buf_relse(bp); |
485 | *bpp = NULL; | 480 | *bpp = NULL; |
486 | return XFS_ERROR(EIO); | 481 | return XFS_ERROR(EIO); |
@@ -546,13 +541,14 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
546 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); | 541 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); |
547 | ASSERT(lidp != NULL); | 542 | ASSERT(lidp != NULL); |
548 | 543 | ||
544 | trace_xfs_trans_brelse(bip); | ||
545 | |||
549 | /* | 546 | /* |
550 | * If the release is just for a recursive lock, | 547 | * If the release is just for a recursive lock, |
551 | * then decrement the count and return. | 548 | * then decrement the count and return. |
552 | */ | 549 | */ |
553 | if (bip->bli_recur > 0) { | 550 | if (bip->bli_recur > 0) { |
554 | bip->bli_recur--; | 551 | bip->bli_recur--; |
555 | xfs_buf_item_trace("RELSE RECUR", bip); | ||
556 | return; | 552 | return; |
557 | } | 553 | } |
558 | 554 | ||
@@ -560,10 +556,8 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
560 | * If the buffer is dirty within this transaction, we can't | 556 | * If the buffer is dirty within this transaction, we can't |
561 | * release it until we commit. | 557 | * release it until we commit. |
562 | */ | 558 | */ |
563 | if (lidp->lid_flags & XFS_LID_DIRTY) { | 559 | if (lidp->lid_flags & XFS_LID_DIRTY) |
564 | xfs_buf_item_trace("RELSE DIRTY", bip); | ||
565 | return; | 560 | return; |
566 | } | ||
567 | 561 | ||
568 | /* | 562 | /* |
569 | * If the buffer has been invalidated, then we can't release | 563 | * If the buffer has been invalidated, then we can't release |
@@ -571,13 +565,10 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
571 | * as part of this transaction. This prevents us from pulling | 565 | * as part of this transaction. This prevents us from pulling |
572 | * the item from the AIL before we should. | 566 | * the item from the AIL before we should. |
573 | */ | 567 | */ |
574 | if (bip->bli_flags & XFS_BLI_STALE) { | 568 | if (bip->bli_flags & XFS_BLI_STALE) |
575 | xfs_buf_item_trace("RELSE STALE", bip); | ||
576 | return; | 569 | return; |
577 | } | ||
578 | 570 | ||
579 | ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); | 571 | ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); |
580 | xfs_buf_item_trace("RELSE", bip); | ||
581 | 572 | ||
582 | /* | 573 | /* |
583 | * Free up the log item descriptor tracking the released item. | 574 | * Free up the log item descriptor tracking the released item. |
@@ -674,7 +665,7 @@ xfs_trans_bjoin(xfs_trans_t *tp, | |||
674 | */ | 665 | */ |
675 | XFS_BUF_SET_FSPRIVATE2(bp, tp); | 666 | XFS_BUF_SET_FSPRIVATE2(bp, tp); |
676 | 667 | ||
677 | xfs_buf_item_trace("BJOIN", bip); | 668 | trace_xfs_trans_bjoin(bip); |
678 | } | 669 | } |
679 | 670 | ||
680 | /* | 671 | /* |
@@ -698,7 +689,7 @@ xfs_trans_bhold(xfs_trans_t *tp, | |||
698 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); | 689 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); |
699 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 690 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
700 | bip->bli_flags |= XFS_BLI_HOLD; | 691 | bip->bli_flags |= XFS_BLI_HOLD; |
701 | xfs_buf_item_trace("BHOLD", bip); | 692 | trace_xfs_trans_bhold(bip); |
702 | } | 693 | } |
703 | 694 | ||
704 | /* | 695 | /* |
@@ -721,7 +712,8 @@ xfs_trans_bhold_release(xfs_trans_t *tp, | |||
721 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 712 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
722 | ASSERT(bip->bli_flags & XFS_BLI_HOLD); | 713 | ASSERT(bip->bli_flags & XFS_BLI_HOLD); |
723 | bip->bli_flags &= ~XFS_BLI_HOLD; | 714 | bip->bli_flags &= ~XFS_BLI_HOLD; |
724 | xfs_buf_item_trace("BHOLD RELEASE", bip); | 715 | |
716 | trace_xfs_trans_bhold_release(bip); | ||
725 | } | 717 | } |
726 | 718 | ||
727 | /* | 719 | /* |
@@ -767,6 +759,8 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
767 | XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); | 759 | XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); |
768 | bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*))xfs_buf_iodone; | 760 | bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*))xfs_buf_iodone; |
769 | 761 | ||
762 | trace_xfs_trans_log_buf(bip); | ||
763 | |||
770 | /* | 764 | /* |
771 | * If we invalidated the buffer within this transaction, then | 765 | * If we invalidated the buffer within this transaction, then |
772 | * cancel the invalidation now that we're dirtying the buffer | 766 | * cancel the invalidation now that we're dirtying the buffer |
@@ -774,7 +768,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
774 | * because we have a reference to the buffer this entire time. | 768 | * because we have a reference to the buffer this entire time. |
775 | */ | 769 | */ |
776 | if (bip->bli_flags & XFS_BLI_STALE) { | 770 | if (bip->bli_flags & XFS_BLI_STALE) { |
777 | xfs_buf_item_trace("BLOG UNSTALE", bip); | ||
778 | bip->bli_flags &= ~XFS_BLI_STALE; | 771 | bip->bli_flags &= ~XFS_BLI_STALE; |
779 | ASSERT(XFS_BUF_ISSTALE(bp)); | 772 | ASSERT(XFS_BUF_ISSTALE(bp)); |
780 | XFS_BUF_UNSTALE(bp); | 773 | XFS_BUF_UNSTALE(bp); |
@@ -789,7 +782,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
789 | lidp->lid_flags &= ~XFS_LID_BUF_STALE; | 782 | lidp->lid_flags &= ~XFS_LID_BUF_STALE; |
790 | bip->bli_flags |= XFS_BLI_LOGGED; | 783 | bip->bli_flags |= XFS_BLI_LOGGED; |
791 | xfs_buf_item_log(bip, first, last); | 784 | xfs_buf_item_log(bip, first, last); |
792 | xfs_buf_item_trace("BLOG", bip); | ||
793 | } | 785 | } |
794 | 786 | ||
795 | 787 | ||
@@ -828,6 +820,8 @@ xfs_trans_binval( | |||
828 | ASSERT(lidp != NULL); | 820 | ASSERT(lidp != NULL); |
829 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 821 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
830 | 822 | ||
823 | trace_xfs_trans_binval(bip); | ||
824 | |||
831 | if (bip->bli_flags & XFS_BLI_STALE) { | 825 | if (bip->bli_flags & XFS_BLI_STALE) { |
832 | /* | 826 | /* |
833 | * If the buffer is already invalidated, then | 827 | * If the buffer is already invalidated, then |
@@ -840,8 +834,6 @@ xfs_trans_binval( | |||
840 | ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); | 834 | ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); |
841 | ASSERT(lidp->lid_flags & XFS_LID_DIRTY); | 835 | ASSERT(lidp->lid_flags & XFS_LID_DIRTY); |
842 | ASSERT(tp->t_flags & XFS_TRANS_DIRTY); | 836 | ASSERT(tp->t_flags & XFS_TRANS_DIRTY); |
843 | xfs_buftrace("XFS_BINVAL RECUR", bp); | ||
844 | xfs_buf_item_trace("BINVAL RECUR", bip); | ||
845 | return; | 837 | return; |
846 | } | 838 | } |
847 | 839 | ||
@@ -875,8 +867,6 @@ xfs_trans_binval( | |||
875 | (bip->bli_format.blf_map_size * sizeof(uint))); | 867 | (bip->bli_format.blf_map_size * sizeof(uint))); |
876 | lidp->lid_flags |= XFS_LID_DIRTY|XFS_LID_BUF_STALE; | 868 | lidp->lid_flags |= XFS_LID_DIRTY|XFS_LID_BUF_STALE; |
877 | tp->t_flags |= XFS_TRANS_DIRTY; | 869 | tp->t_flags |= XFS_TRANS_DIRTY; |
878 | xfs_buftrace("XFS_BINVAL", bp); | ||
879 | xfs_buf_item_trace("BINVAL", bip); | ||
880 | } | 870 | } |
881 | 871 | ||
882 | /* | 872 | /* |