diff options
Diffstat (limited to 'fs/xfs/xfs_trans_buf.c')
| -rw-r--r-- | fs/xfs/xfs_trans_buf.c | 75 | 
1 files changed, 17 insertions, 58 deletions
| diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index 63d81a22f4fd..90af025e6839 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() | 
| @@ -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 | 
