aboutsummaryrefslogtreecommitdiffstats
path: root/fs/xfs/xfs_btree.c
diff options
context:
space:
mode:
authorGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
committerGlenn Elliott <gelliott@cs.unc.edu>2012-03-04 19:47:13 -0500
commitc71c03bda1e86c9d5198c5d83f712e695c4f2a1e (patch)
treeecb166cb3e2b7e2adb3b5e292245fefd23381ac8 /fs/xfs/xfs_btree.c
parentea53c912f8a86a8567697115b6a0d8152beee5c8 (diff)
parent6a00f206debf8a5c8899055726ad127dbeeed098 (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.c65
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
682STATIC int 681STATIC 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 */
766void 765STATIC void
767xfs_btree_setbuf( 766xfs_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 */
3013STATIC int
3014xfs_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
3014STATIC int 3047STATIC int
3015xfs_btree_dec_cursor( 3048xfs_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) {