diff options
Diffstat (limited to 'fs/xfs/xfs_trans_buf.c')
-rw-r--r-- | fs/xfs/xfs_trans_buf.c | 77 |
1 files changed, 18 insertions, 59 deletions
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 63d81a22f4fd..c47918c302a5 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c | |||
@@ -24,14 +24,10 @@ | |||
24 | #include "xfs_trans.h" | 24 | #include "xfs_trans.h" |
25 | #include "xfs_sb.h" | 25 | #include "xfs_sb.h" |
26 | #include "xfs_ag.h" | 26 | #include "xfs_ag.h" |
27 | #include "xfs_dir2.h" | ||
28 | #include "xfs_dmapi.h" | ||
29 | #include "xfs_mount.h" | 27 | #include "xfs_mount.h" |
30 | #include "xfs_bmap_btree.h" | 28 | #include "xfs_bmap_btree.h" |
31 | #include "xfs_alloc_btree.h" | 29 | #include "xfs_alloc_btree.h" |
32 | #include "xfs_ialloc_btree.h" | 30 | #include "xfs_ialloc_btree.h" |
33 | #include "xfs_dir2_sf.h" | ||
34 | #include "xfs_attr_sf.h" | ||
35 | #include "xfs_dinode.h" | 31 | #include "xfs_dinode.h" |
36 | #include "xfs_inode.h" | 32 | #include "xfs_inode.h" |
37 | #include "xfs_buf_item.h" | 33 | #include "xfs_buf_item.h" |
@@ -51,36 +47,17 @@ xfs_trans_buf_item_match( | |||
51 | xfs_daddr_t blkno, | 47 | xfs_daddr_t blkno, |
52 | int len) | 48 | int len) |
53 | { | 49 | { |
54 | xfs_log_item_chunk_t *licp; | 50 | struct xfs_log_item_desc *lidp; |
55 | xfs_log_item_desc_t *lidp; | 51 | struct xfs_buf_log_item *blip; |
56 | xfs_buf_log_item_t *blip; | ||
57 | int i; | ||
58 | 52 | ||
59 | len = BBTOB(len); | 53 | len = BBTOB(len); |
60 | for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { | 54 | list_for_each_entry(lidp, &tp->t_items, lid_trans) { |
61 | if (xfs_lic_are_all_free(licp)) { | 55 | blip = (struct xfs_buf_log_item *)lidp->lid_item; |
62 | ASSERT(licp == &tp->t_items); | 56 | if (blip->bli_item.li_type == XFS_LI_BUF && |
63 | ASSERT(licp->lic_next == NULL); | 57 | XFS_BUF_TARGET(blip->bli_buf) == target && |
64 | return NULL; | 58 | XFS_BUF_ADDR(blip->bli_buf) == blkno && |
65 | } | 59 | XFS_BUF_COUNT(blip->bli_buf) == len) |
66 | 60 | return blip->bli_buf; | |
67 | for (i = 0; i < licp->lic_unused; i++) { | ||
68 | /* | ||
69 | * Skip unoccupied slots. | ||
70 | */ | ||
71 | if (xfs_lic_isfree(licp, i)) | ||
72 | continue; | ||
73 | |||
74 | lidp = xfs_lic_slot(licp, i); | ||
75 | blip = (xfs_buf_log_item_t *)lidp->lid_item; | ||
76 | if (blip->bli_item.li_type != XFS_LI_BUF) | ||
77 | continue; | ||
78 | |||
79 | if (XFS_BUF_TARGET(blip->bli_buf) == target && | ||
80 | XFS_BUF_ADDR(blip->bli_buf) == blkno && | ||
81 | XFS_BUF_COUNT(blip->bli_buf) == len) | ||
82 | return blip->bli_buf; | ||
83 | } | ||
84 | } | 61 | } |
85 | 62 | ||
86 | return NULL; | 63 | return NULL; |
@@ -127,7 +104,7 @@ _xfs_trans_bjoin( | |||
127 | /* | 104 | /* |
128 | * Get a log_item_desc to point at the new item. | 105 | * Get a log_item_desc to point at the new item. |
129 | */ | 106 | */ |
130 | (void) xfs_trans_add_item(tp, (xfs_log_item_t *)bip); | 107 | xfs_trans_add_item(tp, &bip->bli_item); |
131 | 108 | ||
132 | /* | 109 | /* |
133 | * Initialize b_fsprivate2 so we can find it with incore_match() | 110 | * Initialize b_fsprivate2 so we can find it with incore_match() |
@@ -359,7 +336,7 @@ xfs_trans_read_buf( | |||
359 | ASSERT(!XFS_BUF_ISASYNC(bp)); | 336 | ASSERT(!XFS_BUF_ISASYNC(bp)); |
360 | XFS_BUF_READ(bp); | 337 | XFS_BUF_READ(bp); |
361 | xfsbdstrat(tp->t_mountp, bp); | 338 | xfsbdstrat(tp->t_mountp, bp); |
362 | error = xfs_iowait(bp); | 339 | error = xfs_buf_iowait(bp); |
363 | if (error) { | 340 | if (error) { |
364 | xfs_ioerror_alert("xfs_trans_read_buf", mp, | 341 | xfs_ioerror_alert("xfs_trans_read_buf", mp, |
365 | bp, blkno); | 342 | bp, blkno); |
@@ -483,7 +460,6 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
483 | { | 460 | { |
484 | xfs_buf_log_item_t *bip; | 461 | xfs_buf_log_item_t *bip; |
485 | xfs_log_item_t *lip; | 462 | xfs_log_item_t *lip; |
486 | xfs_log_item_desc_t *lidp; | ||
487 | 463 | ||
488 | /* | 464 | /* |
489 | * Default to a normal brelse() call if the tp is NULL. | 465 | * Default to a normal brelse() call if the tp is NULL. |
@@ -514,13 +490,6 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
514 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); | 490 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); |
515 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 491 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
516 | 492 | ||
517 | /* | ||
518 | * Find the item descriptor pointing to this buffer's | ||
519 | * log item. It must be there. | ||
520 | */ | ||
521 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); | ||
522 | ASSERT(lidp != NULL); | ||
523 | |||
524 | trace_xfs_trans_brelse(bip); | 493 | trace_xfs_trans_brelse(bip); |
525 | 494 | ||
526 | /* | 495 | /* |
@@ -536,7 +505,7 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
536 | * If the buffer is dirty within this transaction, we can't | 505 | * If the buffer is dirty within this transaction, we can't |
537 | * release it until we commit. | 506 | * release it until we commit. |
538 | */ | 507 | */ |
539 | if (lidp->lid_flags & XFS_LID_DIRTY) | 508 | if (bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY) |
540 | return; | 509 | return; |
541 | 510 | ||
542 | /* | 511 | /* |
@@ -553,7 +522,7 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
553 | /* | 522 | /* |
554 | * Free up the log item descriptor tracking the released item. | 523 | * Free up the log item descriptor tracking the released item. |
555 | */ | 524 | */ |
556 | xfs_trans_free_item(tp, lidp); | 525 | xfs_trans_del_item(&bip->bli_item); |
557 | 526 | ||
558 | /* | 527 | /* |
559 | * Clear the hold flag in the buf log item if it is set. | 528 | * Clear the hold flag in the buf log item if it is set. |
@@ -665,7 +634,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
665 | uint last) | 634 | uint last) |
666 | { | 635 | { |
667 | xfs_buf_log_item_t *bip; | 636 | xfs_buf_log_item_t *bip; |
668 | xfs_log_item_desc_t *lidp; | ||
669 | 637 | ||
670 | ASSERT(XFS_BUF_ISBUSY(bp)); | 638 | ASSERT(XFS_BUF_ISBUSY(bp)); |
671 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); | 639 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); |
@@ -690,7 +658,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
690 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 658 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
691 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 659 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
692 | XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); | 660 | XFS_BUF_SET_IODONE_FUNC(bp, xfs_buf_iodone_callbacks); |
693 | bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*))xfs_buf_iodone; | 661 | bip->bli_item.li_cb = xfs_buf_iodone; |
694 | 662 | ||
695 | trace_xfs_trans_log_buf(bip); | 663 | trace_xfs_trans_log_buf(bip); |
696 | 664 | ||
@@ -707,11 +675,8 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
707 | bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; | 675 | bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; |
708 | } | 676 | } |
709 | 677 | ||
710 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); | ||
711 | ASSERT(lidp != NULL); | ||
712 | |||
713 | tp->t_flags |= XFS_TRANS_DIRTY; | 678 | tp->t_flags |= XFS_TRANS_DIRTY; |
714 | lidp->lid_flags |= XFS_LID_DIRTY; | 679 | bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; |
715 | bip->bli_flags |= XFS_BLI_LOGGED; | 680 | bip->bli_flags |= XFS_BLI_LOGGED; |
716 | xfs_buf_item_log(bip, first, last); | 681 | xfs_buf_item_log(bip, first, last); |
717 | } | 682 | } |
@@ -740,7 +705,6 @@ xfs_trans_binval( | |||
740 | xfs_trans_t *tp, | 705 | xfs_trans_t *tp, |
741 | xfs_buf_t *bp) | 706 | xfs_buf_t *bp) |
742 | { | 707 | { |
743 | xfs_log_item_desc_t *lidp; | ||
744 | xfs_buf_log_item_t *bip; | 708 | xfs_buf_log_item_t *bip; |
745 | 709 | ||
746 | ASSERT(XFS_BUF_ISBUSY(bp)); | 710 | ASSERT(XFS_BUF_ISBUSY(bp)); |
@@ -748,8 +712,6 @@ xfs_trans_binval( | |||
748 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); | 712 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); |
749 | 713 | ||
750 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 714 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
751 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); | ||
752 | ASSERT(lidp != NULL); | ||
753 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 715 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
754 | 716 | ||
755 | trace_xfs_trans_binval(bip); | 717 | trace_xfs_trans_binval(bip); |
@@ -764,7 +726,7 @@ xfs_trans_binval( | |||
764 | ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); | 726 | ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); |
765 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); | 727 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); |
766 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); | 728 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); |
767 | ASSERT(lidp->lid_flags & XFS_LID_DIRTY); | 729 | ASSERT(bip->bli_item.li_desc->lid_flags & XFS_LID_DIRTY); |
768 | ASSERT(tp->t_flags & XFS_TRANS_DIRTY); | 730 | ASSERT(tp->t_flags & XFS_TRANS_DIRTY); |
769 | return; | 731 | return; |
770 | } | 732 | } |
@@ -797,7 +759,7 @@ xfs_trans_binval( | |||
797 | bip->bli_format.blf_flags |= XFS_BLF_CANCEL; | 759 | bip->bli_format.blf_flags |= XFS_BLF_CANCEL; |
798 | memset((char *)(bip->bli_format.blf_data_map), 0, | 760 | memset((char *)(bip->bli_format.blf_data_map), 0, |
799 | (bip->bli_format.blf_map_size * sizeof(uint))); | 761 | (bip->bli_format.blf_map_size * sizeof(uint))); |
800 | lidp->lid_flags |= XFS_LID_DIRTY; | 762 | bip->bli_item.li_desc->lid_flags |= XFS_LID_DIRTY; |
801 | tp->t_flags |= XFS_TRANS_DIRTY; | 763 | tp->t_flags |= XFS_TRANS_DIRTY; |
802 | } | 764 | } |
803 | 765 | ||
@@ -853,12 +815,9 @@ xfs_trans_stale_inode_buf( | |||
853 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 815 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
854 | 816 | ||
855 | bip->bli_flags |= XFS_BLI_STALE_INODE; | 817 | bip->bli_flags |= XFS_BLI_STALE_INODE; |
856 | bip->bli_item.li_cb = (void(*)(xfs_buf_t*,xfs_log_item_t*)) | 818 | bip->bli_item.li_cb = xfs_buf_iodone; |
857 | xfs_buf_iodone; | ||
858 | } | 819 | } |
859 | 820 | ||
860 | |||
861 | |||
862 | /* | 821 | /* |
863 | * Mark the buffer as being one which contains newly allocated | 822 | * Mark the buffer as being one which contains newly allocated |
864 | * inodes. We need to make sure that even if this buffer is | 823 | * inodes. We need to make sure that even if this buffer is |