diff options
Diffstat (limited to 'fs/xfs/xfs_bmap.c')
-rw-r--r-- | fs/xfs/xfs_bmap.c | 942 |
1 files changed, 304 insertions, 638 deletions
diff --git a/fs/xfs/xfs_bmap.c b/fs/xfs/xfs_bmap.c index 8971fb09d387..98251cdc52aa 100644 --- a/fs/xfs/xfs_bmap.c +++ b/fs/xfs/xfs_bmap.c | |||
@@ -54,6 +54,7 @@ | |||
54 | #include "xfs_buf_item.h" | 54 | #include "xfs_buf_item.h" |
55 | #include "xfs_filestream.h" | 55 | #include "xfs_filestream.h" |
56 | #include "xfs_vnodeops.h" | 56 | #include "xfs_vnodeops.h" |
57 | #include "xfs_trace.h" | ||
57 | 58 | ||
58 | 59 | ||
59 | #ifdef DEBUG | 60 | #ifdef DEBUG |
@@ -272,71 +273,6 @@ xfs_bmap_isaeof( | |||
272 | int whichfork, /* data or attribute fork */ | 273 | int whichfork, /* data or attribute fork */ |
273 | char *aeof); /* return value */ | 274 | char *aeof); /* return value */ |
274 | 275 | ||
275 | #ifdef XFS_BMAP_TRACE | ||
276 | /* | ||
277 | * Add bmap trace entry prior to a call to xfs_iext_remove. | ||
278 | */ | ||
279 | STATIC void | ||
280 | xfs_bmap_trace_delete( | ||
281 | const char *fname, /* function name */ | ||
282 | char *desc, /* operation description */ | ||
283 | xfs_inode_t *ip, /* incore inode pointer */ | ||
284 | xfs_extnum_t idx, /* index of entry(entries) deleted */ | ||
285 | xfs_extnum_t cnt, /* count of entries deleted, 1 or 2 */ | ||
286 | int whichfork); /* data or attr fork */ | ||
287 | |||
288 | /* | ||
289 | * Add bmap trace entry prior to a call to xfs_iext_insert, or | ||
290 | * reading in the extents list from the disk (in the btree). | ||
291 | */ | ||
292 | STATIC void | ||
293 | xfs_bmap_trace_insert( | ||
294 | const char *fname, /* function name */ | ||
295 | char *desc, /* operation description */ | ||
296 | xfs_inode_t *ip, /* incore inode pointer */ | ||
297 | xfs_extnum_t idx, /* index of entry(entries) inserted */ | ||
298 | xfs_extnum_t cnt, /* count of entries inserted, 1 or 2 */ | ||
299 | xfs_bmbt_irec_t *r1, /* inserted record 1 */ | ||
300 | xfs_bmbt_irec_t *r2, /* inserted record 2 or null */ | ||
301 | int whichfork); /* data or attr fork */ | ||
302 | |||
303 | /* | ||
304 | * Add bmap trace entry after updating an extent record in place. | ||
305 | */ | ||
306 | STATIC void | ||
307 | xfs_bmap_trace_post_update( | ||
308 | const char *fname, /* function name */ | ||
309 | char *desc, /* operation description */ | ||
310 | xfs_inode_t *ip, /* incore inode pointer */ | ||
311 | xfs_extnum_t idx, /* index of entry updated */ | ||
312 | int whichfork); /* data or attr fork */ | ||
313 | |||
314 | /* | ||
315 | * Add bmap trace entry prior to updating an extent record in place. | ||
316 | */ | ||
317 | STATIC void | ||
318 | xfs_bmap_trace_pre_update( | ||
319 | const char *fname, /* function name */ | ||
320 | char *desc, /* operation description */ | ||
321 | xfs_inode_t *ip, /* incore inode pointer */ | ||
322 | xfs_extnum_t idx, /* index of entry to be updated */ | ||
323 | int whichfork); /* data or attr fork */ | ||
324 | |||
325 | #define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) \ | ||
326 | xfs_bmap_trace_delete(__func__,d,ip,i,c,w) | ||
327 | #define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) \ | ||
328 | xfs_bmap_trace_insert(__func__,d,ip,i,c,r1,r2,w) | ||
329 | #define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) \ | ||
330 | xfs_bmap_trace_post_update(__func__,d,ip,i,w) | ||
331 | #define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) \ | ||
332 | xfs_bmap_trace_pre_update(__func__,d,ip,i,w) | ||
333 | #else | ||
334 | #define XFS_BMAP_TRACE_DELETE(d,ip,i,c,w) | ||
335 | #define XFS_BMAP_TRACE_INSERT(d,ip,i,c,r1,r2,w) | ||
336 | #define XFS_BMAP_TRACE_POST_UPDATE(d,ip,i,w) | ||
337 | #define XFS_BMAP_TRACE_PRE_UPDATE(d,ip,i,w) | ||
338 | #endif /* XFS_BMAP_TRACE */ | ||
339 | |||
340 | /* | 276 | /* |
341 | * Compute the worst-case number of indirect blocks that will be used | 277 | * Compute the worst-case number of indirect blocks that will be used |
342 | * for ip's delayed extent of length "len". | 278 | * for ip's delayed extent of length "len". |
@@ -363,18 +299,6 @@ xfs_bmap_validate_ret( | |||
363 | #define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) | 299 | #define xfs_bmap_validate_ret(bno,len,flags,mval,onmap,nmap) |
364 | #endif /* DEBUG */ | 300 | #endif /* DEBUG */ |
365 | 301 | ||
366 | #if defined(XFS_RW_TRACE) | ||
367 | STATIC void | ||
368 | xfs_bunmap_trace( | ||
369 | xfs_inode_t *ip, | ||
370 | xfs_fileoff_t bno, | ||
371 | xfs_filblks_t len, | ||
372 | int flags, | ||
373 | inst_t *ra); | ||
374 | #else | ||
375 | #define xfs_bunmap_trace(ip, bno, len, flags, ra) | ||
376 | #endif /* XFS_RW_TRACE */ | ||
377 | |||
378 | STATIC int | 302 | STATIC int |
379 | xfs_bmap_count_tree( | 303 | xfs_bmap_count_tree( |
380 | xfs_mount_t *mp, | 304 | xfs_mount_t *mp, |
@@ -590,9 +514,9 @@ xfs_bmap_add_extent( | |||
590 | * already extents in the list. | 514 | * already extents in the list. |
591 | */ | 515 | */ |
592 | if (nextents == 0) { | 516 | if (nextents == 0) { |
593 | XFS_BMAP_TRACE_INSERT("insert empty", ip, 0, 1, new, NULL, | 517 | xfs_iext_insert(ip, 0, 1, new, |
594 | whichfork); | 518 | whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); |
595 | xfs_iext_insert(ifp, 0, 1, new); | 519 | |
596 | ASSERT(cur == NULL); | 520 | ASSERT(cur == NULL); |
597 | ifp->if_lastex = 0; | 521 | ifp->if_lastex = 0; |
598 | if (!isnullstartblock(new->br_startblock)) { | 522 | if (!isnullstartblock(new->br_startblock)) { |
@@ -759,26 +683,10 @@ xfs_bmap_add_extent_delay_real( | |||
759 | xfs_filblks_t temp=0; /* value for dnew calculations */ | 683 | xfs_filblks_t temp=0; /* value for dnew calculations */ |
760 | xfs_filblks_t temp2=0;/* value for dnew calculations */ | 684 | xfs_filblks_t temp2=0;/* value for dnew calculations */ |
761 | int tmp_rval; /* partial logging flags */ | 685 | int tmp_rval; /* partial logging flags */ |
762 | enum { /* bit number definitions for state */ | ||
763 | LEFT_CONTIG, RIGHT_CONTIG, | ||
764 | LEFT_FILLING, RIGHT_FILLING, | ||
765 | LEFT_DELAY, RIGHT_DELAY, | ||
766 | LEFT_VALID, RIGHT_VALID | ||
767 | }; | ||
768 | 686 | ||
769 | #define LEFT r[0] | 687 | #define LEFT r[0] |
770 | #define RIGHT r[1] | 688 | #define RIGHT r[1] |
771 | #define PREV r[2] | 689 | #define PREV r[2] |
772 | #define MASK(b) (1 << (b)) | ||
773 | #define MASK2(a,b) (MASK(a) | MASK(b)) | ||
774 | #define MASK3(a,b,c) (MASK2(a,b) | MASK(c)) | ||
775 | #define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d)) | ||
776 | #define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) | ||
777 | #define STATE_TEST(b) (state & MASK(b)) | ||
778 | #define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ | ||
779 | ((state &= ~MASK(b)), 0)) | ||
780 | #define SWITCH_STATE \ | ||
781 | (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG)) | ||
782 | 690 | ||
783 | /* | 691 | /* |
784 | * Set up a bunch of variables to make the tests simpler. | 692 | * Set up a bunch of variables to make the tests simpler. |
@@ -790,69 +698,80 @@ xfs_bmap_add_extent_delay_real( | |||
790 | new_endoff = new->br_startoff + new->br_blockcount; | 698 | new_endoff = new->br_startoff + new->br_blockcount; |
791 | ASSERT(PREV.br_startoff <= new->br_startoff); | 699 | ASSERT(PREV.br_startoff <= new->br_startoff); |
792 | ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); | 700 | ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); |
701 | |||
793 | /* | 702 | /* |
794 | * Set flags determining what part of the previous delayed allocation | 703 | * Set flags determining what part of the previous delayed allocation |
795 | * extent is being replaced by a real allocation. | 704 | * extent is being replaced by a real allocation. |
796 | */ | 705 | */ |
797 | STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); | 706 | if (PREV.br_startoff == new->br_startoff) |
798 | STATE_SET(RIGHT_FILLING, | 707 | state |= BMAP_LEFT_FILLING; |
799 | PREV.br_startoff + PREV.br_blockcount == new_endoff); | 708 | if (PREV.br_startoff + PREV.br_blockcount == new_endoff) |
709 | state |= BMAP_RIGHT_FILLING; | ||
710 | |||
800 | /* | 711 | /* |
801 | * Check and set flags if this segment has a left neighbor. | 712 | * Check and set flags if this segment has a left neighbor. |
802 | * Don't set contiguous if the combined extent would be too large. | 713 | * Don't set contiguous if the combined extent would be too large. |
803 | */ | 714 | */ |
804 | if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { | 715 | if (idx > 0) { |
716 | state |= BMAP_LEFT_VALID; | ||
805 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); | 717 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); |
806 | STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock)); | 718 | |
719 | if (isnullstartblock(LEFT.br_startblock)) | ||
720 | state |= BMAP_LEFT_DELAY; | ||
807 | } | 721 | } |
808 | STATE_SET(LEFT_CONTIG, | 722 | |
809 | STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && | 723 | if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && |
810 | LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && | 724 | LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && |
811 | LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && | 725 | LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && |
812 | LEFT.br_state == new->br_state && | 726 | LEFT.br_state == new->br_state && |
813 | LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); | 727 | LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) |
728 | state |= BMAP_LEFT_CONTIG; | ||
729 | |||
814 | /* | 730 | /* |
815 | * Check and set flags if this segment has a right neighbor. | 731 | * Check and set flags if this segment has a right neighbor. |
816 | * Don't set contiguous if the combined extent would be too large. | 732 | * Don't set contiguous if the combined extent would be too large. |
817 | * Also check for all-three-contiguous being too large. | 733 | * Also check for all-three-contiguous being too large. |
818 | */ | 734 | */ |
819 | if (STATE_SET_TEST(RIGHT_VALID, | 735 | if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { |
820 | idx < | 736 | state |= BMAP_RIGHT_VALID; |
821 | ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { | ||
822 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); | 737 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); |
823 | STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock)); | 738 | |
739 | if (isnullstartblock(RIGHT.br_startblock)) | ||
740 | state |= BMAP_RIGHT_DELAY; | ||
824 | } | 741 | } |
825 | STATE_SET(RIGHT_CONTIG, | 742 | |
826 | STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && | 743 | if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && |
827 | new_endoff == RIGHT.br_startoff && | 744 | new_endoff == RIGHT.br_startoff && |
828 | new->br_startblock + new->br_blockcount == | 745 | new->br_startblock + new->br_blockcount == RIGHT.br_startblock && |
829 | RIGHT.br_startblock && | 746 | new->br_state == RIGHT.br_state && |
830 | new->br_state == RIGHT.br_state && | 747 | new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && |
831 | new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && | 748 | ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | |
832 | ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != | 749 | BMAP_RIGHT_FILLING)) != |
833 | MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || | 750 | (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | |
834 | LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount | 751 | BMAP_RIGHT_FILLING) || |
835 | <= MAXEXTLEN)); | 752 | LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount |
753 | <= MAXEXTLEN)) | ||
754 | state |= BMAP_RIGHT_CONTIG; | ||
755 | |||
836 | error = 0; | 756 | error = 0; |
837 | /* | 757 | /* |
838 | * Switch out based on the FILLING and CONTIG state bits. | 758 | * Switch out based on the FILLING and CONTIG state bits. |
839 | */ | 759 | */ |
840 | switch (SWITCH_STATE) { | 760 | switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | |
841 | 761 | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { | |
842 | case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): | 762 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | |
763 | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: | ||
843 | /* | 764 | /* |
844 | * Filling in all of a previously delayed allocation extent. | 765 | * Filling in all of a previously delayed allocation extent. |
845 | * The left and right neighbors are both contiguous with new. | 766 | * The left and right neighbors are both contiguous with new. |
846 | */ | 767 | */ |
847 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC|RC", ip, idx - 1, | 768 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
848 | XFS_DATA_FORK); | ||
849 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 769 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
850 | LEFT.br_blockcount + PREV.br_blockcount + | 770 | LEFT.br_blockcount + PREV.br_blockcount + |
851 | RIGHT.br_blockcount); | 771 | RIGHT.br_blockcount); |
852 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1, | 772 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
853 | XFS_DATA_FORK); | 773 | |
854 | XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK); | 774 | xfs_iext_remove(ip, idx, 2, state); |
855 | xfs_iext_remove(ifp, idx, 2); | ||
856 | ip->i_df.if_lastex = idx - 1; | 775 | ip->i_df.if_lastex = idx - 1; |
857 | ip->i_d.di_nextents--; | 776 | ip->i_d.di_nextents--; |
858 | if (cur == NULL) | 777 | if (cur == NULL) |
@@ -885,20 +804,18 @@ xfs_bmap_add_extent_delay_real( | |||
885 | RIGHT.br_blockcount; | 804 | RIGHT.br_blockcount; |
886 | break; | 805 | break; |
887 | 806 | ||
888 | case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): | 807 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: |
889 | /* | 808 | /* |
890 | * Filling in all of a previously delayed allocation extent. | 809 | * Filling in all of a previously delayed allocation extent. |
891 | * The left neighbor is contiguous, the right is not. | 810 | * The left neighbor is contiguous, the right is not. |
892 | */ | 811 | */ |
893 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC", ip, idx - 1, | 812 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
894 | XFS_DATA_FORK); | ||
895 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 813 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
896 | LEFT.br_blockcount + PREV.br_blockcount); | 814 | LEFT.br_blockcount + PREV.br_blockcount); |
897 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC", ip, idx - 1, | 815 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
898 | XFS_DATA_FORK); | 816 | |
899 | ip->i_df.if_lastex = idx - 1; | 817 | ip->i_df.if_lastex = idx - 1; |
900 | XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK); | 818 | xfs_iext_remove(ip, idx, 1, state); |
901 | xfs_iext_remove(ifp, idx, 1); | ||
902 | if (cur == NULL) | 819 | if (cur == NULL) |
903 | rval = XFS_ILOG_DEXT; | 820 | rval = XFS_ILOG_DEXT; |
904 | else { | 821 | else { |
@@ -921,19 +838,19 @@ xfs_bmap_add_extent_delay_real( | |||
921 | PREV.br_blockcount; | 838 | PREV.br_blockcount; |
922 | break; | 839 | break; |
923 | 840 | ||
924 | case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): | 841 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
925 | /* | 842 | /* |
926 | * Filling in all of a previously delayed allocation extent. | 843 | * Filling in all of a previously delayed allocation extent. |
927 | * The right neighbor is contiguous, the left is not. | 844 | * The right neighbor is contiguous, the left is not. |
928 | */ | 845 | */ |
929 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|RC", ip, idx, XFS_DATA_FORK); | 846 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
930 | xfs_bmbt_set_startblock(ep, new->br_startblock); | 847 | xfs_bmbt_set_startblock(ep, new->br_startblock); |
931 | xfs_bmbt_set_blockcount(ep, | 848 | xfs_bmbt_set_blockcount(ep, |
932 | PREV.br_blockcount + RIGHT.br_blockcount); | 849 | PREV.br_blockcount + RIGHT.br_blockcount); |
933 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF|RC", ip, idx, XFS_DATA_FORK); | 850 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
851 | |||
934 | ip->i_df.if_lastex = idx; | 852 | ip->i_df.if_lastex = idx; |
935 | XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK); | 853 | xfs_iext_remove(ip, idx + 1, 1, state); |
936 | xfs_iext_remove(ifp, idx + 1, 1); | ||
937 | if (cur == NULL) | 854 | if (cur == NULL) |
938 | rval = XFS_ILOG_DEXT; | 855 | rval = XFS_ILOG_DEXT; |
939 | else { | 856 | else { |
@@ -956,15 +873,16 @@ xfs_bmap_add_extent_delay_real( | |||
956 | RIGHT.br_blockcount; | 873 | RIGHT.br_blockcount; |
957 | break; | 874 | break; |
958 | 875 | ||
959 | case MASK2(LEFT_FILLING, RIGHT_FILLING): | 876 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: |
960 | /* | 877 | /* |
961 | * Filling in all of a previously delayed allocation extent. | 878 | * Filling in all of a previously delayed allocation extent. |
962 | * Neither the left nor right neighbors are contiguous with | 879 | * Neither the left nor right neighbors are contiguous with |
963 | * the new one. | 880 | * the new one. |
964 | */ | 881 | */ |
965 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF", ip, idx, XFS_DATA_FORK); | 882 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
966 | xfs_bmbt_set_startblock(ep, new->br_startblock); | 883 | xfs_bmbt_set_startblock(ep, new->br_startblock); |
967 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF", ip, idx, XFS_DATA_FORK); | 884 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
885 | |||
968 | ip->i_df.if_lastex = idx; | 886 | ip->i_df.if_lastex = idx; |
969 | ip->i_d.di_nextents++; | 887 | ip->i_d.di_nextents++; |
970 | if (cur == NULL) | 888 | if (cur == NULL) |
@@ -987,19 +905,20 @@ xfs_bmap_add_extent_delay_real( | |||
987 | temp2 = new->br_blockcount; | 905 | temp2 = new->br_blockcount; |
988 | break; | 906 | break; |
989 | 907 | ||
990 | case MASK2(LEFT_FILLING, LEFT_CONTIG): | 908 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: |
991 | /* | 909 | /* |
992 | * Filling in the first part of a previous delayed allocation. | 910 | * Filling in the first part of a previous delayed allocation. |
993 | * The left neighbor is contiguous. | 911 | * The left neighbor is contiguous. |
994 | */ | 912 | */ |
995 | XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx - 1, XFS_DATA_FORK); | 913 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
996 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 914 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
997 | LEFT.br_blockcount + new->br_blockcount); | 915 | LEFT.br_blockcount + new->br_blockcount); |
998 | xfs_bmbt_set_startoff(ep, | 916 | xfs_bmbt_set_startoff(ep, |
999 | PREV.br_startoff + new->br_blockcount); | 917 | PREV.br_startoff + new->br_blockcount); |
1000 | XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx - 1, XFS_DATA_FORK); | 918 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
919 | |||
1001 | temp = PREV.br_blockcount - new->br_blockcount; | 920 | temp = PREV.br_blockcount - new->br_blockcount; |
1002 | XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK); | 921 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1003 | xfs_bmbt_set_blockcount(ep, temp); | 922 | xfs_bmbt_set_blockcount(ep, temp); |
1004 | ip->i_df.if_lastex = idx - 1; | 923 | ip->i_df.if_lastex = idx - 1; |
1005 | if (cur == NULL) | 924 | if (cur == NULL) |
@@ -1021,7 +940,7 @@ xfs_bmap_add_extent_delay_real( | |||
1021 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), | 940 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), |
1022 | startblockval(PREV.br_startblock)); | 941 | startblockval(PREV.br_startblock)); |
1023 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 942 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
1024 | XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, XFS_DATA_FORK); | 943 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1025 | *dnew = temp; | 944 | *dnew = temp; |
1026 | /* DELTA: The boundary between two in-core extents moved. */ | 945 | /* DELTA: The boundary between two in-core extents moved. */ |
1027 | temp = LEFT.br_startoff; | 946 | temp = LEFT.br_startoff; |
@@ -1029,18 +948,16 @@ xfs_bmap_add_extent_delay_real( | |||
1029 | PREV.br_blockcount; | 948 | PREV.br_blockcount; |
1030 | break; | 949 | break; |
1031 | 950 | ||
1032 | case MASK(LEFT_FILLING): | 951 | case BMAP_LEFT_FILLING: |
1033 | /* | 952 | /* |
1034 | * Filling in the first part of a previous delayed allocation. | 953 | * Filling in the first part of a previous delayed allocation. |
1035 | * The left neighbor is not contiguous. | 954 | * The left neighbor is not contiguous. |
1036 | */ | 955 | */ |
1037 | XFS_BMAP_TRACE_PRE_UPDATE("LF", ip, idx, XFS_DATA_FORK); | 956 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1038 | xfs_bmbt_set_startoff(ep, new_endoff); | 957 | xfs_bmbt_set_startoff(ep, new_endoff); |
1039 | temp = PREV.br_blockcount - new->br_blockcount; | 958 | temp = PREV.br_blockcount - new->br_blockcount; |
1040 | xfs_bmbt_set_blockcount(ep, temp); | 959 | xfs_bmbt_set_blockcount(ep, temp); |
1041 | XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL, | 960 | xfs_iext_insert(ip, idx, 1, new, state); |
1042 | XFS_DATA_FORK); | ||
1043 | xfs_iext_insert(ifp, idx, 1, new); | ||
1044 | ip->i_df.if_lastex = idx; | 961 | ip->i_df.if_lastex = idx; |
1045 | ip->i_d.di_nextents++; | 962 | ip->i_d.di_nextents++; |
1046 | if (cur == NULL) | 963 | if (cur == NULL) |
@@ -1071,27 +988,27 @@ xfs_bmap_add_extent_delay_real( | |||
1071 | (cur ? cur->bc_private.b.allocated : 0)); | 988 | (cur ? cur->bc_private.b.allocated : 0)); |
1072 | ep = xfs_iext_get_ext(ifp, idx + 1); | 989 | ep = xfs_iext_get_ext(ifp, idx + 1); |
1073 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 990 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
1074 | XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx + 1, XFS_DATA_FORK); | 991 | trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); |
1075 | *dnew = temp; | 992 | *dnew = temp; |
1076 | /* DELTA: One in-core extent is split in two. */ | 993 | /* DELTA: One in-core extent is split in two. */ |
1077 | temp = PREV.br_startoff; | 994 | temp = PREV.br_startoff; |
1078 | temp2 = PREV.br_blockcount; | 995 | temp2 = PREV.br_blockcount; |
1079 | break; | 996 | break; |
1080 | 997 | ||
1081 | case MASK2(RIGHT_FILLING, RIGHT_CONTIG): | 998 | case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
1082 | /* | 999 | /* |
1083 | * Filling in the last part of a previous delayed allocation. | 1000 | * Filling in the last part of a previous delayed allocation. |
1084 | * The right neighbor is contiguous with the new allocation. | 1001 | * The right neighbor is contiguous with the new allocation. |
1085 | */ | 1002 | */ |
1086 | temp = PREV.br_blockcount - new->br_blockcount; | 1003 | temp = PREV.br_blockcount - new->br_blockcount; |
1087 | XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK); | 1004 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1088 | XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx + 1, XFS_DATA_FORK); | 1005 | trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); |
1089 | xfs_bmbt_set_blockcount(ep, temp); | 1006 | xfs_bmbt_set_blockcount(ep, temp); |
1090 | xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), | 1007 | xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), |
1091 | new->br_startoff, new->br_startblock, | 1008 | new->br_startoff, new->br_startblock, |
1092 | new->br_blockcount + RIGHT.br_blockcount, | 1009 | new->br_blockcount + RIGHT.br_blockcount, |
1093 | RIGHT.br_state); | 1010 | RIGHT.br_state); |
1094 | XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx + 1, XFS_DATA_FORK); | 1011 | trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); |
1095 | ip->i_df.if_lastex = idx + 1; | 1012 | ip->i_df.if_lastex = idx + 1; |
1096 | if (cur == NULL) | 1013 | if (cur == NULL) |
1097 | rval = XFS_ILOG_DEXT; | 1014 | rval = XFS_ILOG_DEXT; |
@@ -1112,7 +1029,7 @@ xfs_bmap_add_extent_delay_real( | |||
1112 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), | 1029 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), |
1113 | startblockval(PREV.br_startblock)); | 1030 | startblockval(PREV.br_startblock)); |
1114 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 1031 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
1115 | XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, XFS_DATA_FORK); | 1032 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1116 | *dnew = temp; | 1033 | *dnew = temp; |
1117 | /* DELTA: The boundary between two in-core extents moved. */ | 1034 | /* DELTA: The boundary between two in-core extents moved. */ |
1118 | temp = PREV.br_startoff; | 1035 | temp = PREV.br_startoff; |
@@ -1120,17 +1037,15 @@ xfs_bmap_add_extent_delay_real( | |||
1120 | RIGHT.br_blockcount; | 1037 | RIGHT.br_blockcount; |
1121 | break; | 1038 | break; |
1122 | 1039 | ||
1123 | case MASK(RIGHT_FILLING): | 1040 | case BMAP_RIGHT_FILLING: |
1124 | /* | 1041 | /* |
1125 | * Filling in the last part of a previous delayed allocation. | 1042 | * Filling in the last part of a previous delayed allocation. |
1126 | * The right neighbor is not contiguous. | 1043 | * The right neighbor is not contiguous. |
1127 | */ | 1044 | */ |
1128 | temp = PREV.br_blockcount - new->br_blockcount; | 1045 | temp = PREV.br_blockcount - new->br_blockcount; |
1129 | XFS_BMAP_TRACE_PRE_UPDATE("RF", ip, idx, XFS_DATA_FORK); | 1046 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1130 | xfs_bmbt_set_blockcount(ep, temp); | 1047 | xfs_bmbt_set_blockcount(ep, temp); |
1131 | XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL, | 1048 | xfs_iext_insert(ip, idx + 1, 1, new, state); |
1132 | XFS_DATA_FORK); | ||
1133 | xfs_iext_insert(ifp, idx + 1, 1, new); | ||
1134 | ip->i_df.if_lastex = idx + 1; | 1049 | ip->i_df.if_lastex = idx + 1; |
1135 | ip->i_d.di_nextents++; | 1050 | ip->i_d.di_nextents++; |
1136 | if (cur == NULL) | 1051 | if (cur == NULL) |
@@ -1161,7 +1076,7 @@ xfs_bmap_add_extent_delay_real( | |||
1161 | (cur ? cur->bc_private.b.allocated : 0)); | 1076 | (cur ? cur->bc_private.b.allocated : 0)); |
1162 | ep = xfs_iext_get_ext(ifp, idx); | 1077 | ep = xfs_iext_get_ext(ifp, idx); |
1163 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 1078 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
1164 | XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK); | 1079 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1165 | *dnew = temp; | 1080 | *dnew = temp; |
1166 | /* DELTA: One in-core extent is split in two. */ | 1081 | /* DELTA: One in-core extent is split in two. */ |
1167 | temp = PREV.br_startoff; | 1082 | temp = PREV.br_startoff; |
@@ -1175,7 +1090,7 @@ xfs_bmap_add_extent_delay_real( | |||
1175 | * This case is avoided almost all the time. | 1090 | * This case is avoided almost all the time. |
1176 | */ | 1091 | */ |
1177 | temp = new->br_startoff - PREV.br_startoff; | 1092 | temp = new->br_startoff - PREV.br_startoff; |
1178 | XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, XFS_DATA_FORK); | 1093 | trace_xfs_bmap_pre_update(ip, idx, 0, _THIS_IP_); |
1179 | xfs_bmbt_set_blockcount(ep, temp); | 1094 | xfs_bmbt_set_blockcount(ep, temp); |
1180 | r[0] = *new; | 1095 | r[0] = *new; |
1181 | r[1].br_state = PREV.br_state; | 1096 | r[1].br_state = PREV.br_state; |
@@ -1183,9 +1098,7 @@ xfs_bmap_add_extent_delay_real( | |||
1183 | r[1].br_startoff = new_endoff; | 1098 | r[1].br_startoff = new_endoff; |
1184 | temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; | 1099 | temp2 = PREV.br_startoff + PREV.br_blockcount - new_endoff; |
1185 | r[1].br_blockcount = temp2; | 1100 | r[1].br_blockcount = temp2; |
1186 | XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1], | 1101 | xfs_iext_insert(ip, idx + 1, 2, &r[0], state); |
1187 | XFS_DATA_FORK); | ||
1188 | xfs_iext_insert(ifp, idx + 1, 2, &r[0]); | ||
1189 | ip->i_df.if_lastex = idx + 1; | 1102 | ip->i_df.if_lastex = idx + 1; |
1190 | ip->i_d.di_nextents++; | 1103 | ip->i_d.di_nextents++; |
1191 | if (cur == NULL) | 1104 | if (cur == NULL) |
@@ -1242,24 +1155,24 @@ xfs_bmap_add_extent_delay_real( | |||
1242 | } | 1155 | } |
1243 | ep = xfs_iext_get_ext(ifp, idx); | 1156 | ep = xfs_iext_get_ext(ifp, idx); |
1244 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 1157 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
1245 | XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK); | 1158 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1246 | XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); | 1159 | trace_xfs_bmap_pre_update(ip, idx + 2, state, _THIS_IP_); |
1247 | xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), | 1160 | xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx + 2), |
1248 | nullstartblock((int)temp2)); | 1161 | nullstartblock((int)temp2)); |
1249 | XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx + 2, XFS_DATA_FORK); | 1162 | trace_xfs_bmap_post_update(ip, idx + 2, state, _THIS_IP_); |
1250 | *dnew = temp + temp2; | 1163 | *dnew = temp + temp2; |
1251 | /* DELTA: One in-core extent is split in three. */ | 1164 | /* DELTA: One in-core extent is split in three. */ |
1252 | temp = PREV.br_startoff; | 1165 | temp = PREV.br_startoff; |
1253 | temp2 = PREV.br_blockcount; | 1166 | temp2 = PREV.br_blockcount; |
1254 | break; | 1167 | break; |
1255 | 1168 | ||
1256 | case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): | 1169 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
1257 | case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): | 1170 | case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
1258 | case MASK2(LEFT_FILLING, RIGHT_CONTIG): | 1171 | case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: |
1259 | case MASK2(RIGHT_FILLING, LEFT_CONTIG): | 1172 | case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: |
1260 | case MASK2(LEFT_CONTIG, RIGHT_CONTIG): | 1173 | case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
1261 | case MASK(LEFT_CONTIG): | 1174 | case BMAP_LEFT_CONTIG: |
1262 | case MASK(RIGHT_CONTIG): | 1175 | case BMAP_RIGHT_CONTIG: |
1263 | /* | 1176 | /* |
1264 | * These cases are all impossible. | 1177 | * These cases are all impossible. |
1265 | */ | 1178 | */ |
@@ -1279,14 +1192,6 @@ done: | |||
1279 | #undef LEFT | 1192 | #undef LEFT |
1280 | #undef RIGHT | 1193 | #undef RIGHT |
1281 | #undef PREV | 1194 | #undef PREV |
1282 | #undef MASK | ||
1283 | #undef MASK2 | ||
1284 | #undef MASK3 | ||
1285 | #undef MASK4 | ||
1286 | #undef STATE_SET | ||
1287 | #undef STATE_TEST | ||
1288 | #undef STATE_SET_TEST | ||
1289 | #undef SWITCH_STATE | ||
1290 | } | 1195 | } |
1291 | 1196 | ||
1292 | /* | 1197 | /* |
@@ -1316,27 +1221,10 @@ xfs_bmap_add_extent_unwritten_real( | |||
1316 | int state = 0;/* state bits, accessed thru macros */ | 1221 | int state = 0;/* state bits, accessed thru macros */ |
1317 | xfs_filblks_t temp=0; | 1222 | xfs_filblks_t temp=0; |
1318 | xfs_filblks_t temp2=0; | 1223 | xfs_filblks_t temp2=0; |
1319 | enum { /* bit number definitions for state */ | ||
1320 | LEFT_CONTIG, RIGHT_CONTIG, | ||
1321 | LEFT_FILLING, RIGHT_FILLING, | ||
1322 | LEFT_DELAY, RIGHT_DELAY, | ||
1323 | LEFT_VALID, RIGHT_VALID | ||
1324 | }; | ||
1325 | 1224 | ||
1326 | #define LEFT r[0] | 1225 | #define LEFT r[0] |
1327 | #define RIGHT r[1] | 1226 | #define RIGHT r[1] |
1328 | #define PREV r[2] | 1227 | #define PREV r[2] |
1329 | #define MASK(b) (1 << (b)) | ||
1330 | #define MASK2(a,b) (MASK(a) | MASK(b)) | ||
1331 | #define MASK3(a,b,c) (MASK2(a,b) | MASK(c)) | ||
1332 | #define MASK4(a,b,c,d) (MASK3(a,b,c) | MASK(d)) | ||
1333 | #define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) | ||
1334 | #define STATE_TEST(b) (state & MASK(b)) | ||
1335 | #define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ | ||
1336 | ((state &= ~MASK(b)), 0)) | ||
1337 | #define SWITCH_STATE \ | ||
1338 | (state & MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG)) | ||
1339 | |||
1340 | /* | 1228 | /* |
1341 | * Set up a bunch of variables to make the tests simpler. | 1229 | * Set up a bunch of variables to make the tests simpler. |
1342 | */ | 1230 | */ |
@@ -1352,68 +1240,78 @@ xfs_bmap_add_extent_unwritten_real( | |||
1352 | new_endoff = new->br_startoff + new->br_blockcount; | 1240 | new_endoff = new->br_startoff + new->br_blockcount; |
1353 | ASSERT(PREV.br_startoff <= new->br_startoff); | 1241 | ASSERT(PREV.br_startoff <= new->br_startoff); |
1354 | ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); | 1242 | ASSERT(PREV.br_startoff + PREV.br_blockcount >= new_endoff); |
1243 | |||
1355 | /* | 1244 | /* |
1356 | * Set flags determining what part of the previous oldext allocation | 1245 | * Set flags determining what part of the previous oldext allocation |
1357 | * extent is being replaced by a newext allocation. | 1246 | * extent is being replaced by a newext allocation. |
1358 | */ | 1247 | */ |
1359 | STATE_SET(LEFT_FILLING, PREV.br_startoff == new->br_startoff); | 1248 | if (PREV.br_startoff == new->br_startoff) |
1360 | STATE_SET(RIGHT_FILLING, | 1249 | state |= BMAP_LEFT_FILLING; |
1361 | PREV.br_startoff + PREV.br_blockcount == new_endoff); | 1250 | if (PREV.br_startoff + PREV.br_blockcount == new_endoff) |
1251 | state |= BMAP_RIGHT_FILLING; | ||
1252 | |||
1362 | /* | 1253 | /* |
1363 | * Check and set flags if this segment has a left neighbor. | 1254 | * Check and set flags if this segment has a left neighbor. |
1364 | * Don't set contiguous if the combined extent would be too large. | 1255 | * Don't set contiguous if the combined extent would be too large. |
1365 | */ | 1256 | */ |
1366 | if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { | 1257 | if (idx > 0) { |
1258 | state |= BMAP_LEFT_VALID; | ||
1367 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); | 1259 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &LEFT); |
1368 | STATE_SET(LEFT_DELAY, isnullstartblock(LEFT.br_startblock)); | 1260 | |
1261 | if (isnullstartblock(LEFT.br_startblock)) | ||
1262 | state |= BMAP_LEFT_DELAY; | ||
1369 | } | 1263 | } |
1370 | STATE_SET(LEFT_CONTIG, | 1264 | |
1371 | STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && | 1265 | if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && |
1372 | LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && | 1266 | LEFT.br_startoff + LEFT.br_blockcount == new->br_startoff && |
1373 | LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && | 1267 | LEFT.br_startblock + LEFT.br_blockcount == new->br_startblock && |
1374 | LEFT.br_state == newext && | 1268 | LEFT.br_state == newext && |
1375 | LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN); | 1269 | LEFT.br_blockcount + new->br_blockcount <= MAXEXTLEN) |
1270 | state |= BMAP_LEFT_CONTIG; | ||
1271 | |||
1376 | /* | 1272 | /* |
1377 | * Check and set flags if this segment has a right neighbor. | 1273 | * Check and set flags if this segment has a right neighbor. |
1378 | * Don't set contiguous if the combined extent would be too large. | 1274 | * Don't set contiguous if the combined extent would be too large. |
1379 | * Also check for all-three-contiguous being too large. | 1275 | * Also check for all-three-contiguous being too large. |
1380 | */ | 1276 | */ |
1381 | if (STATE_SET_TEST(RIGHT_VALID, | 1277 | if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1) { |
1382 | idx < | 1278 | state |= BMAP_RIGHT_VALID; |
1383 | ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t) - 1)) { | ||
1384 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); | 1279 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx + 1), &RIGHT); |
1385 | STATE_SET(RIGHT_DELAY, isnullstartblock(RIGHT.br_startblock)); | 1280 | if (isnullstartblock(RIGHT.br_startblock)) |
1281 | state |= BMAP_RIGHT_DELAY; | ||
1386 | } | 1282 | } |
1387 | STATE_SET(RIGHT_CONTIG, | 1283 | |
1388 | STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && | 1284 | if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && |
1389 | new_endoff == RIGHT.br_startoff && | 1285 | new_endoff == RIGHT.br_startoff && |
1390 | new->br_startblock + new->br_blockcount == | 1286 | new->br_startblock + new->br_blockcount == RIGHT.br_startblock && |
1391 | RIGHT.br_startblock && | 1287 | newext == RIGHT.br_state && |
1392 | newext == RIGHT.br_state && | 1288 | new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && |
1393 | new->br_blockcount + RIGHT.br_blockcount <= MAXEXTLEN && | 1289 | ((state & (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | |
1394 | ((state & MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING)) != | 1290 | BMAP_RIGHT_FILLING)) != |
1395 | MASK3(LEFT_CONTIG, LEFT_FILLING, RIGHT_FILLING) || | 1291 | (BMAP_LEFT_CONTIG | BMAP_LEFT_FILLING | |
1396 | LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount | 1292 | BMAP_RIGHT_FILLING) || |
1397 | <= MAXEXTLEN)); | 1293 | LEFT.br_blockcount + new->br_blockcount + RIGHT.br_blockcount |
1294 | <= MAXEXTLEN)) | ||
1295 | state |= BMAP_RIGHT_CONTIG; | ||
1296 | |||
1398 | /* | 1297 | /* |
1399 | * Switch out based on the FILLING and CONTIG state bits. | 1298 | * Switch out based on the FILLING and CONTIG state bits. |
1400 | */ | 1299 | */ |
1401 | switch (SWITCH_STATE) { | 1300 | switch (state & (BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | |
1402 | 1301 | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG)) { | |
1403 | case MASK4(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): | 1302 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | |
1303 | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: | ||
1404 | /* | 1304 | /* |
1405 | * Setting all of a previous oldext extent to newext. | 1305 | * Setting all of a previous oldext extent to newext. |
1406 | * The left and right neighbors are both contiguous with new. | 1306 | * The left and right neighbors are both contiguous with new. |
1407 | */ | 1307 | */ |
1408 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC|RC", ip, idx - 1, | 1308 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
1409 | XFS_DATA_FORK); | ||
1410 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 1309 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
1411 | LEFT.br_blockcount + PREV.br_blockcount + | 1310 | LEFT.br_blockcount + PREV.br_blockcount + |
1412 | RIGHT.br_blockcount); | 1311 | RIGHT.br_blockcount); |
1413 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC|RC", ip, idx - 1, | 1312 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
1414 | XFS_DATA_FORK); | 1313 | |
1415 | XFS_BMAP_TRACE_DELETE("LF|RF|LC|RC", ip, idx, 2, XFS_DATA_FORK); | 1314 | xfs_iext_remove(ip, idx, 2, state); |
1416 | xfs_iext_remove(ifp, idx, 2); | ||
1417 | ip->i_df.if_lastex = idx - 1; | 1315 | ip->i_df.if_lastex = idx - 1; |
1418 | ip->i_d.di_nextents -= 2; | 1316 | ip->i_d.di_nextents -= 2; |
1419 | if (cur == NULL) | 1317 | if (cur == NULL) |
@@ -1450,20 +1348,18 @@ xfs_bmap_add_extent_unwritten_real( | |||
1450 | RIGHT.br_blockcount; | 1348 | RIGHT.br_blockcount; |
1451 | break; | 1349 | break; |
1452 | 1350 | ||
1453 | case MASK3(LEFT_FILLING, RIGHT_FILLING, LEFT_CONTIG): | 1351 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: |
1454 | /* | 1352 | /* |
1455 | * Setting all of a previous oldext extent to newext. | 1353 | * Setting all of a previous oldext extent to newext. |
1456 | * The left neighbor is contiguous, the right is not. | 1354 | * The left neighbor is contiguous, the right is not. |
1457 | */ | 1355 | */ |
1458 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|LC", ip, idx - 1, | 1356 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
1459 | XFS_DATA_FORK); | ||
1460 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 1357 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
1461 | LEFT.br_blockcount + PREV.br_blockcount); | 1358 | LEFT.br_blockcount + PREV.br_blockcount); |
1462 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF|LC", ip, idx - 1, | 1359 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
1463 | XFS_DATA_FORK); | 1360 | |
1464 | ip->i_df.if_lastex = idx - 1; | 1361 | ip->i_df.if_lastex = idx - 1; |
1465 | XFS_BMAP_TRACE_DELETE("LF|RF|LC", ip, idx, 1, XFS_DATA_FORK); | 1362 | xfs_iext_remove(ip, idx, 1, state); |
1466 | xfs_iext_remove(ifp, idx, 1); | ||
1467 | ip->i_d.di_nextents--; | 1363 | ip->i_d.di_nextents--; |
1468 | if (cur == NULL) | 1364 | if (cur == NULL) |
1469 | rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; | 1365 | rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; |
@@ -1492,21 +1388,18 @@ xfs_bmap_add_extent_unwritten_real( | |||
1492 | PREV.br_blockcount; | 1388 | PREV.br_blockcount; |
1493 | break; | 1389 | break; |
1494 | 1390 | ||
1495 | case MASK3(LEFT_FILLING, RIGHT_FILLING, RIGHT_CONTIG): | 1391 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
1496 | /* | 1392 | /* |
1497 | * Setting all of a previous oldext extent to newext. | 1393 | * Setting all of a previous oldext extent to newext. |
1498 | * The right neighbor is contiguous, the left is not. | 1394 | * The right neighbor is contiguous, the left is not. |
1499 | */ | 1395 | */ |
1500 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF|RC", ip, idx, | 1396 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1501 | XFS_DATA_FORK); | ||
1502 | xfs_bmbt_set_blockcount(ep, | 1397 | xfs_bmbt_set_blockcount(ep, |
1503 | PREV.br_blockcount + RIGHT.br_blockcount); | 1398 | PREV.br_blockcount + RIGHT.br_blockcount); |
1504 | xfs_bmbt_set_state(ep, newext); | 1399 | xfs_bmbt_set_state(ep, newext); |
1505 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF|RC", ip, idx, | 1400 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1506 | XFS_DATA_FORK); | ||
1507 | ip->i_df.if_lastex = idx; | 1401 | ip->i_df.if_lastex = idx; |
1508 | XFS_BMAP_TRACE_DELETE("LF|RF|RC", ip, idx + 1, 1, XFS_DATA_FORK); | 1402 | xfs_iext_remove(ip, idx + 1, 1, state); |
1509 | xfs_iext_remove(ifp, idx + 1, 1); | ||
1510 | ip->i_d.di_nextents--; | 1403 | ip->i_d.di_nextents--; |
1511 | if (cur == NULL) | 1404 | if (cur == NULL) |
1512 | rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; | 1405 | rval = XFS_ILOG_CORE | XFS_ILOG_DEXT; |
@@ -1535,17 +1428,16 @@ xfs_bmap_add_extent_unwritten_real( | |||
1535 | RIGHT.br_blockcount; | 1428 | RIGHT.br_blockcount; |
1536 | break; | 1429 | break; |
1537 | 1430 | ||
1538 | case MASK2(LEFT_FILLING, RIGHT_FILLING): | 1431 | case BMAP_LEFT_FILLING | BMAP_RIGHT_FILLING: |
1539 | /* | 1432 | /* |
1540 | * Setting all of a previous oldext extent to newext. | 1433 | * Setting all of a previous oldext extent to newext. |
1541 | * Neither the left nor right neighbors are contiguous with | 1434 | * Neither the left nor right neighbors are contiguous with |
1542 | * the new one. | 1435 | * the new one. |
1543 | */ | 1436 | */ |
1544 | XFS_BMAP_TRACE_PRE_UPDATE("LF|RF", ip, idx, | 1437 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1545 | XFS_DATA_FORK); | ||
1546 | xfs_bmbt_set_state(ep, newext); | 1438 | xfs_bmbt_set_state(ep, newext); |
1547 | XFS_BMAP_TRACE_POST_UPDATE("LF|RF", ip, idx, | 1439 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1548 | XFS_DATA_FORK); | 1440 | |
1549 | ip->i_df.if_lastex = idx; | 1441 | ip->i_df.if_lastex = idx; |
1550 | if (cur == NULL) | 1442 | if (cur == NULL) |
1551 | rval = XFS_ILOG_DEXT; | 1443 | rval = XFS_ILOG_DEXT; |
@@ -1566,27 +1458,25 @@ xfs_bmap_add_extent_unwritten_real( | |||
1566 | temp2 = new->br_blockcount; | 1458 | temp2 = new->br_blockcount; |
1567 | break; | 1459 | break; |
1568 | 1460 | ||
1569 | case MASK2(LEFT_FILLING, LEFT_CONTIG): | 1461 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG: |
1570 | /* | 1462 | /* |
1571 | * Setting the first part of a previous oldext extent to newext. | 1463 | * Setting the first part of a previous oldext extent to newext. |
1572 | * The left neighbor is contiguous. | 1464 | * The left neighbor is contiguous. |
1573 | */ | 1465 | */ |
1574 | XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx - 1, | 1466 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
1575 | XFS_DATA_FORK); | ||
1576 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 1467 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
1577 | LEFT.br_blockcount + new->br_blockcount); | 1468 | LEFT.br_blockcount + new->br_blockcount); |
1578 | xfs_bmbt_set_startoff(ep, | 1469 | xfs_bmbt_set_startoff(ep, |
1579 | PREV.br_startoff + new->br_blockcount); | 1470 | PREV.br_startoff + new->br_blockcount); |
1580 | XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx - 1, | 1471 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
1581 | XFS_DATA_FORK); | 1472 | |
1582 | XFS_BMAP_TRACE_PRE_UPDATE("LF|LC", ip, idx, | 1473 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1583 | XFS_DATA_FORK); | ||
1584 | xfs_bmbt_set_startblock(ep, | 1474 | xfs_bmbt_set_startblock(ep, |
1585 | new->br_startblock + new->br_blockcount); | 1475 | new->br_startblock + new->br_blockcount); |
1586 | xfs_bmbt_set_blockcount(ep, | 1476 | xfs_bmbt_set_blockcount(ep, |
1587 | PREV.br_blockcount - new->br_blockcount); | 1477 | PREV.br_blockcount - new->br_blockcount); |
1588 | XFS_BMAP_TRACE_POST_UPDATE("LF|LC", ip, idx, | 1478 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1589 | XFS_DATA_FORK); | 1479 | |
1590 | ip->i_df.if_lastex = idx - 1; | 1480 | ip->i_df.if_lastex = idx - 1; |
1591 | if (cur == NULL) | 1481 | if (cur == NULL) |
1592 | rval = XFS_ILOG_DEXT; | 1482 | rval = XFS_ILOG_DEXT; |
@@ -1617,22 +1507,21 @@ xfs_bmap_add_extent_unwritten_real( | |||
1617 | PREV.br_blockcount; | 1507 | PREV.br_blockcount; |
1618 | break; | 1508 | break; |
1619 | 1509 | ||
1620 | case MASK(LEFT_FILLING): | 1510 | case BMAP_LEFT_FILLING: |
1621 | /* | 1511 | /* |
1622 | * Setting the first part of a previous oldext extent to newext. | 1512 | * Setting the first part of a previous oldext extent to newext. |
1623 | * The left neighbor is not contiguous. | 1513 | * The left neighbor is not contiguous. |
1624 | */ | 1514 | */ |
1625 | XFS_BMAP_TRACE_PRE_UPDATE("LF", ip, idx, XFS_DATA_FORK); | 1515 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1626 | ASSERT(ep && xfs_bmbt_get_state(ep) == oldext); | 1516 | ASSERT(ep && xfs_bmbt_get_state(ep) == oldext); |
1627 | xfs_bmbt_set_startoff(ep, new_endoff); | 1517 | xfs_bmbt_set_startoff(ep, new_endoff); |
1628 | xfs_bmbt_set_blockcount(ep, | 1518 | xfs_bmbt_set_blockcount(ep, |
1629 | PREV.br_blockcount - new->br_blockcount); | 1519 | PREV.br_blockcount - new->br_blockcount); |
1630 | xfs_bmbt_set_startblock(ep, | 1520 | xfs_bmbt_set_startblock(ep, |
1631 | new->br_startblock + new->br_blockcount); | 1521 | new->br_startblock + new->br_blockcount); |
1632 | XFS_BMAP_TRACE_POST_UPDATE("LF", ip, idx, XFS_DATA_FORK); | 1522 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1633 | XFS_BMAP_TRACE_INSERT("LF", ip, idx, 1, new, NULL, | 1523 | |
1634 | XFS_DATA_FORK); | 1524 | xfs_iext_insert(ip, idx, 1, new, state); |
1635 | xfs_iext_insert(ifp, idx, 1, new); | ||
1636 | ip->i_df.if_lastex = idx; | 1525 | ip->i_df.if_lastex = idx; |
1637 | ip->i_d.di_nextents++; | 1526 | ip->i_d.di_nextents++; |
1638 | if (cur == NULL) | 1527 | if (cur == NULL) |
@@ -1660,24 +1549,21 @@ xfs_bmap_add_extent_unwritten_real( | |||
1660 | temp2 = PREV.br_blockcount; | 1549 | temp2 = PREV.br_blockcount; |
1661 | break; | 1550 | break; |
1662 | 1551 | ||
1663 | case MASK2(RIGHT_FILLING, RIGHT_CONTIG): | 1552 | case BMAP_RIGHT_FILLING | BMAP_RIGHT_CONTIG: |
1664 | /* | 1553 | /* |
1665 | * Setting the last part of a previous oldext extent to newext. | 1554 | * Setting the last part of a previous oldext extent to newext. |
1666 | * The right neighbor is contiguous with the new allocation. | 1555 | * The right neighbor is contiguous with the new allocation. |
1667 | */ | 1556 | */ |
1668 | XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx, | 1557 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1669 | XFS_DATA_FORK); | 1558 | trace_xfs_bmap_pre_update(ip, idx + 1, state, _THIS_IP_); |
1670 | XFS_BMAP_TRACE_PRE_UPDATE("RF|RC", ip, idx + 1, | ||
1671 | XFS_DATA_FORK); | ||
1672 | xfs_bmbt_set_blockcount(ep, | 1559 | xfs_bmbt_set_blockcount(ep, |
1673 | PREV.br_blockcount - new->br_blockcount); | 1560 | PREV.br_blockcount - new->br_blockcount); |
1674 | XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx, | 1561 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1675 | XFS_DATA_FORK); | ||
1676 | xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), | 1562 | xfs_bmbt_set_allf(xfs_iext_get_ext(ifp, idx + 1), |
1677 | new->br_startoff, new->br_startblock, | 1563 | new->br_startoff, new->br_startblock, |
1678 | new->br_blockcount + RIGHT.br_blockcount, newext); | 1564 | new->br_blockcount + RIGHT.br_blockcount, newext); |
1679 | XFS_BMAP_TRACE_POST_UPDATE("RF|RC", ip, idx + 1, | 1565 | trace_xfs_bmap_post_update(ip, idx + 1, state, _THIS_IP_); |
1680 | XFS_DATA_FORK); | 1566 | |
1681 | ip->i_df.if_lastex = idx + 1; | 1567 | ip->i_df.if_lastex = idx + 1; |
1682 | if (cur == NULL) | 1568 | if (cur == NULL) |
1683 | rval = XFS_ILOG_DEXT; | 1569 | rval = XFS_ILOG_DEXT; |
@@ -1707,18 +1593,17 @@ xfs_bmap_add_extent_unwritten_real( | |||
1707 | RIGHT.br_blockcount; | 1593 | RIGHT.br_blockcount; |
1708 | break; | 1594 | break; |
1709 | 1595 | ||
1710 | case MASK(RIGHT_FILLING): | 1596 | case BMAP_RIGHT_FILLING: |
1711 | /* | 1597 | /* |
1712 | * Setting the last part of a previous oldext extent to newext. | 1598 | * Setting the last part of a previous oldext extent to newext. |
1713 | * The right neighbor is not contiguous. | 1599 | * The right neighbor is not contiguous. |
1714 | */ | 1600 | */ |
1715 | XFS_BMAP_TRACE_PRE_UPDATE("RF", ip, idx, XFS_DATA_FORK); | 1601 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1716 | xfs_bmbt_set_blockcount(ep, | 1602 | xfs_bmbt_set_blockcount(ep, |
1717 | PREV.br_blockcount - new->br_blockcount); | 1603 | PREV.br_blockcount - new->br_blockcount); |
1718 | XFS_BMAP_TRACE_POST_UPDATE("RF", ip, idx, XFS_DATA_FORK); | 1604 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1719 | XFS_BMAP_TRACE_INSERT("RF", ip, idx + 1, 1, new, NULL, | 1605 | |
1720 | XFS_DATA_FORK); | 1606 | xfs_iext_insert(ip, idx + 1, 1, new, state); |
1721 | xfs_iext_insert(ifp, idx + 1, 1, new); | ||
1722 | ip->i_df.if_lastex = idx + 1; | 1607 | ip->i_df.if_lastex = idx + 1; |
1723 | ip->i_d.di_nextents++; | 1608 | ip->i_d.di_nextents++; |
1724 | if (cur == NULL) | 1609 | if (cur == NULL) |
@@ -1756,19 +1641,18 @@ xfs_bmap_add_extent_unwritten_real( | |||
1756 | * newext. Contiguity is impossible here. | 1641 | * newext. Contiguity is impossible here. |
1757 | * One extent becomes three extents. | 1642 | * One extent becomes three extents. |
1758 | */ | 1643 | */ |
1759 | XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, XFS_DATA_FORK); | 1644 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1760 | xfs_bmbt_set_blockcount(ep, | 1645 | xfs_bmbt_set_blockcount(ep, |
1761 | new->br_startoff - PREV.br_startoff); | 1646 | new->br_startoff - PREV.br_startoff); |
1762 | XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, XFS_DATA_FORK); | 1647 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1648 | |||
1763 | r[0] = *new; | 1649 | r[0] = *new; |
1764 | r[1].br_startoff = new_endoff; | 1650 | r[1].br_startoff = new_endoff; |
1765 | r[1].br_blockcount = | 1651 | r[1].br_blockcount = |
1766 | PREV.br_startoff + PREV.br_blockcount - new_endoff; | 1652 | PREV.br_startoff + PREV.br_blockcount - new_endoff; |
1767 | r[1].br_startblock = new->br_startblock + new->br_blockcount; | 1653 | r[1].br_startblock = new->br_startblock + new->br_blockcount; |
1768 | r[1].br_state = oldext; | 1654 | r[1].br_state = oldext; |
1769 | XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 2, &r[0], &r[1], | 1655 | xfs_iext_insert(ip, idx + 1, 2, &r[0], state); |
1770 | XFS_DATA_FORK); | ||
1771 | xfs_iext_insert(ifp, idx + 1, 2, &r[0]); | ||
1772 | ip->i_df.if_lastex = idx + 1; | 1656 | ip->i_df.if_lastex = idx + 1; |
1773 | ip->i_d.di_nextents += 2; | 1657 | ip->i_d.di_nextents += 2; |
1774 | if (cur == NULL) | 1658 | if (cur == NULL) |
@@ -1813,13 +1697,13 @@ xfs_bmap_add_extent_unwritten_real( | |||
1813 | temp2 = PREV.br_blockcount; | 1697 | temp2 = PREV.br_blockcount; |
1814 | break; | 1698 | break; |
1815 | 1699 | ||
1816 | case MASK3(LEFT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): | 1700 | case BMAP_LEFT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
1817 | case MASK3(RIGHT_FILLING, LEFT_CONTIG, RIGHT_CONTIG): | 1701 | case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
1818 | case MASK2(LEFT_FILLING, RIGHT_CONTIG): | 1702 | case BMAP_LEFT_FILLING | BMAP_RIGHT_CONTIG: |
1819 | case MASK2(RIGHT_FILLING, LEFT_CONTIG): | 1703 | case BMAP_RIGHT_FILLING | BMAP_LEFT_CONTIG: |
1820 | case MASK2(LEFT_CONTIG, RIGHT_CONTIG): | 1704 | case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: |
1821 | case MASK(LEFT_CONTIG): | 1705 | case BMAP_LEFT_CONTIG: |
1822 | case MASK(RIGHT_CONTIG): | 1706 | case BMAP_RIGHT_CONTIG: |
1823 | /* | 1707 | /* |
1824 | * These cases are all impossible. | 1708 | * These cases are all impossible. |
1825 | */ | 1709 | */ |
@@ -1839,14 +1723,6 @@ done: | |||
1839 | #undef LEFT | 1723 | #undef LEFT |
1840 | #undef RIGHT | 1724 | #undef RIGHT |
1841 | #undef PREV | 1725 | #undef PREV |
1842 | #undef MASK | ||
1843 | #undef MASK2 | ||
1844 | #undef MASK3 | ||
1845 | #undef MASK4 | ||
1846 | #undef STATE_SET | ||
1847 | #undef STATE_TEST | ||
1848 | #undef STATE_SET_TEST | ||
1849 | #undef SWITCH_STATE | ||
1850 | } | 1726 | } |
1851 | 1727 | ||
1852 | /* | 1728 | /* |
@@ -1872,62 +1748,57 @@ xfs_bmap_add_extent_hole_delay( | |||
1872 | int state; /* state bits, accessed thru macros */ | 1748 | int state; /* state bits, accessed thru macros */ |
1873 | xfs_filblks_t temp=0; /* temp for indirect calculations */ | 1749 | xfs_filblks_t temp=0; /* temp for indirect calculations */ |
1874 | xfs_filblks_t temp2=0; | 1750 | xfs_filblks_t temp2=0; |
1875 | enum { /* bit number definitions for state */ | ||
1876 | LEFT_CONTIG, RIGHT_CONTIG, | ||
1877 | LEFT_DELAY, RIGHT_DELAY, | ||
1878 | LEFT_VALID, RIGHT_VALID | ||
1879 | }; | ||
1880 | |||
1881 | #define MASK(b) (1 << (b)) | ||
1882 | #define MASK2(a,b) (MASK(a) | MASK(b)) | ||
1883 | #define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) | ||
1884 | #define STATE_TEST(b) (state & MASK(b)) | ||
1885 | #define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ | ||
1886 | ((state &= ~MASK(b)), 0)) | ||
1887 | #define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG)) | ||
1888 | 1751 | ||
1889 | ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); | 1752 | ifp = XFS_IFORK_PTR(ip, XFS_DATA_FORK); |
1890 | ep = xfs_iext_get_ext(ifp, idx); | 1753 | ep = xfs_iext_get_ext(ifp, idx); |
1891 | state = 0; | 1754 | state = 0; |
1892 | ASSERT(isnullstartblock(new->br_startblock)); | 1755 | ASSERT(isnullstartblock(new->br_startblock)); |
1756 | |||
1893 | /* | 1757 | /* |
1894 | * Check and set flags if this segment has a left neighbor | 1758 | * Check and set flags if this segment has a left neighbor |
1895 | */ | 1759 | */ |
1896 | if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { | 1760 | if (idx > 0) { |
1761 | state |= BMAP_LEFT_VALID; | ||
1897 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); | 1762 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); |
1898 | STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock)); | 1763 | |
1764 | if (isnullstartblock(left.br_startblock)) | ||
1765 | state |= BMAP_LEFT_DELAY; | ||
1899 | } | 1766 | } |
1767 | |||
1900 | /* | 1768 | /* |
1901 | * Check and set flags if the current (right) segment exists. | 1769 | * Check and set flags if the current (right) segment exists. |
1902 | * If it doesn't exist, we're converting the hole at end-of-file. | 1770 | * If it doesn't exist, we're converting the hole at end-of-file. |
1903 | */ | 1771 | */ |
1904 | if (STATE_SET_TEST(RIGHT_VALID, | 1772 | if (idx < ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { |
1905 | idx < | 1773 | state |= BMAP_RIGHT_VALID; |
1906 | ip->i_df.if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { | ||
1907 | xfs_bmbt_get_all(ep, &right); | 1774 | xfs_bmbt_get_all(ep, &right); |
1908 | STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock)); | 1775 | |
1776 | if (isnullstartblock(right.br_startblock)) | ||
1777 | state |= BMAP_RIGHT_DELAY; | ||
1909 | } | 1778 | } |
1779 | |||
1910 | /* | 1780 | /* |
1911 | * Set contiguity flags on the left and right neighbors. | 1781 | * Set contiguity flags on the left and right neighbors. |
1912 | * Don't let extents get too large, even if the pieces are contiguous. | 1782 | * Don't let extents get too large, even if the pieces are contiguous. |
1913 | */ | 1783 | */ |
1914 | STATE_SET(LEFT_CONTIG, | 1784 | if ((state & BMAP_LEFT_VALID) && (state & BMAP_LEFT_DELAY) && |
1915 | STATE_TEST(LEFT_VALID) && STATE_TEST(LEFT_DELAY) && | 1785 | left.br_startoff + left.br_blockcount == new->br_startoff && |
1916 | left.br_startoff + left.br_blockcount == new->br_startoff && | 1786 | left.br_blockcount + new->br_blockcount <= MAXEXTLEN) |
1917 | left.br_blockcount + new->br_blockcount <= MAXEXTLEN); | 1787 | state |= BMAP_LEFT_CONTIG; |
1918 | STATE_SET(RIGHT_CONTIG, | 1788 | |
1919 | STATE_TEST(RIGHT_VALID) && STATE_TEST(RIGHT_DELAY) && | 1789 | if ((state & BMAP_RIGHT_VALID) && (state & BMAP_RIGHT_DELAY) && |
1920 | new->br_startoff + new->br_blockcount == right.br_startoff && | 1790 | new->br_startoff + new->br_blockcount == right.br_startoff && |
1921 | new->br_blockcount + right.br_blockcount <= MAXEXTLEN && | 1791 | new->br_blockcount + right.br_blockcount <= MAXEXTLEN && |
1922 | (!STATE_TEST(LEFT_CONTIG) || | 1792 | (!(state & BMAP_LEFT_CONTIG) || |
1923 | (left.br_blockcount + new->br_blockcount + | 1793 | (left.br_blockcount + new->br_blockcount + |
1924 | right.br_blockcount <= MAXEXTLEN))); | 1794 | right.br_blockcount <= MAXEXTLEN))) |
1795 | state |= BMAP_RIGHT_CONTIG; | ||
1796 | |||
1925 | /* | 1797 | /* |
1926 | * Switch out based on the contiguity flags. | 1798 | * Switch out based on the contiguity flags. |
1927 | */ | 1799 | */ |
1928 | switch (SWITCH_STATE) { | 1800 | switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { |
1929 | 1801 | case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: | |
1930 | case MASK2(LEFT_CONTIG, RIGHT_CONTIG): | ||
1931 | /* | 1802 | /* |
1932 | * New allocation is contiguous with delayed allocations | 1803 | * New allocation is contiguous with delayed allocations |
1933 | * on the left and on the right. | 1804 | * on the left and on the right. |
@@ -1935,8 +1806,8 @@ xfs_bmap_add_extent_hole_delay( | |||
1935 | */ | 1806 | */ |
1936 | temp = left.br_blockcount + new->br_blockcount + | 1807 | temp = left.br_blockcount + new->br_blockcount + |
1937 | right.br_blockcount; | 1808 | right.br_blockcount; |
1938 | XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1, | 1809 | |
1939 | XFS_DATA_FORK); | 1810 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
1940 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); | 1811 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); |
1941 | oldlen = startblockval(left.br_startblock) + | 1812 | oldlen = startblockval(left.br_startblock) + |
1942 | startblockval(new->br_startblock) + | 1813 | startblockval(new->br_startblock) + |
@@ -1944,53 +1815,52 @@ xfs_bmap_add_extent_hole_delay( | |||
1944 | newlen = xfs_bmap_worst_indlen(ip, temp); | 1815 | newlen = xfs_bmap_worst_indlen(ip, temp); |
1945 | xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), | 1816 | xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), |
1946 | nullstartblock((int)newlen)); | 1817 | nullstartblock((int)newlen)); |
1947 | XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1, | 1818 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
1948 | XFS_DATA_FORK); | 1819 | |
1949 | XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, XFS_DATA_FORK); | 1820 | xfs_iext_remove(ip, idx, 1, state); |
1950 | xfs_iext_remove(ifp, idx, 1); | ||
1951 | ip->i_df.if_lastex = idx - 1; | 1821 | ip->i_df.if_lastex = idx - 1; |
1952 | /* DELTA: Two in-core extents were replaced by one. */ | 1822 | /* DELTA: Two in-core extents were replaced by one. */ |
1953 | temp2 = temp; | 1823 | temp2 = temp; |
1954 | temp = left.br_startoff; | 1824 | temp = left.br_startoff; |
1955 | break; | 1825 | break; |
1956 | 1826 | ||
1957 | case MASK(LEFT_CONTIG): | 1827 | case BMAP_LEFT_CONTIG: |
1958 | /* | 1828 | /* |
1959 | * New allocation is contiguous with a delayed allocation | 1829 | * New allocation is contiguous with a delayed allocation |
1960 | * on the left. | 1830 | * on the left. |
1961 | * Merge the new allocation with the left neighbor. | 1831 | * Merge the new allocation with the left neighbor. |
1962 | */ | 1832 | */ |
1963 | temp = left.br_blockcount + new->br_blockcount; | 1833 | temp = left.br_blockcount + new->br_blockcount; |
1964 | XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1, | 1834 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
1965 | XFS_DATA_FORK); | ||
1966 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); | 1835 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), temp); |
1967 | oldlen = startblockval(left.br_startblock) + | 1836 | oldlen = startblockval(left.br_startblock) + |
1968 | startblockval(new->br_startblock); | 1837 | startblockval(new->br_startblock); |
1969 | newlen = xfs_bmap_worst_indlen(ip, temp); | 1838 | newlen = xfs_bmap_worst_indlen(ip, temp); |
1970 | xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), | 1839 | xfs_bmbt_set_startblock(xfs_iext_get_ext(ifp, idx - 1), |
1971 | nullstartblock((int)newlen)); | 1840 | nullstartblock((int)newlen)); |
1972 | XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, | 1841 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
1973 | XFS_DATA_FORK); | 1842 | |
1974 | ip->i_df.if_lastex = idx - 1; | 1843 | ip->i_df.if_lastex = idx - 1; |
1975 | /* DELTA: One in-core extent grew into a hole. */ | 1844 | /* DELTA: One in-core extent grew into a hole. */ |
1976 | temp2 = temp; | 1845 | temp2 = temp; |
1977 | temp = left.br_startoff; | 1846 | temp = left.br_startoff; |
1978 | break; | 1847 | break; |
1979 | 1848 | ||
1980 | case MASK(RIGHT_CONTIG): | 1849 | case BMAP_RIGHT_CONTIG: |
1981 | /* | 1850 | /* |
1982 | * New allocation is contiguous with a delayed allocation | 1851 | * New allocation is contiguous with a delayed allocation |
1983 | * on the right. | 1852 | * on the right. |
1984 | * Merge the new allocation with the right neighbor. | 1853 | * Merge the new allocation with the right neighbor. |
1985 | */ | 1854 | */ |
1986 | XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, XFS_DATA_FORK); | 1855 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
1987 | temp = new->br_blockcount + right.br_blockcount; | 1856 | temp = new->br_blockcount + right.br_blockcount; |
1988 | oldlen = startblockval(new->br_startblock) + | 1857 | oldlen = startblockval(new->br_startblock) + |
1989 | startblockval(right.br_startblock); | 1858 | startblockval(right.br_startblock); |
1990 | newlen = xfs_bmap_worst_indlen(ip, temp); | 1859 | newlen = xfs_bmap_worst_indlen(ip, temp); |
1991 | xfs_bmbt_set_allf(ep, new->br_startoff, | 1860 | xfs_bmbt_set_allf(ep, new->br_startoff, |
1992 | nullstartblock((int)newlen), temp, right.br_state); | 1861 | nullstartblock((int)newlen), temp, right.br_state); |
1993 | XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, XFS_DATA_FORK); | 1862 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
1863 | |||
1994 | ip->i_df.if_lastex = idx; | 1864 | ip->i_df.if_lastex = idx; |
1995 | /* DELTA: One in-core extent grew into a hole. */ | 1865 | /* DELTA: One in-core extent grew into a hole. */ |
1996 | temp2 = temp; | 1866 | temp2 = temp; |
@@ -2004,9 +1874,7 @@ xfs_bmap_add_extent_hole_delay( | |||
2004 | * Insert a new entry. | 1874 | * Insert a new entry. |
2005 | */ | 1875 | */ |
2006 | oldlen = newlen = 0; | 1876 | oldlen = newlen = 0; |
2007 | XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL, | 1877 | xfs_iext_insert(ip, idx, 1, new, state); |
2008 | XFS_DATA_FORK); | ||
2009 | xfs_iext_insert(ifp, idx, 1, new); | ||
2010 | ip->i_df.if_lastex = idx; | 1878 | ip->i_df.if_lastex = idx; |
2011 | /* DELTA: A new in-core extent was added in a hole. */ | 1879 | /* DELTA: A new in-core extent was added in a hole. */ |
2012 | temp2 = new->br_blockcount; | 1880 | temp2 = new->br_blockcount; |
@@ -2030,12 +1898,6 @@ xfs_bmap_add_extent_hole_delay( | |||
2030 | } | 1898 | } |
2031 | *logflagsp = 0; | 1899 | *logflagsp = 0; |
2032 | return 0; | 1900 | return 0; |
2033 | #undef MASK | ||
2034 | #undef MASK2 | ||
2035 | #undef STATE_SET | ||
2036 | #undef STATE_TEST | ||
2037 | #undef STATE_SET_TEST | ||
2038 | #undef SWITCH_STATE | ||
2039 | } | 1901 | } |
2040 | 1902 | ||
2041 | /* | 1903 | /* |
@@ -2062,83 +1924,75 @@ xfs_bmap_add_extent_hole_real( | |||
2062 | int state; /* state bits, accessed thru macros */ | 1924 | int state; /* state bits, accessed thru macros */ |
2063 | xfs_filblks_t temp=0; | 1925 | xfs_filblks_t temp=0; |
2064 | xfs_filblks_t temp2=0; | 1926 | xfs_filblks_t temp2=0; |
2065 | enum { /* bit number definitions for state */ | ||
2066 | LEFT_CONTIG, RIGHT_CONTIG, | ||
2067 | LEFT_DELAY, RIGHT_DELAY, | ||
2068 | LEFT_VALID, RIGHT_VALID | ||
2069 | }; | ||
2070 | |||
2071 | #define MASK(b) (1 << (b)) | ||
2072 | #define MASK2(a,b) (MASK(a) | MASK(b)) | ||
2073 | #define STATE_SET(b,v) ((v) ? (state |= MASK(b)) : (state &= ~MASK(b))) | ||
2074 | #define STATE_TEST(b) (state & MASK(b)) | ||
2075 | #define STATE_SET_TEST(b,v) ((v) ? ((state |= MASK(b)), 1) : \ | ||
2076 | ((state &= ~MASK(b)), 0)) | ||
2077 | #define SWITCH_STATE (state & MASK2(LEFT_CONTIG, RIGHT_CONTIG)) | ||
2078 | 1927 | ||
2079 | ifp = XFS_IFORK_PTR(ip, whichfork); | 1928 | ifp = XFS_IFORK_PTR(ip, whichfork); |
2080 | ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); | 1929 | ASSERT(idx <= ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)); |
2081 | ep = xfs_iext_get_ext(ifp, idx); | 1930 | ep = xfs_iext_get_ext(ifp, idx); |
2082 | state = 0; | 1931 | state = 0; |
1932 | |||
1933 | if (whichfork == XFS_ATTR_FORK) | ||
1934 | state |= BMAP_ATTRFORK; | ||
1935 | |||
2083 | /* | 1936 | /* |
2084 | * Check and set flags if this segment has a left neighbor. | 1937 | * Check and set flags if this segment has a left neighbor. |
2085 | */ | 1938 | */ |
2086 | if (STATE_SET_TEST(LEFT_VALID, idx > 0)) { | 1939 | if (idx > 0) { |
1940 | state |= BMAP_LEFT_VALID; | ||
2087 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); | 1941 | xfs_bmbt_get_all(xfs_iext_get_ext(ifp, idx - 1), &left); |
2088 | STATE_SET(LEFT_DELAY, isnullstartblock(left.br_startblock)); | 1942 | if (isnullstartblock(left.br_startblock)) |
1943 | state |= BMAP_LEFT_DELAY; | ||
2089 | } | 1944 | } |
1945 | |||
2090 | /* | 1946 | /* |
2091 | * Check and set flags if this segment has a current value. | 1947 | * Check and set flags if this segment has a current value. |
2092 | * Not true if we're inserting into the "hole" at eof. | 1948 | * Not true if we're inserting into the "hole" at eof. |
2093 | */ | 1949 | */ |
2094 | if (STATE_SET_TEST(RIGHT_VALID, | 1950 | if (idx < ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t)) { |
2095 | idx < | 1951 | state |= BMAP_RIGHT_VALID; |
2096 | ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))) { | ||
2097 | xfs_bmbt_get_all(ep, &right); | 1952 | xfs_bmbt_get_all(ep, &right); |
2098 | STATE_SET(RIGHT_DELAY, isnullstartblock(right.br_startblock)); | 1953 | if (isnullstartblock(right.br_startblock)) |
1954 | state |= BMAP_RIGHT_DELAY; | ||
2099 | } | 1955 | } |
1956 | |||
2100 | /* | 1957 | /* |
2101 | * We're inserting a real allocation between "left" and "right". | 1958 | * We're inserting a real allocation between "left" and "right". |
2102 | * Set the contiguity flags. Don't let extents get too large. | 1959 | * Set the contiguity flags. Don't let extents get too large. |
2103 | */ | 1960 | */ |
2104 | STATE_SET(LEFT_CONTIG, | 1961 | if ((state & BMAP_LEFT_VALID) && !(state & BMAP_LEFT_DELAY) && |
2105 | STATE_TEST(LEFT_VALID) && !STATE_TEST(LEFT_DELAY) && | 1962 | left.br_startoff + left.br_blockcount == new->br_startoff && |
2106 | left.br_startoff + left.br_blockcount == new->br_startoff && | 1963 | left.br_startblock + left.br_blockcount == new->br_startblock && |
2107 | left.br_startblock + left.br_blockcount == new->br_startblock && | 1964 | left.br_state == new->br_state && |
2108 | left.br_state == new->br_state && | 1965 | left.br_blockcount + new->br_blockcount <= MAXEXTLEN) |
2109 | left.br_blockcount + new->br_blockcount <= MAXEXTLEN); | 1966 | state |= BMAP_LEFT_CONTIG; |
2110 | STATE_SET(RIGHT_CONTIG, | 1967 | |
2111 | STATE_TEST(RIGHT_VALID) && !STATE_TEST(RIGHT_DELAY) && | 1968 | if ((state & BMAP_RIGHT_VALID) && !(state & BMAP_RIGHT_DELAY) && |
2112 | new->br_startoff + new->br_blockcount == right.br_startoff && | 1969 | new->br_startoff + new->br_blockcount == right.br_startoff && |
2113 | new->br_startblock + new->br_blockcount == | 1970 | new->br_startblock + new->br_blockcount == right.br_startblock && |
2114 | right.br_startblock && | 1971 | new->br_state == right.br_state && |
2115 | new->br_state == right.br_state && | 1972 | new->br_blockcount + right.br_blockcount <= MAXEXTLEN && |
2116 | new->br_blockcount + right.br_blockcount <= MAXEXTLEN && | 1973 | (!(state & BMAP_LEFT_CONTIG) || |
2117 | (!STATE_TEST(LEFT_CONTIG) || | 1974 | left.br_blockcount + new->br_blockcount + |
2118 | left.br_blockcount + new->br_blockcount + | 1975 | right.br_blockcount <= MAXEXTLEN)) |
2119 | right.br_blockcount <= MAXEXTLEN)); | 1976 | state |= BMAP_RIGHT_CONTIG; |
2120 | 1977 | ||
2121 | error = 0; | 1978 | error = 0; |
2122 | /* | 1979 | /* |
2123 | * Select which case we're in here, and implement it. | 1980 | * Select which case we're in here, and implement it. |
2124 | */ | 1981 | */ |
2125 | switch (SWITCH_STATE) { | 1982 | switch (state & (BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG)) { |
2126 | 1983 | case BMAP_LEFT_CONTIG | BMAP_RIGHT_CONTIG: | |
2127 | case MASK2(LEFT_CONTIG, RIGHT_CONTIG): | ||
2128 | /* | 1984 | /* |
2129 | * New allocation is contiguous with real allocations on the | 1985 | * New allocation is contiguous with real allocations on the |
2130 | * left and on the right. | 1986 | * left and on the right. |
2131 | * Merge all three into a single extent record. | 1987 | * Merge all three into a single extent record. |
2132 | */ | 1988 | */ |
2133 | XFS_BMAP_TRACE_PRE_UPDATE("LC|RC", ip, idx - 1, | 1989 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
2134 | whichfork); | ||
2135 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 1990 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
2136 | left.br_blockcount + new->br_blockcount + | 1991 | left.br_blockcount + new->br_blockcount + |
2137 | right.br_blockcount); | 1992 | right.br_blockcount); |
2138 | XFS_BMAP_TRACE_POST_UPDATE("LC|RC", ip, idx - 1, | 1993 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
2139 | whichfork); | 1994 | |
2140 | XFS_BMAP_TRACE_DELETE("LC|RC", ip, idx, 1, whichfork); | 1995 | xfs_iext_remove(ip, idx, 1, state); |
2141 | xfs_iext_remove(ifp, idx, 1); | ||
2142 | ifp->if_lastex = idx - 1; | 1996 | ifp->if_lastex = idx - 1; |
2143 | XFS_IFORK_NEXT_SET(ip, whichfork, | 1997 | XFS_IFORK_NEXT_SET(ip, whichfork, |
2144 | XFS_IFORK_NEXTENTS(ip, whichfork) - 1); | 1998 | XFS_IFORK_NEXTENTS(ip, whichfork) - 1); |
@@ -2173,16 +2027,17 @@ xfs_bmap_add_extent_hole_real( | |||
2173 | right.br_blockcount; | 2027 | right.br_blockcount; |
2174 | break; | 2028 | break; |
2175 | 2029 | ||
2176 | case MASK(LEFT_CONTIG): | 2030 | case BMAP_LEFT_CONTIG: |
2177 | /* | 2031 | /* |
2178 | * New allocation is contiguous with a real allocation | 2032 | * New allocation is contiguous with a real allocation |
2179 | * on the left. | 2033 | * on the left. |
2180 | * Merge the new allocation with the left neighbor. | 2034 | * Merge the new allocation with the left neighbor. |
2181 | */ | 2035 | */ |
2182 | XFS_BMAP_TRACE_PRE_UPDATE("LC", ip, idx - 1, whichfork); | 2036 | trace_xfs_bmap_pre_update(ip, idx - 1, state, _THIS_IP_); |
2183 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), | 2037 | xfs_bmbt_set_blockcount(xfs_iext_get_ext(ifp, idx - 1), |
2184 | left.br_blockcount + new->br_blockcount); | 2038 | left.br_blockcount + new->br_blockcount); |
2185 | XFS_BMAP_TRACE_POST_UPDATE("LC", ip, idx - 1, whichfork); | 2039 | trace_xfs_bmap_post_update(ip, idx - 1, state, _THIS_IP_); |
2040 | |||
2186 | ifp->if_lastex = idx - 1; | 2041 | ifp->if_lastex = idx - 1; |
2187 | if (cur == NULL) { | 2042 | if (cur == NULL) { |
2188 | rval = xfs_ilog_fext(whichfork); | 2043 | rval = xfs_ilog_fext(whichfork); |
@@ -2207,17 +2062,18 @@ xfs_bmap_add_extent_hole_real( | |||
2207 | new->br_blockcount; | 2062 | new->br_blockcount; |
2208 | break; | 2063 | break; |
2209 | 2064 | ||
2210 | case MASK(RIGHT_CONTIG): | 2065 | case BMAP_RIGHT_CONTIG: |
2211 | /* | 2066 | /* |
2212 | * New allocation is contiguous with a real allocation | 2067 | * New allocation is contiguous with a real allocation |
2213 | * on the right. | 2068 | * on the right. |
2214 | * Merge the new allocation with the right neighbor. | 2069 | * Merge the new allocation with the right neighbor. |
2215 | */ | 2070 | */ |
2216 | XFS_BMAP_TRACE_PRE_UPDATE("RC", ip, idx, whichfork); | 2071 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
2217 | xfs_bmbt_set_allf(ep, new->br_startoff, new->br_startblock, | 2072 | xfs_bmbt_set_allf(ep, new->br_startoff, new->br_startblock, |
2218 | new->br_blockcount + right.br_blockcount, | 2073 | new->br_blockcount + right.br_blockcount, |
2219 | right.br_state); | 2074 | right.br_state); |
2220 | XFS_BMAP_TRACE_POST_UPDATE("RC", ip, idx, whichfork); | 2075 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
2076 | |||
2221 | ifp->if_lastex = idx; | 2077 | ifp->if_lastex = idx; |
2222 | if (cur == NULL) { | 2078 | if (cur == NULL) { |
2223 | rval = xfs_ilog_fext(whichfork); | 2079 | rval = xfs_ilog_fext(whichfork); |
@@ -2248,8 +2104,7 @@ xfs_bmap_add_extent_hole_real( | |||
2248 | * real allocation. | 2104 | * real allocation. |
2249 | * Insert a new entry. | 2105 | * Insert a new entry. |
2250 | */ | 2106 | */ |
2251 | XFS_BMAP_TRACE_INSERT("0", ip, idx, 1, new, NULL, whichfork); | 2107 | xfs_iext_insert(ip, idx, 1, new, state); |
2252 | xfs_iext_insert(ifp, idx, 1, new); | ||
2253 | ifp->if_lastex = idx; | 2108 | ifp->if_lastex = idx; |
2254 | XFS_IFORK_NEXT_SET(ip, whichfork, | 2109 | XFS_IFORK_NEXT_SET(ip, whichfork, |
2255 | XFS_IFORK_NEXTENTS(ip, whichfork) + 1); | 2110 | XFS_IFORK_NEXTENTS(ip, whichfork) + 1); |
@@ -2283,12 +2138,6 @@ xfs_bmap_add_extent_hole_real( | |||
2283 | done: | 2138 | done: |
2284 | *logflagsp = rval; | 2139 | *logflagsp = rval; |
2285 | return error; | 2140 | return error; |
2286 | #undef MASK | ||
2287 | #undef MASK2 | ||
2288 | #undef STATE_SET | ||
2289 | #undef STATE_TEST | ||
2290 | #undef STATE_SET_TEST | ||
2291 | #undef SWITCH_STATE | ||
2292 | } | 2141 | } |
2293 | 2142 | ||
2294 | /* | 2143 | /* |
@@ -3115,8 +2964,13 @@ xfs_bmap_del_extent( | |||
3115 | uint qfield; /* quota field to update */ | 2964 | uint qfield; /* quota field to update */ |
3116 | xfs_filblks_t temp; /* for indirect length calculations */ | 2965 | xfs_filblks_t temp; /* for indirect length calculations */ |
3117 | xfs_filblks_t temp2; /* for indirect length calculations */ | 2966 | xfs_filblks_t temp2; /* for indirect length calculations */ |
2967 | int state = 0; | ||
3118 | 2968 | ||
3119 | XFS_STATS_INC(xs_del_exlist); | 2969 | XFS_STATS_INC(xs_del_exlist); |
2970 | |||
2971 | if (whichfork == XFS_ATTR_FORK) | ||
2972 | state |= BMAP_ATTRFORK; | ||
2973 | |||
3120 | mp = ip->i_mount; | 2974 | mp = ip->i_mount; |
3121 | ifp = XFS_IFORK_PTR(ip, whichfork); | 2975 | ifp = XFS_IFORK_PTR(ip, whichfork); |
3122 | ASSERT((idx >= 0) && (idx < ifp->if_bytes / | 2976 | ASSERT((idx >= 0) && (idx < ifp->if_bytes / |
@@ -3196,8 +3050,8 @@ xfs_bmap_del_extent( | |||
3196 | /* | 3050 | /* |
3197 | * Matches the whole extent. Delete the entry. | 3051 | * Matches the whole extent. Delete the entry. |
3198 | */ | 3052 | */ |
3199 | XFS_BMAP_TRACE_DELETE("3", ip, idx, 1, whichfork); | 3053 | xfs_iext_remove(ip, idx, 1, |
3200 | xfs_iext_remove(ifp, idx, 1); | 3054 | whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0); |
3201 | ifp->if_lastex = idx; | 3055 | ifp->if_lastex = idx; |
3202 | if (delay) | 3056 | if (delay) |
3203 | break; | 3057 | break; |
@@ -3217,7 +3071,7 @@ xfs_bmap_del_extent( | |||
3217 | /* | 3071 | /* |
3218 | * Deleting the first part of the extent. | 3072 | * Deleting the first part of the extent. |
3219 | */ | 3073 | */ |
3220 | XFS_BMAP_TRACE_PRE_UPDATE("2", ip, idx, whichfork); | 3074 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
3221 | xfs_bmbt_set_startoff(ep, del_endoff); | 3075 | xfs_bmbt_set_startoff(ep, del_endoff); |
3222 | temp = got.br_blockcount - del->br_blockcount; | 3076 | temp = got.br_blockcount - del->br_blockcount; |
3223 | xfs_bmbt_set_blockcount(ep, temp); | 3077 | xfs_bmbt_set_blockcount(ep, temp); |
@@ -3226,13 +3080,12 @@ xfs_bmap_del_extent( | |||
3226 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), | 3080 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), |
3227 | da_old); | 3081 | da_old); |
3228 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 3082 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
3229 | XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, | 3083 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
3230 | whichfork); | ||
3231 | da_new = temp; | 3084 | da_new = temp; |
3232 | break; | 3085 | break; |
3233 | } | 3086 | } |
3234 | xfs_bmbt_set_startblock(ep, del_endblock); | 3087 | xfs_bmbt_set_startblock(ep, del_endblock); |
3235 | XFS_BMAP_TRACE_POST_UPDATE("2", ip, idx, whichfork); | 3088 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
3236 | if (!cur) { | 3089 | if (!cur) { |
3237 | flags |= xfs_ilog_fext(whichfork); | 3090 | flags |= xfs_ilog_fext(whichfork); |
3238 | break; | 3091 | break; |
@@ -3248,19 +3101,18 @@ xfs_bmap_del_extent( | |||
3248 | * Deleting the last part of the extent. | 3101 | * Deleting the last part of the extent. |
3249 | */ | 3102 | */ |
3250 | temp = got.br_blockcount - del->br_blockcount; | 3103 | temp = got.br_blockcount - del->br_blockcount; |
3251 | XFS_BMAP_TRACE_PRE_UPDATE("1", ip, idx, whichfork); | 3104 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
3252 | xfs_bmbt_set_blockcount(ep, temp); | 3105 | xfs_bmbt_set_blockcount(ep, temp); |
3253 | ifp->if_lastex = idx; | 3106 | ifp->if_lastex = idx; |
3254 | if (delay) { | 3107 | if (delay) { |
3255 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), | 3108 | temp = XFS_FILBLKS_MIN(xfs_bmap_worst_indlen(ip, temp), |
3256 | da_old); | 3109 | da_old); |
3257 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); | 3110 | xfs_bmbt_set_startblock(ep, nullstartblock((int)temp)); |
3258 | XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, | 3111 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
3259 | whichfork); | ||
3260 | da_new = temp; | 3112 | da_new = temp; |
3261 | break; | 3113 | break; |
3262 | } | 3114 | } |
3263 | XFS_BMAP_TRACE_POST_UPDATE("1", ip, idx, whichfork); | 3115 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
3264 | if (!cur) { | 3116 | if (!cur) { |
3265 | flags |= xfs_ilog_fext(whichfork); | 3117 | flags |= xfs_ilog_fext(whichfork); |
3266 | break; | 3118 | break; |
@@ -3277,7 +3129,7 @@ xfs_bmap_del_extent( | |||
3277 | * Deleting the middle of the extent. | 3129 | * Deleting the middle of the extent. |
3278 | */ | 3130 | */ |
3279 | temp = del->br_startoff - got.br_startoff; | 3131 | temp = del->br_startoff - got.br_startoff; |
3280 | XFS_BMAP_TRACE_PRE_UPDATE("0", ip, idx, whichfork); | 3132 | trace_xfs_bmap_pre_update(ip, idx, state, _THIS_IP_); |
3281 | xfs_bmbt_set_blockcount(ep, temp); | 3133 | xfs_bmbt_set_blockcount(ep, temp); |
3282 | new.br_startoff = del_endoff; | 3134 | new.br_startoff = del_endoff; |
3283 | temp2 = got_endoff - del_endoff; | 3135 | temp2 = got_endoff - del_endoff; |
@@ -3364,10 +3216,8 @@ xfs_bmap_del_extent( | |||
3364 | } | 3216 | } |
3365 | } | 3217 | } |
3366 | } | 3218 | } |
3367 | XFS_BMAP_TRACE_POST_UPDATE("0", ip, idx, whichfork); | 3219 | trace_xfs_bmap_post_update(ip, idx, state, _THIS_IP_); |
3368 | XFS_BMAP_TRACE_INSERT("0", ip, idx + 1, 1, &new, NULL, | 3220 | xfs_iext_insert(ip, idx + 1, 1, &new, state); |
3369 | whichfork); | ||
3370 | xfs_iext_insert(ifp, idx + 1, 1, &new); | ||
3371 | ifp->if_lastex = idx + 1; | 3221 | ifp->if_lastex = idx + 1; |
3372 | break; | 3222 | break; |
3373 | } | 3223 | } |
@@ -3687,7 +3537,9 @@ xfs_bmap_local_to_extents( | |||
3687 | xfs_iext_add(ifp, 0, 1); | 3537 | xfs_iext_add(ifp, 0, 1); |
3688 | ep = xfs_iext_get_ext(ifp, 0); | 3538 | ep = xfs_iext_get_ext(ifp, 0); |
3689 | xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); | 3539 | xfs_bmbt_set_allf(ep, 0, args.fsbno, 1, XFS_EXT_NORM); |
3690 | XFS_BMAP_TRACE_POST_UPDATE("new", ip, 0, whichfork); | 3540 | trace_xfs_bmap_post_update(ip, 0, |
3541 | whichfork == XFS_ATTR_FORK ? BMAP_ATTRFORK : 0, | ||
3542 | _THIS_IP_); | ||
3691 | XFS_IFORK_NEXT_SET(ip, whichfork, 1); | 3543 | XFS_IFORK_NEXT_SET(ip, whichfork, 1); |
3692 | ip->i_d.di_nblocks = 1; | 3544 | ip->i_d.di_nblocks = 1; |
3693 | xfs_trans_mod_dquot_byino(tp, ip, | 3545 | xfs_trans_mod_dquot_byino(tp, ip, |
@@ -3800,158 +3652,6 @@ xfs_bmap_search_extents( | |||
3800 | return ep; | 3652 | return ep; |
3801 | } | 3653 | } |
3802 | 3654 | ||
3803 | |||
3804 | #ifdef XFS_BMAP_TRACE | ||
3805 | ktrace_t *xfs_bmap_trace_buf; | ||
3806 | |||
3807 | /* | ||
3808 | * Add a bmap trace buffer entry. Base routine for the others. | ||
3809 | */ | ||
3810 | STATIC void | ||
3811 | xfs_bmap_trace_addentry( | ||
3812 | int opcode, /* operation */ | ||
3813 | const char *fname, /* function name */ | ||
3814 | char *desc, /* operation description */ | ||
3815 | xfs_inode_t *ip, /* incore inode pointer */ | ||
3816 | xfs_extnum_t idx, /* index of entry(ies) */ | ||
3817 | xfs_extnum_t cnt, /* count of entries, 1 or 2 */ | ||
3818 | xfs_bmbt_rec_host_t *r1, /* first record */ | ||
3819 | xfs_bmbt_rec_host_t *r2, /* second record or null */ | ||
3820 | int whichfork) /* data or attr fork */ | ||
3821 | { | ||
3822 | xfs_bmbt_rec_host_t tr2; | ||
3823 | |||
3824 | ASSERT(cnt == 1 || cnt == 2); | ||
3825 | ASSERT(r1 != NULL); | ||
3826 | if (cnt == 1) { | ||
3827 | ASSERT(r2 == NULL); | ||
3828 | r2 = &tr2; | ||
3829 | memset(&tr2, 0, sizeof(tr2)); | ||
3830 | } else | ||
3831 | ASSERT(r2 != NULL); | ||
3832 | ktrace_enter(xfs_bmap_trace_buf, | ||
3833 | (void *)(__psint_t)(opcode | (whichfork << 16)), | ||
3834 | (void *)fname, (void *)desc, (void *)ip, | ||
3835 | (void *)(__psint_t)idx, | ||
3836 | (void *)(__psint_t)cnt, | ||
3837 | (void *)(__psunsigned_t)(ip->i_ino >> 32), | ||
3838 | (void *)(__psunsigned_t)(unsigned)ip->i_ino, | ||
3839 | (void *)(__psunsigned_t)(r1->l0 >> 32), | ||
3840 | (void *)(__psunsigned_t)(unsigned)(r1->l0), | ||
3841 | (void *)(__psunsigned_t)(r1->l1 >> 32), | ||
3842 | (void *)(__psunsigned_t)(unsigned)(r1->l1), | ||
3843 | (void *)(__psunsigned_t)(r2->l0 >> 32), | ||
3844 | (void *)(__psunsigned_t)(unsigned)(r2->l0), | ||
3845 | (void *)(__psunsigned_t)(r2->l1 >> 32), | ||
3846 | (void *)(__psunsigned_t)(unsigned)(r2->l1) | ||
3847 | ); | ||
3848 | ASSERT(ip->i_xtrace); | ||
3849 | ktrace_enter(ip->i_xtrace, | ||
3850 | (void *)(__psint_t)(opcode | (whichfork << 16)), | ||
3851 | (void *)fname, (void *)desc, (void *)ip, | ||
3852 | (void *)(__psint_t)idx, | ||
3853 | (void *)(__psint_t)cnt, | ||
3854 | (void *)(__psunsigned_t)(ip->i_ino >> 32), | ||
3855 | (void *)(__psunsigned_t)(unsigned)ip->i_ino, | ||
3856 | (void *)(__psunsigned_t)(r1->l0 >> 32), | ||
3857 | (void *)(__psunsigned_t)(unsigned)(r1->l0), | ||
3858 | (void *)(__psunsigned_t)(r1->l1 >> 32), | ||
3859 | (void *)(__psunsigned_t)(unsigned)(r1->l1), | ||
3860 | (void *)(__psunsigned_t)(r2->l0 >> 32), | ||
3861 | (void *)(__psunsigned_t)(unsigned)(r2->l0), | ||
3862 | (void *)(__psunsigned_t)(r2->l1 >> 32), | ||
3863 | (void *)(__psunsigned_t)(unsigned)(r2->l1) | ||
3864 | ); | ||
3865 | } | ||
3866 | |||
3867 | /* | ||
3868 | * Add bmap trace entry prior to a call to xfs_iext_remove. | ||
3869 | */ | ||
3870 | STATIC void | ||
3871 | xfs_bmap_trace_delete( | ||
3872 | const char *fname, /* function name */ | ||
3873 | char *desc, /* operation description */ | ||
3874 | xfs_inode_t *ip, /* incore inode pointer */ | ||
3875 | xfs_extnum_t idx, /* index of entry(entries) deleted */ | ||
3876 | xfs_extnum_t cnt, /* count of entries deleted, 1 or 2 */ | ||
3877 | int whichfork) /* data or attr fork */ | ||
3878 | { | ||
3879 | xfs_ifork_t *ifp; /* inode fork pointer */ | ||
3880 | |||
3881 | ifp = XFS_IFORK_PTR(ip, whichfork); | ||
3882 | xfs_bmap_trace_addentry(XFS_BMAP_KTRACE_DELETE, fname, desc, ip, idx, | ||
3883 | cnt, xfs_iext_get_ext(ifp, idx), | ||
3884 | cnt == 2 ? xfs_iext_get_ext(ifp, idx + 1) : NULL, | ||
3885 | whichfork); | ||
3886 | } | ||
3887 | |||
3888 | /* | ||
3889 | * Add bmap trace entry prior to a call to xfs_iext_insert, or | ||
3890 | * reading in the extents list from the disk (in the btree). | ||
3891 | */ | ||
3892 | STATIC void | ||
3893 | xfs_bmap_trace_insert( | ||
3894 | const char *fname, /* function name */ | ||
3895 | char *desc, /* operation description */ | ||
3896 | xfs_inode_t *ip, /* incore inode pointer */ | ||
3897 | xfs_extnum_t idx, /* index of entry(entries) inserted */ | ||
3898 | xfs_extnum_t cnt, /* count of entries inserted, 1 or 2 */ | ||
3899 | xfs_bmbt_irec_t *r1, /* inserted record 1 */ | ||
3900 | xfs_bmbt_irec_t *r2, /* inserted record 2 or null */ | ||
3901 | int whichfork) /* data or attr fork */ | ||
3902 | { | ||
3903 | xfs_bmbt_rec_host_t tr1; /* compressed record 1 */ | ||
3904 | xfs_bmbt_rec_host_t tr2; /* compressed record 2 if needed */ | ||
3905 | |||
3906 | xfs_bmbt_set_all(&tr1, r1); | ||
3907 | if (cnt == 2) { | ||
3908 | ASSERT(r2 != NULL); | ||
3909 | xfs_bmbt_set_all(&tr2, r2); | ||
3910 | } else { | ||
3911 | ASSERT(cnt == 1); | ||
3912 | ASSERT(r2 == NULL); | ||
3913 | } | ||
3914 | xfs_bmap_trace_addentry(XFS_BMAP_KTRACE_INSERT, fname, desc, ip, idx, | ||
3915 | cnt, &tr1, cnt == 2 ? &tr2 : NULL, whichfork); | ||
3916 | } | ||
3917 | |||
3918 | /* | ||
3919 | * Add bmap trace entry after updating an extent record in place. | ||
3920 | */ | ||
3921 | STATIC void | ||
3922 | xfs_bmap_trace_post_update( | ||
3923 | const char *fname, /* function name */ | ||
3924 | char *desc, /* operation description */ | ||
3925 | xfs_inode_t *ip, /* incore inode pointer */ | ||
3926 | xfs_extnum_t idx, /* index of entry updated */ | ||
3927 | int whichfork) /* data or attr fork */ | ||
3928 | { | ||
3929 | xfs_ifork_t *ifp; /* inode fork pointer */ | ||
3930 | |||
3931 | ifp = XFS_IFORK_PTR(ip, whichfork); | ||
3932 | xfs_bmap_trace_addentry(XFS_BMAP_KTRACE_POST_UP, fname, desc, ip, idx, | ||
3933 | 1, xfs_iext_get_ext(ifp, idx), NULL, whichfork); | ||
3934 | } | ||
3935 | |||
3936 | /* | ||
3937 | * Add bmap trace entry prior to updating an extent record in place. | ||
3938 | */ | ||
3939 | STATIC void | ||
3940 | xfs_bmap_trace_pre_update( | ||
3941 | const char *fname, /* function name */ | ||
3942 | char *desc, /* operation description */ | ||
3943 | xfs_inode_t *ip, /* incore inode pointer */ | ||
3944 | xfs_extnum_t idx, /* index of entry to be updated */ | ||
3945 | int whichfork) /* data or attr fork */ | ||
3946 | { | ||
3947 | xfs_ifork_t *ifp; /* inode fork pointer */ | ||
3948 | |||
3949 | ifp = XFS_IFORK_PTR(ip, whichfork); | ||
3950 | xfs_bmap_trace_addentry(XFS_BMAP_KTRACE_PRE_UP, fname, desc, ip, idx, 1, | ||
3951 | xfs_iext_get_ext(ifp, idx), NULL, whichfork); | ||
3952 | } | ||
3953 | #endif /* XFS_BMAP_TRACE */ | ||
3954 | |||
3955 | /* | 3655 | /* |
3956 | * Compute the worst-case number of indirect blocks that will be used | 3656 | * Compute the worst-case number of indirect blocks that will be used |
3957 | * for ip's delayed extent of length "len". | 3657 | * for ip's delayed extent of length "len". |
@@ -3983,37 +3683,6 @@ xfs_bmap_worst_indlen( | |||
3983 | return rval; | 3683 | return rval; |
3984 | } | 3684 | } |
3985 | 3685 | ||
3986 | #if defined(XFS_RW_TRACE) | ||
3987 | STATIC void | ||
3988 | xfs_bunmap_trace( | ||
3989 | xfs_inode_t *ip, | ||
3990 | xfs_fileoff_t bno, | ||
3991 | xfs_filblks_t len, | ||
3992 | int flags, | ||
3993 | inst_t *ra) | ||
3994 | { | ||
3995 | if (ip->i_rwtrace == NULL) | ||
3996 | return; | ||
3997 | ktrace_enter(ip->i_rwtrace, | ||
3998 | (void *)(__psint_t)XFS_BUNMAP, | ||
3999 | (void *)ip, | ||
4000 | (void *)(__psint_t)((ip->i_d.di_size >> 32) & 0xffffffff), | ||
4001 | (void *)(__psint_t)(ip->i_d.di_size & 0xffffffff), | ||
4002 | (void *)(__psint_t)(((xfs_dfiloff_t)bno >> 32) & 0xffffffff), | ||
4003 | (void *)(__psint_t)((xfs_dfiloff_t)bno & 0xffffffff), | ||
4004 | (void *)(__psint_t)len, | ||
4005 | (void *)(__psint_t)flags, | ||
4006 | (void *)(unsigned long)current_cpu(), | ||
4007 | (void *)ra, | ||
4008 | (void *)0, | ||
4009 | (void *)0, | ||
4010 | (void *)0, | ||
4011 | (void *)0, | ||
4012 | (void *)0, | ||
4013 | (void *)0); | ||
4014 | } | ||
4015 | #endif | ||
4016 | |||
4017 | /* | 3686 | /* |
4018 | * Convert inode from non-attributed to attributed. | 3687 | * Convert inode from non-attributed to attributed. |
4019 | * Must not be in a transaction, ip must not be locked. | 3688 | * Must not be in a transaction, ip must not be locked. |
@@ -4702,34 +4371,30 @@ error0: | |||
4702 | return XFS_ERROR(EFSCORRUPTED); | 4371 | return XFS_ERROR(EFSCORRUPTED); |
4703 | } | 4372 | } |
4704 | 4373 | ||
4705 | #ifdef XFS_BMAP_TRACE | 4374 | #ifdef DEBUG |
4706 | /* | 4375 | /* |
4707 | * Add bmap trace insert entries for all the contents of the extent records. | 4376 | * Add bmap trace insert entries for all the contents of the extent records. |
4708 | */ | 4377 | */ |
4709 | void | 4378 | void |
4710 | xfs_bmap_trace_exlist( | 4379 | xfs_bmap_trace_exlist( |
4711 | const char *fname, /* function name */ | ||
4712 | xfs_inode_t *ip, /* incore inode pointer */ | 4380 | xfs_inode_t *ip, /* incore inode pointer */ |
4713 | xfs_extnum_t cnt, /* count of entries in the list */ | 4381 | xfs_extnum_t cnt, /* count of entries in the list */ |
4714 | int whichfork) /* data or attr fork */ | 4382 | int whichfork, /* data or attr fork */ |
4383 | unsigned long caller_ip) | ||
4715 | { | 4384 | { |
4716 | xfs_bmbt_rec_host_t *ep; /* current extent record */ | ||
4717 | xfs_extnum_t idx; /* extent record index */ | 4385 | xfs_extnum_t idx; /* extent record index */ |
4718 | xfs_ifork_t *ifp; /* inode fork pointer */ | 4386 | xfs_ifork_t *ifp; /* inode fork pointer */ |
4719 | xfs_bmbt_irec_t s; /* file extent record */ | 4387 | int state = 0; |
4388 | |||
4389 | if (whichfork == XFS_ATTR_FORK) | ||
4390 | state |= BMAP_ATTRFORK; | ||
4720 | 4391 | ||
4721 | ifp = XFS_IFORK_PTR(ip, whichfork); | 4392 | ifp = XFS_IFORK_PTR(ip, whichfork); |
4722 | ASSERT(cnt == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); | 4393 | ASSERT(cnt == (ifp->if_bytes / (uint)sizeof(xfs_bmbt_rec_t))); |
4723 | for (idx = 0; idx < cnt; idx++) { | 4394 | for (idx = 0; idx < cnt; idx++) |
4724 | ep = xfs_iext_get_ext(ifp, idx); | 4395 | trace_xfs_extlist(ip, idx, whichfork, caller_ip); |
4725 | xfs_bmbt_get_all(ep, &s); | ||
4726 | XFS_BMAP_TRACE_INSERT("exlist", ip, idx, 1, &s, NULL, | ||
4727 | whichfork); | ||
4728 | } | ||
4729 | } | 4396 | } |
4730 | #endif | ||
4731 | 4397 | ||
4732 | #ifdef DEBUG | ||
4733 | /* | 4398 | /* |
4734 | * Validate that the bmbt_irecs being returned from bmapi are valid | 4399 | * Validate that the bmbt_irecs being returned from bmapi are valid |
4735 | * given the callers original parameters. Specifically check the | 4400 | * given the callers original parameters. Specifically check the |
@@ -5478,7 +5143,8 @@ xfs_bunmapi( | |||
5478 | int rsvd; /* OK to allocate reserved blocks */ | 5143 | int rsvd; /* OK to allocate reserved blocks */ |
5479 | xfs_fsblock_t sum; | 5144 | xfs_fsblock_t sum; |
5480 | 5145 | ||
5481 | xfs_bunmap_trace(ip, bno, len, flags, (inst_t *)__return_address); | 5146 | trace_xfs_bunmap(ip, bno, len, flags, _RET_IP_); |
5147 | |||
5482 | whichfork = (flags & XFS_BMAPI_ATTRFORK) ? | 5148 | whichfork = (flags & XFS_BMAPI_ATTRFORK) ? |
5483 | XFS_ATTR_FORK : XFS_DATA_FORK; | 5149 | XFS_ATTR_FORK : XFS_DATA_FORK; |
5484 | ifp = XFS_IFORK_PTR(ip, whichfork); | 5150 | ifp = XFS_IFORK_PTR(ip, whichfork); |