diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-03 17:33:38 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2010-08-03 17:33:38 -0400 |
commit | 51102ee5b8853d230e534cbcd0d888f0134738a3 (patch) | |
tree | 5a34844b3040dbc099dd0d3ebc2e6fca0bc65855 /fs/xfs/xfs_trans_buf.c | |
parent | 54161df1fb1469d66bce3a3b14d8281adbb69263 (diff) | |
parent | 6b0a2996a0c023d84bc27ec7528a6e54cb5ea264 (diff) |
Merge branch 'for-linus' of git://oss.sgi.com/xfs/xfs
* 'for-linus' of git://oss.sgi.com/xfs/xfs: (49 commits)
xfs simplify and speed up direct I/O completions
xfs: move aio completion after unwritten extent conversion
direct-io: move aio_complete into ->end_io
xfs: fix big endian build
xfs: clean up xfs_bmap_get_bp
xfs: simplify xfs_truncate_file
xfs: kill the b_strat callback in xfs_buf
xfs: remove obsolete osyncisosync mount option
xfs: clean up filestreams helpers
xfs: fix gcc 4.6 set but not read and unused statement warnings
xfs: Fix build when CONFIG_XFS_POSIX_ACL=n
xfs: fix unsigned underflow in xfs_free_eofblocks
xfs: use GFP_NOFS for page cache allocation
xfs: fix memory reclaim recursion deadlock on locked inode buffer
xfs: fix xfs_trans_add_item() lockdep warnings
xfs: simplify and remove xfs_ireclaim
xfs: don't block on buffer read errors
xfs: move inode shrinker unregister even earlier
xfs: remove a dmapi leftover
xfs: writepage always has buffers
...
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 63d81a22f4f..90af025e683 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 |