diff options
author | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
---|---|---|
committer | Glenn Elliott <gelliott@cs.unc.edu> | 2012-03-04 19:47:13 -0500 |
commit | c71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch) | |
tree | ecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /fs/xfs/xfs_btree.c | |
parent | ea53c912f8a86a8567697115b6a0d8152beee5c8 (diff) | |
parent | 6a00f206debf8a5c8899055726ad127dbeeed098 (diff) |
Merge branch 'mpi-master' into wip-k-fmlpwip-k-fmlp
Conflicts:
litmus/sched_cedf.c
Diffstat (limited to 'fs/xfs/xfs_btree.c')
-rw-r--r-- | fs/xfs/xfs_btree.c | 65 |
1 files changed, 49 insertions, 16 deletions
diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 829af92f0fba..2f9e97c128a0 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c | |||
@@ -217,7 +217,7 @@ xfs_btree_del_cursor( | |||
217 | */ | 217 | */ |
218 | for (i = 0; i < cur->bc_nlevels; i++) { | 218 | for (i = 0; i < cur->bc_nlevels; i++) { |
219 | if (cur->bc_bufs[i]) | 219 | if (cur->bc_bufs[i]) |
220 | xfs_btree_setbuf(cur, i, NULL); | 220 | xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[i]); |
221 | else if (!error) | 221 | else if (!error) |
222 | break; | 222 | break; |
223 | } | 223 | } |
@@ -634,9 +634,8 @@ xfs_btree_read_bufl( | |||
634 | return error; | 634 | return error; |
635 | } | 635 | } |
636 | ASSERT(!bp || !XFS_BUF_GETERROR(bp)); | 636 | ASSERT(!bp || !XFS_BUF_GETERROR(bp)); |
637 | if (bp != NULL) { | 637 | if (bp) |
638 | XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, refval); | 638 | XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, refval); |
639 | } | ||
640 | *bpp = bp; | 639 | *bpp = bp; |
641 | return 0; | 640 | return 0; |
642 | } | 641 | } |
@@ -656,7 +655,7 @@ xfs_btree_reada_bufl( | |||
656 | 655 | ||
657 | ASSERT(fsbno != NULLFSBLOCK); | 656 | ASSERT(fsbno != NULLFSBLOCK); |
658 | d = XFS_FSB_TO_DADDR(mp, fsbno); | 657 | d = XFS_FSB_TO_DADDR(mp, fsbno); |
659 | xfs_baread(mp->m_ddev_targp, d, mp->m_bsize * count); | 658 | xfs_buf_readahead(mp->m_ddev_targp, d, mp->m_bsize * count); |
660 | } | 659 | } |
661 | 660 | ||
662 | /* | 661 | /* |
@@ -676,7 +675,7 @@ xfs_btree_reada_bufs( | |||
676 | ASSERT(agno != NULLAGNUMBER); | 675 | ASSERT(agno != NULLAGNUMBER); |
677 | ASSERT(agbno != NULLAGBLOCK); | 676 | ASSERT(agbno != NULLAGBLOCK); |
678 | d = XFS_AGB_TO_DADDR(mp, agno, agbno); | 677 | d = XFS_AGB_TO_DADDR(mp, agno, agbno); |
679 | xfs_baread(mp->m_ddev_targp, d, mp->m_bsize * count); | 678 | xfs_buf_readahead(mp->m_ddev_targp, d, mp->m_bsize * count); |
680 | } | 679 | } |
681 | 680 | ||
682 | STATIC int | 681 | STATIC int |
@@ -763,22 +762,19 @@ xfs_btree_readahead( | |||
763 | * Set the buffer for level "lev" in the cursor to bp, releasing | 762 | * Set the buffer for level "lev" in the cursor to bp, releasing |
764 | * any previous buffer. | 763 | * any previous buffer. |
765 | */ | 764 | */ |
766 | void | 765 | STATIC void |
767 | xfs_btree_setbuf( | 766 | xfs_btree_setbuf( |
768 | xfs_btree_cur_t *cur, /* btree cursor */ | 767 | xfs_btree_cur_t *cur, /* btree cursor */ |
769 | int lev, /* level in btree */ | 768 | int lev, /* level in btree */ |
770 | xfs_buf_t *bp) /* new buffer to set */ | 769 | xfs_buf_t *bp) /* new buffer to set */ |
771 | { | 770 | { |
772 | struct xfs_btree_block *b; /* btree block */ | 771 | struct xfs_btree_block *b; /* btree block */ |
773 | xfs_buf_t *obp; /* old buffer pointer */ | ||
774 | 772 | ||
775 | obp = cur->bc_bufs[lev]; | 773 | if (cur->bc_bufs[lev]) |
776 | if (obp) | 774 | xfs_trans_brelse(cur->bc_tp, cur->bc_bufs[lev]); |
777 | xfs_trans_brelse(cur->bc_tp, obp); | ||
778 | cur->bc_bufs[lev] = bp; | 775 | cur->bc_bufs[lev] = bp; |
779 | cur->bc_ra[lev] = 0; | 776 | cur->bc_ra[lev] = 0; |
780 | if (!bp) | 777 | |
781 | return; | ||
782 | b = XFS_BUF_TO_BLOCK(bp); | 778 | b = XFS_BUF_TO_BLOCK(bp); |
783 | if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { | 779 | if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { |
784 | if (be64_to_cpu(b->bb_u.l.bb_leftsib) == NULLDFSBNO) | 780 | if (be64_to_cpu(b->bb_u.l.bb_leftsib) == NULLDFSBNO) |
@@ -947,13 +943,13 @@ xfs_btree_set_refs( | |||
947 | switch (cur->bc_btnum) { | 943 | switch (cur->bc_btnum) { |
948 | case XFS_BTNUM_BNO: | 944 | case XFS_BTNUM_BNO: |
949 | case XFS_BTNUM_CNT: | 945 | case XFS_BTNUM_CNT: |
950 | XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_MAP, XFS_ALLOC_BTREE_REF); | 946 | XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_ALLOC_BTREE_REF); |
951 | break; | 947 | break; |
952 | case XFS_BTNUM_INO: | 948 | case XFS_BTNUM_INO: |
953 | XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_INOMAP, XFS_INO_BTREE_REF); | 949 | XFS_BUF_SET_VTYPE_REF(bp, B_FS_INOMAP, XFS_INO_BTREE_REF); |
954 | break; | 950 | break; |
955 | case XFS_BTNUM_BMAP: | 951 | case XFS_BTNUM_BMAP: |
956 | XFS_BUF_SET_VTYPE_REF(*bpp, B_FS_MAP, XFS_BMAP_BTREE_REF); | 952 | XFS_BUF_SET_VTYPE_REF(bp, B_FS_MAP, XFS_BMAP_BTREE_REF); |
957 | break; | 953 | break; |
958 | default: | 954 | default: |
959 | ASSERT(0); | 955 | ASSERT(0); |
@@ -3011,6 +3007,43 @@ out0: | |||
3011 | return 0; | 3007 | return 0; |
3012 | } | 3008 | } |
3013 | 3009 | ||
3010 | /* | ||
3011 | * Kill the current root node, and replace it with it's only child node. | ||
3012 | */ | ||
3013 | STATIC int | ||
3014 | xfs_btree_kill_root( | ||
3015 | struct xfs_btree_cur *cur, | ||
3016 | struct xfs_buf *bp, | ||
3017 | int level, | ||
3018 | union xfs_btree_ptr *newroot) | ||
3019 | { | ||
3020 | int error; | ||
3021 | |||
3022 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); | ||
3023 | XFS_BTREE_STATS_INC(cur, killroot); | ||
3024 | |||
3025 | /* | ||
3026 | * Update the root pointer, decreasing the level by 1 and then | ||
3027 | * free the old root. | ||
3028 | */ | ||
3029 | cur->bc_ops->set_root(cur, newroot, -1); | ||
3030 | |||
3031 | error = cur->bc_ops->free_block(cur, bp); | ||
3032 | if (error) { | ||
3033 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); | ||
3034 | return error; | ||
3035 | } | ||
3036 | |||
3037 | XFS_BTREE_STATS_INC(cur, free); | ||
3038 | |||
3039 | cur->bc_bufs[level] = NULL; | ||
3040 | cur->bc_ra[level] = 0; | ||
3041 | cur->bc_nlevels--; | ||
3042 | |||
3043 | XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); | ||
3044 | return 0; | ||
3045 | } | ||
3046 | |||
3014 | STATIC int | 3047 | STATIC int |
3015 | xfs_btree_dec_cursor( | 3048 | xfs_btree_dec_cursor( |
3016 | struct xfs_btree_cur *cur, | 3049 | struct xfs_btree_cur *cur, |
@@ -3195,7 +3228,7 @@ xfs_btree_delrec( | |||
3195 | * Make it the new root of the btree. | 3228 | * Make it the new root of the btree. |
3196 | */ | 3229 | */ |
3197 | pp = xfs_btree_ptr_addr(cur, 1, block); | 3230 | pp = xfs_btree_ptr_addr(cur, 1, block); |
3198 | error = cur->bc_ops->kill_root(cur, bp, level, pp); | 3231 | error = xfs_btree_kill_root(cur, bp, level, pp); |
3199 | if (error) | 3232 | if (error) |
3200 | goto error0; | 3233 | goto error0; |
3201 | } else if (level > 0) { | 3234 | } else if (level > 0) { |