diff options
Diffstat (limited to 'fs/xfs/xfs_trans_buf.c')
-rw-r--r-- | fs/xfs/xfs_trans_buf.c | 233 |
1 files changed, 70 insertions, 163 deletions
diff --git a/fs/xfs/xfs_trans_buf.c b/fs/xfs/xfs_trans_buf.c index fb586360d1c9..63d81a22f4fd 100644 --- a/fs/xfs/xfs_trans_buf.c +++ b/fs/xfs/xfs_trans_buf.c | |||
@@ -40,11 +40,51 @@ | |||
40 | #include "xfs_rw.h" | 40 | #include "xfs_rw.h" |
41 | #include "xfs_trace.h" | 41 | #include "xfs_trace.h" |
42 | 42 | ||
43 | /* | ||
44 | * Check to see if a buffer matching the given parameters is already | ||
45 | * a part of the given transaction. | ||
46 | */ | ||
47 | STATIC struct xfs_buf * | ||
48 | xfs_trans_buf_item_match( | ||
49 | struct xfs_trans *tp, | ||
50 | struct xfs_buftarg *target, | ||
51 | xfs_daddr_t blkno, | ||
52 | int len) | ||
53 | { | ||
54 | xfs_log_item_chunk_t *licp; | ||
55 | xfs_log_item_desc_t *lidp; | ||
56 | xfs_buf_log_item_t *blip; | ||
57 | int i; | ||
58 | |||
59 | len = BBTOB(len); | ||
60 | for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { | ||
61 | if (xfs_lic_are_all_free(licp)) { | ||
62 | ASSERT(licp == &tp->t_items); | ||
63 | ASSERT(licp->lic_next == NULL); | ||
64 | return NULL; | ||
65 | } | ||
66 | |||
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 | } | ||
43 | 85 | ||
44 | STATIC xfs_buf_t *xfs_trans_buf_item_match(xfs_trans_t *, xfs_buftarg_t *, | 86 | return NULL; |
45 | xfs_daddr_t, int); | 87 | } |
46 | STATIC xfs_buf_t *xfs_trans_buf_item_match_all(xfs_trans_t *, xfs_buftarg_t *, | ||
47 | xfs_daddr_t, int); | ||
48 | 88 | ||
49 | /* | 89 | /* |
50 | * Add the locked buffer to the transaction. | 90 | * Add the locked buffer to the transaction. |
@@ -74,7 +114,7 @@ _xfs_trans_bjoin( | |||
74 | xfs_buf_item_init(bp, tp->t_mountp); | 114 | xfs_buf_item_init(bp, tp->t_mountp); |
75 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 115 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
76 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); | 116 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); |
77 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); | 117 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); |
78 | ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); | 118 | ASSERT(!(bip->bli_flags & XFS_BLI_LOGGED)); |
79 | if (reset_recur) | 119 | if (reset_recur) |
80 | bip->bli_recur = 0; | 120 | bip->bli_recur = 0; |
@@ -112,14 +152,6 @@ xfs_trans_bjoin( | |||
112 | * within the transaction, just increment its lock recursion count | 152 | * within the transaction, just increment its lock recursion count |
113 | * and return a pointer to it. | 153 | * and return a pointer to it. |
114 | * | 154 | * |
115 | * Use the fast path function xfs_trans_buf_item_match() or the buffer | ||
116 | * cache routine incore_match() to find the buffer | ||
117 | * if it is already owned by this transaction. | ||
118 | * | ||
119 | * If we don't already own the buffer, use get_buf() to get it. | ||
120 | * If it doesn't yet have an associated xfs_buf_log_item structure, | ||
121 | * then allocate one and add the item to this transaction. | ||
122 | * | ||
123 | * If the transaction pointer is NULL, make this just a normal | 155 | * If the transaction pointer is NULL, make this just a normal |
124 | * get_buf() call. | 156 | * get_buf() call. |
125 | */ | 157 | */ |
@@ -149,11 +181,7 @@ xfs_trans_get_buf(xfs_trans_t *tp, | |||
149 | * have it locked. In this case we just increment the lock | 181 | * have it locked. In this case we just increment the lock |
150 | * recursion count and return the buffer to the caller. | 182 | * recursion count and return the buffer to the caller. |
151 | */ | 183 | */ |
152 | if (tp->t_items.lic_next == NULL) { | 184 | bp = xfs_trans_buf_item_match(tp, target_dev, blkno, len); |
153 | bp = xfs_trans_buf_item_match(tp, target_dev, blkno, len); | ||
154 | } else { | ||
155 | bp = xfs_trans_buf_item_match_all(tp, target_dev, blkno, len); | ||
156 | } | ||
157 | if (bp != NULL) { | 185 | if (bp != NULL) { |
158 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); | 186 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); |
159 | if (XFS_FORCED_SHUTDOWN(tp->t_mountp)) | 187 | if (XFS_FORCED_SHUTDOWN(tp->t_mountp)) |
@@ -259,14 +287,6 @@ int xfs_error_mod = 33; | |||
259 | * within the transaction and already read in, just increment its | 287 | * within the transaction and already read in, just increment its |
260 | * lock recursion count and return a pointer to it. | 288 | * lock recursion count and return a pointer to it. |
261 | * | 289 | * |
262 | * Use the fast path function xfs_trans_buf_item_match() or the buffer | ||
263 | * cache routine incore_match() to find the buffer | ||
264 | * if it is already owned by this transaction. | ||
265 | * | ||
266 | * If we don't already own the buffer, use read_buf() to get it. | ||
267 | * If it doesn't yet have an associated xfs_buf_log_item structure, | ||
268 | * then allocate one and add the item to this transaction. | ||
269 | * | ||
270 | * If the transaction pointer is NULL, make this just a normal | 290 | * If the transaction pointer is NULL, make this just a normal |
271 | * read_buf() call. | 291 | * read_buf() call. |
272 | */ | 292 | */ |
@@ -328,11 +348,7 @@ xfs_trans_read_buf( | |||
328 | * If the buffer is not yet read in, then we read it in, increment | 348 | * If the buffer is not yet read in, then we read it in, increment |
329 | * the lock recursion count, and return it to the caller. | 349 | * the lock recursion count, and return it to the caller. |
330 | */ | 350 | */ |
331 | if (tp->t_items.lic_next == NULL) { | 351 | bp = xfs_trans_buf_item_match(tp, target, blkno, len); |
332 | bp = xfs_trans_buf_item_match(tp, target, blkno, len); | ||
333 | } else { | ||
334 | bp = xfs_trans_buf_item_match_all(tp, target, blkno, len); | ||
335 | } | ||
336 | if (bp != NULL) { | 352 | if (bp != NULL) { |
337 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); | 353 | ASSERT(XFS_BUF_VALUSEMA(bp) <= 0); |
338 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); | 354 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); |
@@ -495,7 +511,7 @@ xfs_trans_brelse(xfs_trans_t *tp, | |||
495 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 511 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
496 | ASSERT(bip->bli_item.li_type == XFS_LI_BUF); | 512 | ASSERT(bip->bli_item.li_type == XFS_LI_BUF); |
497 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); | 513 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); |
498 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); | 514 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); |
499 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 515 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
500 | 516 | ||
501 | /* | 517 | /* |
@@ -603,7 +619,7 @@ xfs_trans_bhold(xfs_trans_t *tp, | |||
603 | 619 | ||
604 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 620 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
605 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); | 621 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); |
606 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); | 622 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); |
607 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 623 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
608 | bip->bli_flags |= XFS_BLI_HOLD; | 624 | bip->bli_flags |= XFS_BLI_HOLD; |
609 | trace_xfs_trans_bhold(bip); | 625 | trace_xfs_trans_bhold(bip); |
@@ -625,7 +641,7 @@ xfs_trans_bhold_release(xfs_trans_t *tp, | |||
625 | 641 | ||
626 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 642 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
627 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); | 643 | ASSERT(!(bip->bli_flags & XFS_BLI_STALE)); |
628 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_CANCEL)); | 644 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_CANCEL)); |
629 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 645 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
630 | ASSERT(bip->bli_flags & XFS_BLI_HOLD); | 646 | ASSERT(bip->bli_flags & XFS_BLI_HOLD); |
631 | bip->bli_flags &= ~XFS_BLI_HOLD; | 647 | bip->bli_flags &= ~XFS_BLI_HOLD; |
@@ -688,7 +704,7 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
688 | bip->bli_flags &= ~XFS_BLI_STALE; | 704 | bip->bli_flags &= ~XFS_BLI_STALE; |
689 | ASSERT(XFS_BUF_ISSTALE(bp)); | 705 | ASSERT(XFS_BUF_ISSTALE(bp)); |
690 | XFS_BUF_UNSTALE(bp); | 706 | XFS_BUF_UNSTALE(bp); |
691 | bip->bli_format.blf_flags &= ~XFS_BLI_CANCEL; | 707 | bip->bli_format.blf_flags &= ~XFS_BLF_CANCEL; |
692 | } | 708 | } |
693 | 709 | ||
694 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); | 710 | lidp = xfs_trans_find_item(tp, (xfs_log_item_t*)bip); |
@@ -696,7 +712,6 @@ xfs_trans_log_buf(xfs_trans_t *tp, | |||
696 | 712 | ||
697 | tp->t_flags |= XFS_TRANS_DIRTY; | 713 | tp->t_flags |= XFS_TRANS_DIRTY; |
698 | lidp->lid_flags |= XFS_LID_DIRTY; | 714 | lidp->lid_flags |= XFS_LID_DIRTY; |
699 | lidp->lid_flags &= ~XFS_LID_BUF_STALE; | ||
700 | bip->bli_flags |= XFS_BLI_LOGGED; | 715 | bip->bli_flags |= XFS_BLI_LOGGED; |
701 | xfs_buf_item_log(bip, first, last); | 716 | xfs_buf_item_log(bip, first, last); |
702 | } | 717 | } |
@@ -747,8 +762,8 @@ xfs_trans_binval( | |||
747 | ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); | 762 | ASSERT(!(XFS_BUF_ISDELAYWRITE(bp))); |
748 | ASSERT(XFS_BUF_ISSTALE(bp)); | 763 | ASSERT(XFS_BUF_ISSTALE(bp)); |
749 | ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); | 764 | ASSERT(!(bip->bli_flags & (XFS_BLI_LOGGED | XFS_BLI_DIRTY))); |
750 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLI_INODE_BUF)); | 765 | ASSERT(!(bip->bli_format.blf_flags & XFS_BLF_INODE_BUF)); |
751 | ASSERT(bip->bli_format.blf_flags & XFS_BLI_CANCEL); | 766 | ASSERT(bip->bli_format.blf_flags & XFS_BLF_CANCEL); |
752 | ASSERT(lidp->lid_flags & XFS_LID_DIRTY); | 767 | ASSERT(lidp->lid_flags & XFS_LID_DIRTY); |
753 | ASSERT(tp->t_flags & XFS_TRANS_DIRTY); | 768 | ASSERT(tp->t_flags & XFS_TRANS_DIRTY); |
754 | return; | 769 | return; |
@@ -759,7 +774,7 @@ xfs_trans_binval( | |||
759 | * in the buf log item. The STALE flag will be used in | 774 | * in the buf log item. The STALE flag will be used in |
760 | * xfs_buf_item_unpin() to determine if it should clean up | 775 | * xfs_buf_item_unpin() to determine if it should clean up |
761 | * when the last reference to the buf item is given up. | 776 | * when the last reference to the buf item is given up. |
762 | * We set the XFS_BLI_CANCEL flag in the buf log format structure | 777 | * We set the XFS_BLF_CANCEL flag in the buf log format structure |
763 | * and log the buf item. This will be used at recovery time | 778 | * and log the buf item. This will be used at recovery time |
764 | * to determine that copies of the buffer in the log before | 779 | * to determine that copies of the buffer in the log before |
765 | * this should not be replayed. | 780 | * this should not be replayed. |
@@ -777,26 +792,26 @@ xfs_trans_binval( | |||
777 | XFS_BUF_UNDELAYWRITE(bp); | 792 | XFS_BUF_UNDELAYWRITE(bp); |
778 | XFS_BUF_STALE(bp); | 793 | XFS_BUF_STALE(bp); |
779 | bip->bli_flags |= XFS_BLI_STALE; | 794 | bip->bli_flags |= XFS_BLI_STALE; |
780 | bip->bli_flags &= ~(XFS_BLI_LOGGED | XFS_BLI_DIRTY); | 795 | bip->bli_flags &= ~(XFS_BLI_INODE_BUF | XFS_BLI_LOGGED | XFS_BLI_DIRTY); |
781 | bip->bli_format.blf_flags &= ~XFS_BLI_INODE_BUF; | 796 | bip->bli_format.blf_flags &= ~XFS_BLF_INODE_BUF; |
782 | bip->bli_format.blf_flags |= XFS_BLI_CANCEL; | 797 | bip->bli_format.blf_flags |= XFS_BLF_CANCEL; |
783 | memset((char *)(bip->bli_format.blf_data_map), 0, | 798 | memset((char *)(bip->bli_format.blf_data_map), 0, |
784 | (bip->bli_format.blf_map_size * sizeof(uint))); | 799 | (bip->bli_format.blf_map_size * sizeof(uint))); |
785 | lidp->lid_flags |= XFS_LID_DIRTY|XFS_LID_BUF_STALE; | 800 | lidp->lid_flags |= XFS_LID_DIRTY; |
786 | tp->t_flags |= XFS_TRANS_DIRTY; | 801 | tp->t_flags |= XFS_TRANS_DIRTY; |
787 | } | 802 | } |
788 | 803 | ||
789 | /* | 804 | /* |
790 | * This call is used to indicate that the buffer contains on-disk | 805 | * This call is used to indicate that the buffer contains on-disk inodes which |
791 | * inodes which must be handled specially during recovery. They | 806 | * must be handled specially during recovery. They require special handling |
792 | * require special handling because only the di_next_unlinked from | 807 | * because only the di_next_unlinked from the inodes in the buffer should be |
793 | * the inodes in the buffer should be recovered. The rest of the | 808 | * recovered. The rest of the data in the buffer is logged via the inodes |
794 | * data in the buffer is logged via the inodes themselves. | 809 | * themselves. |
795 | * | 810 | * |
796 | * All we do is set the XFS_BLI_INODE_BUF flag in the buffer's log | 811 | * All we do is set the XFS_BLI_INODE_BUF flag in the items flags so it can be |
797 | * format structure so that we'll know what to do at recovery time. | 812 | * transferred to the buffer's log format structure so that we'll know what to |
813 | * do at recovery time. | ||
798 | */ | 814 | */ |
799 | /* ARGSUSED */ | ||
800 | void | 815 | void |
801 | xfs_trans_inode_buf( | 816 | xfs_trans_inode_buf( |
802 | xfs_trans_t *tp, | 817 | xfs_trans_t *tp, |
@@ -811,7 +826,7 @@ xfs_trans_inode_buf( | |||
811 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 826 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
812 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 827 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
813 | 828 | ||
814 | bip->bli_format.blf_flags |= XFS_BLI_INODE_BUF; | 829 | bip->bli_flags |= XFS_BLI_INODE_BUF; |
815 | } | 830 | } |
816 | 831 | ||
817 | /* | 832 | /* |
@@ -893,120 +908,12 @@ xfs_trans_dquot_buf( | |||
893 | ASSERT(XFS_BUF_ISBUSY(bp)); | 908 | ASSERT(XFS_BUF_ISBUSY(bp)); |
894 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); | 909 | ASSERT(XFS_BUF_FSPRIVATE2(bp, xfs_trans_t *) == tp); |
895 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); | 910 | ASSERT(XFS_BUF_FSPRIVATE(bp, void *) != NULL); |
896 | ASSERT(type == XFS_BLI_UDQUOT_BUF || | 911 | ASSERT(type == XFS_BLF_UDQUOT_BUF || |
897 | type == XFS_BLI_PDQUOT_BUF || | 912 | type == XFS_BLF_PDQUOT_BUF || |
898 | type == XFS_BLI_GDQUOT_BUF); | 913 | type == XFS_BLF_GDQUOT_BUF); |
899 | 914 | ||
900 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); | 915 | bip = XFS_BUF_FSPRIVATE(bp, xfs_buf_log_item_t *); |
901 | ASSERT(atomic_read(&bip->bli_refcount) > 0); | 916 | ASSERT(atomic_read(&bip->bli_refcount) > 0); |
902 | 917 | ||
903 | bip->bli_format.blf_flags |= type; | 918 | bip->bli_format.blf_flags |= type; |
904 | } | 919 | } |
905 | |||
906 | /* | ||
907 | * Check to see if a buffer matching the given parameters is already | ||
908 | * a part of the given transaction. Only check the first, embedded | ||
909 | * chunk, since we don't want to spend all day scanning large transactions. | ||
910 | */ | ||
911 | STATIC xfs_buf_t * | ||
912 | xfs_trans_buf_item_match( | ||
913 | xfs_trans_t *tp, | ||
914 | xfs_buftarg_t *target, | ||
915 | xfs_daddr_t blkno, | ||
916 | int len) | ||
917 | { | ||
918 | xfs_log_item_chunk_t *licp; | ||
919 | xfs_log_item_desc_t *lidp; | ||
920 | xfs_buf_log_item_t *blip; | ||
921 | xfs_buf_t *bp; | ||
922 | int i; | ||
923 | |||
924 | bp = NULL; | ||
925 | len = BBTOB(len); | ||
926 | licp = &tp->t_items; | ||
927 | if (!xfs_lic_are_all_free(licp)) { | ||
928 | for (i = 0; i < licp->lic_unused; i++) { | ||
929 | /* | ||
930 | * Skip unoccupied slots. | ||
931 | */ | ||
932 | if (xfs_lic_isfree(licp, i)) { | ||
933 | continue; | ||
934 | } | ||
935 | |||
936 | lidp = xfs_lic_slot(licp, i); | ||
937 | blip = (xfs_buf_log_item_t *)lidp->lid_item; | ||
938 | if (blip->bli_item.li_type != XFS_LI_BUF) { | ||
939 | continue; | ||
940 | } | ||
941 | |||
942 | bp = blip->bli_buf; | ||
943 | if ((XFS_BUF_TARGET(bp) == target) && | ||
944 | (XFS_BUF_ADDR(bp) == blkno) && | ||
945 | (XFS_BUF_COUNT(bp) == len)) { | ||
946 | /* | ||
947 | * We found it. Break out and | ||
948 | * return the pointer to the buffer. | ||
949 | */ | ||
950 | break; | ||
951 | } else { | ||
952 | bp = NULL; | ||
953 | } | ||
954 | } | ||
955 | } | ||
956 | return bp; | ||
957 | } | ||
958 | |||
959 | /* | ||
960 | * Check to see if a buffer matching the given parameters is already | ||
961 | * a part of the given transaction. Check all the chunks, we | ||
962 | * want to be thorough. | ||
963 | */ | ||
964 | STATIC xfs_buf_t * | ||
965 | xfs_trans_buf_item_match_all( | ||
966 | xfs_trans_t *tp, | ||
967 | xfs_buftarg_t *target, | ||
968 | xfs_daddr_t blkno, | ||
969 | int len) | ||
970 | { | ||
971 | xfs_log_item_chunk_t *licp; | ||
972 | xfs_log_item_desc_t *lidp; | ||
973 | xfs_buf_log_item_t *blip; | ||
974 | xfs_buf_t *bp; | ||
975 | int i; | ||
976 | |||
977 | bp = NULL; | ||
978 | len = BBTOB(len); | ||
979 | for (licp = &tp->t_items; licp != NULL; licp = licp->lic_next) { | ||
980 | if (xfs_lic_are_all_free(licp)) { | ||
981 | ASSERT(licp == &tp->t_items); | ||
982 | ASSERT(licp->lic_next == NULL); | ||
983 | return NULL; | ||
984 | } | ||
985 | for (i = 0; i < licp->lic_unused; i++) { | ||
986 | /* | ||
987 | * Skip unoccupied slots. | ||
988 | */ | ||
989 | if (xfs_lic_isfree(licp, i)) { | ||
990 | continue; | ||
991 | } | ||
992 | |||
993 | lidp = xfs_lic_slot(licp, i); | ||
994 | blip = (xfs_buf_log_item_t *)lidp->lid_item; | ||
995 | if (blip->bli_item.li_type != XFS_LI_BUF) { | ||
996 | continue; | ||
997 | } | ||
998 | |||
999 | bp = blip->bli_buf; | ||
1000 | if ((XFS_BUF_TARGET(bp) == target) && | ||
1001 | (XFS_BUF_ADDR(bp) == blkno) && | ||
1002 | (XFS_BUF_COUNT(bp) == len)) { | ||
1003 | /* | ||
1004 | * We found it. Break out and | ||
1005 | * return the pointer to the buffer. | ||
1006 | */ | ||
1007 | return bp; | ||
1008 | } | ||
1009 | } | ||
1010 | } | ||
1011 | return NULL; | ||
1012 | } | ||