diff options
author | Christoph Hellwig <hch@infradead.org> | 2008-10-30 01:56:22 -0400 |
---|---|---|
committer | Lachlan McIlroy <lachlan@sgi.com> | 2008-10-30 01:56:22 -0400 |
commit | 38bb74237d2d94c1aced2ec626d7d0f317e360da (patch) | |
tree | e37dfdad942de0e98c36c0fdf781cc29cd2daf0c | |
parent | fe033cc848489851f0c7de48f0b1bab5d744ad8a (diff) |
[XFS] implement generic xfs_btree_updkey
From: Dave Chinner <dgc@sgi.com>
Note that there are many > 80 char lines introduced due to the
xfs_btree_key casts. But the places where this happens is throw-away code
once the whole btree code gets merged into a common implementation.
The same is true for the temporary xfs_alloc_log_keys define to the new
name. All old users will be gone after a few patches.
[hch: split out from bigger patch and minor adaptions]
SGI-PV: 985583
SGI-Modid: xfs-linux-melb:xfs-kern:32193a
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Signed-off-by: Bill O'Donnell <billodo@sgi.com>
Signed-off-by: David Chinner <david@fromorbit.com>
-rw-r--r-- | fs/xfs/xfs_alloc_btree.c | 50 | ||||
-rw-r--r-- | fs/xfs/xfs_bmap_btree.c | 49 | ||||
-rw-r--r-- | fs/xfs/xfs_btree.c | 87 | ||||
-rw-r--r-- | fs/xfs/xfs_btree.h | 1 | ||||
-rw-r--r-- | fs/xfs/xfs_ialloc_btree.c | 50 |
5 files changed, 103 insertions, 134 deletions
diff --git a/fs/xfs/xfs_alloc_btree.c b/fs/xfs/xfs_alloc_btree.c index b81fbf1216ed..28c6a698f562 100644 --- a/fs/xfs/xfs_alloc_btree.c +++ b/fs/xfs/xfs_alloc_btree.c | |||
@@ -52,7 +52,6 @@ STATIC int xfs_alloc_newroot(xfs_btree_cur_t *, int *); | |||
52 | STATIC int xfs_alloc_rshift(xfs_btree_cur_t *, int, int *); | 52 | STATIC int xfs_alloc_rshift(xfs_btree_cur_t *, int, int *); |
53 | STATIC int xfs_alloc_split(xfs_btree_cur_t *, int, xfs_agblock_t *, | 53 | STATIC int xfs_alloc_split(xfs_btree_cur_t *, int, xfs_agblock_t *, |
54 | xfs_alloc_key_t *, xfs_btree_cur_t **, int *); | 54 | xfs_alloc_key_t *, xfs_btree_cur_t **, int *); |
55 | STATIC int xfs_alloc_updkey(xfs_btree_cur_t *, xfs_alloc_key_t *, int); | ||
56 | 55 | ||
57 | /* | 56 | /* |
58 | * Internal functions. | 57 | * Internal functions. |
@@ -265,7 +264,7 @@ xfs_alloc_delrec( | |||
265 | * If we deleted the leftmost entry in the block, update the | 264 | * If we deleted the leftmost entry in the block, update the |
266 | * key values above us in the tree. | 265 | * key values above us in the tree. |
267 | */ | 266 | */ |
268 | if (ptr == 1 && (error = xfs_alloc_updkey(cur, lkp, level + 1))) | 267 | if (ptr == 1 && (error = xfs_btree_updkey(cur, (union xfs_btree_key *)lkp, level + 1))) |
269 | return error; | 268 | return error; |
270 | /* | 269 | /* |
271 | * If the number of records remaining in the block is at least | 270 | * If the number of records remaining in the block is at least |
@@ -798,7 +797,7 @@ xfs_alloc_insrec( | |||
798 | /* | 797 | /* |
799 | * If we inserted at the start of a block, update the parents' keys. | 798 | * If we inserted at the start of a block, update the parents' keys. |
800 | */ | 799 | */ |
801 | if (optr == 1 && (error = xfs_alloc_updkey(cur, &key, level + 1))) | 800 | if (optr == 1 && (error = xfs_btree_updkey(cur, (union xfs_btree_key *)&key, level + 1))) |
802 | return error; | 801 | return error; |
803 | /* | 802 | /* |
804 | * Look to see if the longest extent in the allocation group | 803 | * Look to see if the longest extent in the allocation group |
@@ -1068,7 +1067,7 @@ xfs_alloc_lshift( | |||
1068 | /* | 1067 | /* |
1069 | * Update the parent key values of right. | 1068 | * Update the parent key values of right. |
1070 | */ | 1069 | */ |
1071 | if ((error = xfs_alloc_updkey(cur, rkp, level + 1))) | 1070 | if ((error = xfs_btree_updkey(cur, (union xfs_btree_key *)rkp, level + 1))) |
1072 | return error; | 1071 | return error; |
1073 | /* | 1072 | /* |
1074 | * Slide the cursor value left one. | 1073 | * Slide the cursor value left one. |
@@ -1354,7 +1353,7 @@ xfs_alloc_rshift( | |||
1354 | i = xfs_btree_lastrec(tcur, level); | 1353 | i = xfs_btree_lastrec(tcur, level); |
1355 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1354 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); |
1356 | if ((error = xfs_btree_increment(tcur, level, &i)) || | 1355 | if ((error = xfs_btree_increment(tcur, level, &i)) || |
1357 | (error = xfs_alloc_updkey(tcur, rkp, level + 1))) | 1356 | (error = xfs_btree_updkey(tcur, (union xfs_btree_key *)rkp, level + 1))) |
1358 | goto error0; | 1357 | goto error0; |
1359 | xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); | 1358 | xfs_btree_del_cursor(tcur, XFS_BTREE_NOERROR); |
1360 | *stat = 1; | 1359 | *stat = 1; |
@@ -1520,45 +1519,6 @@ xfs_alloc_split( | |||
1520 | } | 1519 | } |
1521 | 1520 | ||
1522 | /* | 1521 | /* |
1523 | * Update keys at all levels from here to the root along the cursor's path. | ||
1524 | */ | ||
1525 | STATIC int /* error */ | ||
1526 | xfs_alloc_updkey( | ||
1527 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
1528 | xfs_alloc_key_t *keyp, /* new key value to update to */ | ||
1529 | int level) /* starting level for update */ | ||
1530 | { | ||
1531 | int ptr; /* index of key in block */ | ||
1532 | |||
1533 | /* | ||
1534 | * Go up the tree from this level toward the root. | ||
1535 | * At each level, update the key value to the value input. | ||
1536 | * Stop when we reach a level where the cursor isn't pointing | ||
1537 | * at the first entry in the block. | ||
1538 | */ | ||
1539 | for (ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { | ||
1540 | xfs_alloc_block_t *block; /* btree block */ | ||
1541 | xfs_buf_t *bp; /* buffer for block */ | ||
1542 | #ifdef DEBUG | ||
1543 | int error; /* error return value */ | ||
1544 | #endif | ||
1545 | xfs_alloc_key_t *kp; /* ptr to btree block keys */ | ||
1546 | |||
1547 | bp = cur->bc_bufs[level]; | ||
1548 | block = XFS_BUF_TO_ALLOC_BLOCK(bp); | ||
1549 | #ifdef DEBUG | ||
1550 | if ((error = xfs_btree_check_sblock(cur, block, level, bp))) | ||
1551 | return error; | ||
1552 | #endif | ||
1553 | ptr = cur->bc_ptrs[level]; | ||
1554 | kp = XFS_ALLOC_KEY_ADDR(block, ptr, cur); | ||
1555 | *kp = *keyp; | ||
1556 | xfs_alloc_log_keys(cur, bp, ptr, ptr); | ||
1557 | } | ||
1558 | return 0; | ||
1559 | } | ||
1560 | |||
1561 | /* | ||
1562 | * Externally visible routines. | 1522 | * Externally visible routines. |
1563 | */ | 1523 | */ |
1564 | 1524 | ||
@@ -1765,7 +1725,7 @@ xfs_alloc_update( | |||
1765 | 1725 | ||
1766 | key.ar_startblock = cpu_to_be32(bno); | 1726 | key.ar_startblock = cpu_to_be32(bno); |
1767 | key.ar_blockcount = cpu_to_be32(len); | 1727 | key.ar_blockcount = cpu_to_be32(len); |
1768 | if ((error = xfs_alloc_updkey(cur, &key, 1))) | 1728 | if ((error = xfs_btree_updkey(cur, (union xfs_btree_key *)&key, 1))) |
1769 | return error; | 1729 | return error; |
1770 | } | 1730 | } |
1771 | return 0; | 1731 | return 0; |
diff --git a/fs/xfs/xfs_bmap_btree.c b/fs/xfs/xfs_bmap_btree.c index 8403d154ae09..0a56257b7fd5 100644 --- a/fs/xfs/xfs_bmap_btree.c +++ b/fs/xfs/xfs_bmap_btree.c | |||
@@ -56,7 +56,6 @@ STATIC int xfs_bmbt_lshift(xfs_btree_cur_t *, int, int *); | |||
56 | STATIC int xfs_bmbt_rshift(xfs_btree_cur_t *, int, int *); | 56 | STATIC int xfs_bmbt_rshift(xfs_btree_cur_t *, int, int *); |
57 | STATIC int xfs_bmbt_split(xfs_btree_cur_t *, int, xfs_fsblock_t *, | 57 | STATIC int xfs_bmbt_split(xfs_btree_cur_t *, int, xfs_fsblock_t *, |
58 | __uint64_t *, xfs_btree_cur_t **, int *); | 58 | __uint64_t *, xfs_btree_cur_t **, int *); |
59 | STATIC int xfs_bmbt_updkey(xfs_btree_cur_t *, xfs_bmbt_key_t *, int); | ||
60 | 59 | ||
61 | #undef EXIT | 60 | #undef EXIT |
62 | 61 | ||
@@ -211,7 +210,7 @@ xfs_bmbt_delrec( | |||
211 | *stat = 1; | 210 | *stat = 1; |
212 | return 0; | 211 | return 0; |
213 | } | 212 | } |
214 | if (ptr == 1 && (error = xfs_bmbt_updkey(cur, kp, level + 1))) { | 213 | if (ptr == 1 && (error = xfs_btree_updkey(cur, (union xfs_btree_key *)kp, level + 1))) { |
215 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); | 214 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); |
216 | goto error0; | 215 | goto error0; |
217 | } | 216 | } |
@@ -635,7 +634,7 @@ xfs_bmbt_insrec( | |||
635 | kp + ptr); | 634 | kp + ptr); |
636 | } | 635 | } |
637 | #endif | 636 | #endif |
638 | if (optr == 1 && (error = xfs_bmbt_updkey(cur, &key, level + 1))) { | 637 | if (optr == 1 && (error = xfs_btree_updkey(cur, (union xfs_btree_key *)&key, level + 1))) { |
639 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); | 638 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); |
640 | return error; | 639 | return error; |
641 | } | 640 | } |
@@ -935,7 +934,7 @@ xfs_bmbt_lshift( | |||
935 | key.br_startoff = cpu_to_be64(xfs_bmbt_disk_get_startoff(rrp)); | 934 | key.br_startoff = cpu_to_be64(xfs_bmbt_disk_get_startoff(rrp)); |
936 | rkp = &key; | 935 | rkp = &key; |
937 | } | 936 | } |
938 | if ((error = xfs_bmbt_updkey(cur, rkp, level + 1))) { | 937 | if ((error = xfs_btree_updkey(cur, (union xfs_btree_key *)rkp, level + 1))) { |
939 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); | 938 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); |
940 | return error; | 939 | return error; |
941 | } | 940 | } |
@@ -1067,7 +1066,7 @@ xfs_bmbt_rshift( | |||
1067 | goto error1; | 1066 | goto error1; |
1068 | } | 1067 | } |
1069 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); | 1068 | XFS_WANT_CORRUPTED_GOTO(i == 1, error0); |
1070 | if ((error = xfs_bmbt_updkey(tcur, rkp, level + 1))) { | 1069 | if ((error = xfs_btree_updkey(tcur, (union xfs_btree_key *)rkp, level + 1))) { |
1071 | XFS_BMBT_TRACE_CURSOR(tcur, ERROR); | 1070 | XFS_BMBT_TRACE_CURSOR(tcur, ERROR); |
1072 | goto error1; | 1071 | goto error1; |
1073 | } | 1072 | } |
@@ -1276,44 +1275,6 @@ xfs_bmbt_split( | |||
1276 | return 0; | 1275 | return 0; |
1277 | } | 1276 | } |
1278 | 1277 | ||
1279 | |||
1280 | /* | ||
1281 | * Update keys for the record. | ||
1282 | */ | ||
1283 | STATIC int | ||
1284 | xfs_bmbt_updkey( | ||
1285 | xfs_btree_cur_t *cur, | ||
1286 | xfs_bmbt_key_t *keyp, /* on-disk format */ | ||
1287 | int level) | ||
1288 | { | ||
1289 | xfs_bmbt_block_t *block; | ||
1290 | xfs_buf_t *bp; | ||
1291 | #ifdef DEBUG | ||
1292 | int error; | ||
1293 | #endif | ||
1294 | xfs_bmbt_key_t *kp; | ||
1295 | int ptr; | ||
1296 | |||
1297 | ASSERT(level >= 1); | ||
1298 | XFS_BMBT_TRACE_CURSOR(cur, ENTRY); | ||
1299 | XFS_BMBT_TRACE_ARGIK(cur, level, keyp); | ||
1300 | for (ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { | ||
1301 | block = xfs_bmbt_get_block(cur, level, &bp); | ||
1302 | #ifdef DEBUG | ||
1303 | if ((error = xfs_btree_check_lblock(cur, block, level, bp))) { | ||
1304 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); | ||
1305 | return error; | ||
1306 | } | ||
1307 | #endif | ||
1308 | ptr = cur->bc_ptrs[level]; | ||
1309 | kp = XFS_BMAP_KEY_IADDR(block, ptr, cur); | ||
1310 | *kp = *keyp; | ||
1311 | xfs_bmbt_log_keys(cur, bp, ptr, ptr); | ||
1312 | } | ||
1313 | XFS_BMBT_TRACE_CURSOR(cur, EXIT); | ||
1314 | return 0; | ||
1315 | } | ||
1316 | |||
1317 | /* | 1278 | /* |
1318 | * Convert on-disk form of btree root to in-memory form. | 1279 | * Convert on-disk form of btree root to in-memory form. |
1319 | */ | 1280 | */ |
@@ -2039,7 +2000,7 @@ xfs_bmbt_update( | |||
2039 | return 0; | 2000 | return 0; |
2040 | } | 2001 | } |
2041 | key.br_startoff = cpu_to_be64(off); | 2002 | key.br_startoff = cpu_to_be64(off); |
2042 | if ((error = xfs_bmbt_updkey(cur, &key, 1))) { | 2003 | if ((error = xfs_btree_updkey(cur, (union xfs_btree_key *)&key, 1))) { |
2043 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); | 2004 | XFS_BMBT_TRACE_CURSOR(cur, ERROR); |
2044 | return error; | 2005 | return error; |
2045 | } | 2006 | } |
diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 41912a01bec7..1459a2b9a729 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c | |||
@@ -34,6 +34,7 @@ | |||
34 | #include "xfs_attr_sf.h" | 34 | #include "xfs_attr_sf.h" |
35 | #include "xfs_dinode.h" | 35 | #include "xfs_dinode.h" |
36 | #include "xfs_inode.h" | 36 | #include "xfs_inode.h" |
37 | #include "xfs_inode_item.h" | ||
37 | #include "xfs_btree.h" | 38 | #include "xfs_btree.h" |
38 | #include "xfs_btree_trace.h" | 39 | #include "xfs_btree_trace.h" |
39 | #include "xfs_ialloc.h" | 40 | #include "xfs_ialloc.h" |
@@ -1065,6 +1066,45 @@ xfs_btree_read_buf_block( | |||
1065 | } | 1066 | } |
1066 | 1067 | ||
1067 | /* | 1068 | /* |
1069 | * Copy keys from one btree block to another. | ||
1070 | */ | ||
1071 | STATIC void | ||
1072 | xfs_btree_copy_keys( | ||
1073 | struct xfs_btree_cur *cur, | ||
1074 | union xfs_btree_key *dst_key, | ||
1075 | union xfs_btree_key *src_key, | ||
1076 | int numkeys) | ||
1077 | { | ||
1078 | ASSERT(numkeys >= 0); | ||
1079 | memcpy(dst_key, src_key, numkeys * cur->bc_ops->key_len); | ||
1080 | } | ||
1081 | |||
1082 | /* | ||
1083 | * Log key values from the btree block. | ||
1084 | */ | ||
1085 | STATIC void | ||
1086 | xfs_btree_log_keys( | ||
1087 | struct xfs_btree_cur *cur, | ||
1088 | struct xfs_buf *bp, | ||
1089 | int first, | ||
1090 | int last) | ||
1091 | { | ||
1092 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); | ||
1093 | XFS_BTREE_TRACE_ARGBII(cur, bp, first, last); | ||
1094 | |||
1095 | if (bp) { | ||
1096 | xfs_trans_log_buf(cur->bc_tp, bp, | ||
1097 | xfs_btree_key_offset(cur, first), | ||
1098 | xfs_btree_key_offset(cur, last + 1) - 1); | ||
1099 | } else { | ||
1100 | xfs_trans_log_inode(cur->bc_tp, cur->bc_private.b.ip, | ||
1101 | xfs_ilog_fbroot(cur->bc_private.b.whichfork)); | ||
1102 | } | ||
1103 | |||
1104 | XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); | ||
1105 | } | ||
1106 | |||
1107 | /* | ||
1068 | * Increment cursor by one record at the level. | 1108 | * Increment cursor by one record at the level. |
1069 | * For nonzero levels the leaf-ward information is untouched. | 1109 | * For nonzero levels the leaf-ward information is untouched. |
1070 | */ | 1110 | */ |
@@ -1489,3 +1529,50 @@ error0: | |||
1489 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); | 1529 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); |
1490 | return error; | 1530 | return error; |
1491 | } | 1531 | } |
1532 | |||
1533 | /* | ||
1534 | * Update keys at all levels from here to the root along the cursor's path. | ||
1535 | */ | ||
1536 | int | ||
1537 | xfs_btree_updkey( | ||
1538 | struct xfs_btree_cur *cur, | ||
1539 | union xfs_btree_key *keyp, | ||
1540 | int level) | ||
1541 | { | ||
1542 | struct xfs_btree_block *block; | ||
1543 | struct xfs_buf *bp; | ||
1544 | union xfs_btree_key *kp; | ||
1545 | int ptr; | ||
1546 | |||
1547 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); | ||
1548 | XFS_BTREE_TRACE_ARGIK(cur, level, keyp); | ||
1549 | |||
1550 | ASSERT(!(cur->bc_flags & XFS_BTREE_ROOT_IN_INODE) || level >= 1); | ||
1551 | |||
1552 | /* | ||
1553 | * Go up the tree from this level toward the root. | ||
1554 | * At each level, update the key value to the value input. | ||
1555 | * Stop when we reach a level where the cursor isn't pointing | ||
1556 | * at the first entry in the block. | ||
1557 | */ | ||
1558 | for (ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { | ||
1559 | #ifdef DEBUG | ||
1560 | int error; | ||
1561 | #endif | ||
1562 | block = xfs_btree_get_block(cur, level, &bp); | ||
1563 | #ifdef DEBUG | ||
1564 | error = xfs_btree_check_block(cur, block, level, bp); | ||
1565 | if (error) { | ||
1566 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ERROR); | ||
1567 | return error; | ||
1568 | } | ||
1569 | #endif | ||
1570 | ptr = cur->bc_ptrs[level]; | ||
1571 | kp = xfs_btree_key_addr(cur, ptr, block); | ||
1572 | xfs_btree_copy_keys(cur, kp, keyp, 1); | ||
1573 | xfs_btree_log_keys(cur, bp, ptr, ptr); | ||
1574 | } | ||
1575 | |||
1576 | XFS_BTREE_TRACE_CURSOR(cur, XBT_EXIT); | ||
1577 | return 0; | ||
1578 | } | ||
diff --git a/fs/xfs/xfs_btree.h b/fs/xfs/xfs_btree.h index c151175a5fd0..ac3f527b0ac4 100644 --- a/fs/xfs/xfs_btree.h +++ b/fs/xfs/xfs_btree.h | |||
@@ -518,6 +518,7 @@ xfs_btree_setbuf( | |||
518 | int xfs_btree_increment(struct xfs_btree_cur *, int, int *); | 518 | int xfs_btree_increment(struct xfs_btree_cur *, int, int *); |
519 | int xfs_btree_decrement(struct xfs_btree_cur *, int, int *); | 519 | int xfs_btree_decrement(struct xfs_btree_cur *, int, int *); |
520 | int xfs_btree_lookup(struct xfs_btree_cur *, xfs_lookup_t, int *); | 520 | int xfs_btree_lookup(struct xfs_btree_cur *, xfs_lookup_t, int *); |
521 | int xfs_btree_updkey(struct xfs_btree_cur *, union xfs_btree_key *, int); | ||
521 | 522 | ||
522 | /* | 523 | /* |
523 | * Helpers. | 524 | * Helpers. |
diff --git a/fs/xfs/xfs_ialloc_btree.c b/fs/xfs/xfs_ialloc_btree.c index 161c3b2e245f..cd8bb519cb5f 100644 --- a/fs/xfs/xfs_ialloc_btree.c +++ b/fs/xfs/xfs_ialloc_btree.c | |||
@@ -48,7 +48,6 @@ STATIC int xfs_inobt_newroot(xfs_btree_cur_t *, int *); | |||
48 | STATIC int xfs_inobt_rshift(xfs_btree_cur_t *, int, int *); | 48 | STATIC int xfs_inobt_rshift(xfs_btree_cur_t *, int, int *); |
49 | STATIC int xfs_inobt_split(xfs_btree_cur_t *, int, xfs_agblock_t *, | 49 | STATIC int xfs_inobt_split(xfs_btree_cur_t *, int, xfs_agblock_t *, |
50 | xfs_inobt_key_t *, xfs_btree_cur_t **, int *); | 50 | xfs_inobt_key_t *, xfs_btree_cur_t **, int *); |
51 | STATIC int xfs_inobt_updkey(xfs_btree_cur_t *, xfs_inobt_key_t *, int); | ||
52 | 51 | ||
53 | /* | 52 | /* |
54 | * Single level of the xfs_inobt_delete record deletion routine. | 53 | * Single level of the xfs_inobt_delete record deletion routine. |
@@ -214,7 +213,7 @@ xfs_inobt_delrec( | |||
214 | * If we deleted the leftmost entry in the block, update the | 213 | * If we deleted the leftmost entry in the block, update the |
215 | * key values above us in the tree. | 214 | * key values above us in the tree. |
216 | */ | 215 | */ |
217 | if (ptr == 1 && (error = xfs_inobt_updkey(cur, kp, level + 1))) | 216 | if (ptr == 1 && (error = xfs_btree_updkey(cur, (union xfs_btree_key *)kp, level + 1))) |
218 | return error; | 217 | return error; |
219 | /* | 218 | /* |
220 | * If the number of records remaining in the block is at least | 219 | * If the number of records remaining in the block is at least |
@@ -723,7 +722,7 @@ xfs_inobt_insrec( | |||
723 | /* | 722 | /* |
724 | * If we inserted at the start of a block, update the parents' keys. | 723 | * If we inserted at the start of a block, update the parents' keys. |
725 | */ | 724 | */ |
726 | if (optr == 1 && (error = xfs_inobt_updkey(cur, &key, level + 1))) | 725 | if (optr == 1 && (error = xfs_btree_updkey(cur, (union xfs_btree_key *)&key, level + 1))) |
727 | return error; | 726 | return error; |
728 | /* | 727 | /* |
729 | * Return the new block number, if any. | 728 | * Return the new block number, if any. |
@@ -960,7 +959,7 @@ xfs_inobt_lshift( | |||
960 | /* | 959 | /* |
961 | * Update the parent key values of right. | 960 | * Update the parent key values of right. |
962 | */ | 961 | */ |
963 | if ((error = xfs_inobt_updkey(cur, rkp, level + 1))) | 962 | if ((error = xfs_btree_updkey(cur, (union xfs_btree_key *)rkp, level + 1))) |
964 | return error; | 963 | return error; |
965 | /* | 964 | /* |
966 | * Slide the cursor value left one. | 965 | * Slide the cursor value left one. |
@@ -1238,7 +1237,7 @@ xfs_inobt_rshift( | |||
1238 | return error; | 1237 | return error; |
1239 | xfs_btree_lastrec(tcur, level); | 1238 | xfs_btree_lastrec(tcur, level); |
1240 | if ((error = xfs_btree_increment(tcur, level, &i)) || | 1239 | if ((error = xfs_btree_increment(tcur, level, &i)) || |
1241 | (error = xfs_inobt_updkey(tcur, rkp, level + 1))) { | 1240 | (error = xfs_btree_updkey(tcur, (union xfs_btree_key *)rkp, level + 1))) { |
1242 | xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); | 1241 | xfs_btree_del_cursor(tcur, XFS_BTREE_ERROR); |
1243 | return error; | 1242 | return error; |
1244 | } | 1243 | } |
@@ -1407,45 +1406,6 @@ xfs_inobt_split( | |||
1407 | } | 1406 | } |
1408 | 1407 | ||
1409 | /* | 1408 | /* |
1410 | * Update keys at all levels from here to the root along the cursor's path. | ||
1411 | */ | ||
1412 | STATIC int /* error */ | ||
1413 | xfs_inobt_updkey( | ||
1414 | xfs_btree_cur_t *cur, /* btree cursor */ | ||
1415 | xfs_inobt_key_t *keyp, /* new key value to update to */ | ||
1416 | int level) /* starting level for update */ | ||
1417 | { | ||
1418 | int ptr; /* index of key in block */ | ||
1419 | |||
1420 | /* | ||
1421 | * Go up the tree from this level toward the root. | ||
1422 | * At each level, update the key value to the value input. | ||
1423 | * Stop when we reach a level where the cursor isn't pointing | ||
1424 | * at the first entry in the block. | ||
1425 | */ | ||
1426 | for (ptr = 1; ptr == 1 && level < cur->bc_nlevels; level++) { | ||
1427 | xfs_buf_t *bp; /* buffer for block */ | ||
1428 | xfs_inobt_block_t *block; /* btree block */ | ||
1429 | #ifdef DEBUG | ||
1430 | int error; /* error return value */ | ||
1431 | #endif | ||
1432 | xfs_inobt_key_t *kp; /* ptr to btree block keys */ | ||
1433 | |||
1434 | bp = cur->bc_bufs[level]; | ||
1435 | block = XFS_BUF_TO_INOBT_BLOCK(bp); | ||
1436 | #ifdef DEBUG | ||
1437 | if ((error = xfs_btree_check_sblock(cur, block, level, bp))) | ||
1438 | return error; | ||
1439 | #endif | ||
1440 | ptr = cur->bc_ptrs[level]; | ||
1441 | kp = XFS_INOBT_KEY_ADDR(block, ptr, cur); | ||
1442 | *kp = *keyp; | ||
1443 | xfs_inobt_log_keys(cur, bp, ptr, ptr); | ||
1444 | } | ||
1445 | return 0; | ||
1446 | } | ||
1447 | |||
1448 | /* | ||
1449 | * Externally visible routines. | 1409 | * Externally visible routines. |
1450 | */ | 1410 | */ |
1451 | 1411 | ||
@@ -1637,7 +1597,7 @@ xfs_inobt_update( | |||
1637 | xfs_inobt_key_t key; /* key containing [ino] */ | 1597 | xfs_inobt_key_t key; /* key containing [ino] */ |
1638 | 1598 | ||
1639 | key.ir_startino = cpu_to_be32(ino); | 1599 | key.ir_startino = cpu_to_be32(ino); |
1640 | if ((error = xfs_inobt_updkey(cur, &key, 1))) | 1600 | if ((error = xfs_btree_updkey(cur, (union xfs_btree_key *)&key, 1))) |
1641 | return error; | 1601 | return error; |
1642 | } | 1602 | } |
1643 | return 0; | 1603 | return 0; |