diff options
author | Christoph Hellwig <hch@infradead.org> | 2008-10-30 02:14:34 -0400 |
---|---|---|
committer | Lachlan McIlroy <lachlan@sgi.com> | 2008-10-30 02:14:34 -0400 |
commit | 7cc95a821df8f09a5d37a923cf8c3a7c3ee00c29 (patch) | |
tree | 8fde02d4c9a52b7da7b3e961f8a23cf4b493a4a4 /fs/xfs/xfs_btree.c | |
parent | 136341b41ad4883bd668120f727a52c42331fe8a (diff) |
[XFS] Always use struct xfs_btree_block instead of short / longform
structures.
Always use the generic xfs_btree_block type instead of the short / long
structures. Add XFS_BTREE_SBLOCK_LEN / XFS_BTREE_LBLOCK_LEN defines for
the length of a short / long form block. The rationale for this is that we
will grow more btree block header variants to support CRCs and other RAS
information, and always accessing them through the same datatype with
unions for the short / long form pointers makes implementing this much
easier.
SGI-PV: 988146
SGI-Modid: xfs-linux-melb:xfs-kern:32300a
Signed-off-by: Christoph Hellwig <hch@infradead.org>
Signed-off-by: Donald Douwsma <donaldd@sgi.com>
Signed-off-by: David Chinner <david@fromorbit.com>
Signed-off-by: Lachlan McIlroy <lachlan@sgi.com>
Diffstat (limited to 'fs/xfs/xfs_btree.c')
-rw-r--r-- | fs/xfs/xfs_btree.c | 81 |
1 files changed, 40 insertions, 41 deletions
diff --git a/fs/xfs/xfs_btree.c b/fs/xfs/xfs_btree.c index 72a26bb76430..7ed59267420d 100644 --- a/fs/xfs/xfs_btree.c +++ b/fs/xfs/xfs_btree.c | |||
@@ -53,10 +53,10 @@ const __uint32_t xfs_magics[XFS_BTNUM_MAX] = { | |||
53 | }; | 53 | }; |
54 | 54 | ||
55 | 55 | ||
56 | int /* error (0 or EFSCORRUPTED) */ | 56 | STATIC int /* error (0 or EFSCORRUPTED) */ |
57 | xfs_btree_check_lblock( | 57 | xfs_btree_check_lblock( |
58 | struct xfs_btree_cur *cur, /* btree cursor */ | 58 | struct xfs_btree_cur *cur, /* btree cursor */ |
59 | struct xfs_btree_lblock *block, /* btree long form block pointer */ | 59 | struct xfs_btree_block *block, /* btree long form block pointer */ |
60 | int level, /* level of the btree block */ | 60 | int level, /* level of the btree block */ |
61 | struct xfs_buf *bp) /* buffer for block, if any */ | 61 | struct xfs_buf *bp) /* buffer for block, if any */ |
62 | { | 62 | { |
@@ -69,12 +69,14 @@ xfs_btree_check_lblock( | |||
69 | be16_to_cpu(block->bb_level) == level && | 69 | be16_to_cpu(block->bb_level) == level && |
70 | be16_to_cpu(block->bb_numrecs) <= | 70 | be16_to_cpu(block->bb_numrecs) <= |
71 | cur->bc_ops->get_maxrecs(cur, level) && | 71 | cur->bc_ops->get_maxrecs(cur, level) && |
72 | block->bb_leftsib && | 72 | block->bb_u.l.bb_leftsib && |
73 | (be64_to_cpu(block->bb_leftsib) == NULLDFSBNO || | 73 | (be64_to_cpu(block->bb_u.l.bb_leftsib) == NULLDFSBNO || |
74 | XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_leftsib))) && | 74 | XFS_FSB_SANITY_CHECK(mp, |
75 | block->bb_rightsib && | 75 | be64_to_cpu(block->bb_u.l.bb_leftsib))) && |
76 | (be64_to_cpu(block->bb_rightsib) == NULLDFSBNO || | 76 | block->bb_u.l.bb_rightsib && |
77 | XFS_FSB_SANITY_CHECK(mp, be64_to_cpu(block->bb_rightsib))); | 77 | (be64_to_cpu(block->bb_u.l.bb_rightsib) == NULLDFSBNO || |
78 | XFS_FSB_SANITY_CHECK(mp, | ||
79 | be64_to_cpu(block->bb_u.l.bb_rightsib))); | ||
78 | if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, | 80 | if (unlikely(XFS_TEST_ERROR(!lblock_ok, mp, |
79 | XFS_ERRTAG_BTREE_CHECK_LBLOCK, | 81 | XFS_ERRTAG_BTREE_CHECK_LBLOCK, |
80 | XFS_RANDOM_BTREE_CHECK_LBLOCK))) { | 82 | XFS_RANDOM_BTREE_CHECK_LBLOCK))) { |
@@ -90,7 +92,7 @@ xfs_btree_check_lblock( | |||
90 | STATIC int /* error (0 or EFSCORRUPTED) */ | 92 | STATIC int /* error (0 or EFSCORRUPTED) */ |
91 | xfs_btree_check_sblock( | 93 | xfs_btree_check_sblock( |
92 | struct xfs_btree_cur *cur, /* btree cursor */ | 94 | struct xfs_btree_cur *cur, /* btree cursor */ |
93 | struct xfs_btree_sblock *block, /* btree short form block pointer */ | 95 | struct xfs_btree_block *block, /* btree short form block pointer */ |
94 | int level, /* level of the btree block */ | 96 | int level, /* level of the btree block */ |
95 | struct xfs_buf *bp) /* buffer containing block */ | 97 | struct xfs_buf *bp) /* buffer containing block */ |
96 | { | 98 | { |
@@ -107,12 +109,12 @@ xfs_btree_check_sblock( | |||
107 | be16_to_cpu(block->bb_level) == level && | 109 | be16_to_cpu(block->bb_level) == level && |
108 | be16_to_cpu(block->bb_numrecs) <= | 110 | be16_to_cpu(block->bb_numrecs) <= |
109 | cur->bc_ops->get_maxrecs(cur, level) && | 111 | cur->bc_ops->get_maxrecs(cur, level) && |
110 | (be32_to_cpu(block->bb_leftsib) == NULLAGBLOCK || | 112 | (be32_to_cpu(block->bb_u.s.bb_leftsib) == NULLAGBLOCK || |
111 | be32_to_cpu(block->bb_leftsib) < agflen) && | 113 | be32_to_cpu(block->bb_u.s.bb_leftsib) < agflen) && |
112 | block->bb_leftsib && | 114 | block->bb_u.s.bb_leftsib && |
113 | (be32_to_cpu(block->bb_rightsib) == NULLAGBLOCK || | 115 | (be32_to_cpu(block->bb_u.s.bb_rightsib) == NULLAGBLOCK || |
114 | be32_to_cpu(block->bb_rightsib) < agflen) && | 116 | be32_to_cpu(block->bb_u.s.bb_rightsib) < agflen) && |
115 | block->bb_rightsib; | 117 | block->bb_u.s.bb_rightsib; |
116 | if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, | 118 | if (unlikely(XFS_TEST_ERROR(!sblock_ok, cur->bc_mp, |
117 | XFS_ERRTAG_BTREE_CHECK_SBLOCK, | 119 | XFS_ERRTAG_BTREE_CHECK_SBLOCK, |
118 | XFS_RANDOM_BTREE_CHECK_SBLOCK))) { | 120 | XFS_RANDOM_BTREE_CHECK_SBLOCK))) { |
@@ -135,13 +137,10 @@ xfs_btree_check_block( | |||
135 | int level, /* level of the btree block */ | 137 | int level, /* level of the btree block */ |
136 | struct xfs_buf *bp) /* buffer containing block, if any */ | 138 | struct xfs_buf *bp) /* buffer containing block, if any */ |
137 | { | 139 | { |
138 | if (cur->bc_flags & XFS_BTREE_LONG_PTRS) { | 140 | if (cur->bc_flags & XFS_BTREE_LONG_PTRS) |
139 | return xfs_btree_check_lblock(cur, | 141 | return xfs_btree_check_lblock(cur, block, level, bp); |
140 | (struct xfs_btree_lblock *)block, level, bp); | 142 | else |
141 | } else { | 143 | return xfs_btree_check_sblock(cur, block, level, bp); |
142 | return xfs_btree_check_sblock(cur, | ||
143 | (struct xfs_btree_sblock *)block, level, bp); | ||
144 | } | ||
145 | } | 144 | } |
146 | 145 | ||
147 | /* | 146 | /* |
@@ -326,8 +325,8 @@ xfs_btree_dup_cursor( | |||
326 | static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) | 325 | static inline size_t xfs_btree_block_len(struct xfs_btree_cur *cur) |
327 | { | 326 | { |
328 | return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? | 327 | return (cur->bc_flags & XFS_BTREE_LONG_PTRS) ? |
329 | sizeof(struct xfs_btree_lblock) : | 328 | XFS_BTREE_LBLOCK_LEN : |
330 | sizeof(struct xfs_btree_sblock); | 329 | XFS_BTREE_SBLOCK_LEN; |
331 | } | 330 | } |
332 | 331 | ||
333 | /* | 332 | /* |
@@ -510,7 +509,7 @@ xfs_btree_islastblock( | |||
510 | xfs_btree_cur_t *cur, /* btree cursor */ | 509 | xfs_btree_cur_t *cur, /* btree cursor */ |
511 | int level) /* level to check */ | 510 | int level) /* level to check */ |
512 | { | 511 | { |
513 | xfs_btree_block_t *block; /* generic btree block pointer */ | 512 | struct xfs_btree_block *block; /* generic btree block pointer */ |
514 | xfs_buf_t *bp; /* buffer containing block */ | 513 | xfs_buf_t *bp; /* buffer containing block */ |
515 | 514 | ||
516 | block = xfs_btree_get_block(cur, level, &bp); | 515 | block = xfs_btree_get_block(cur, level, &bp); |
@@ -530,7 +529,7 @@ xfs_btree_firstrec( | |||
530 | xfs_btree_cur_t *cur, /* btree cursor */ | 529 | xfs_btree_cur_t *cur, /* btree cursor */ |
531 | int level) /* level to change */ | 530 | int level) /* level to change */ |
532 | { | 531 | { |
533 | xfs_btree_block_t *block; /* generic btree block pointer */ | 532 | struct xfs_btree_block *block; /* generic btree block pointer */ |
534 | xfs_buf_t *bp; /* buffer containing block */ | 533 | xfs_buf_t *bp; /* buffer containing block */ |
535 | 534 | ||
536 | /* | 535 | /* |
@@ -559,7 +558,7 @@ xfs_btree_lastrec( | |||
559 | xfs_btree_cur_t *cur, /* btree cursor */ | 558 | xfs_btree_cur_t *cur, /* btree cursor */ |
560 | int level) /* level to change */ | 559 | int level) /* level to change */ |
561 | { | 560 | { |
562 | xfs_btree_block_t *block; /* generic btree block pointer */ | 561 | struct xfs_btree_block *block; /* generic btree block pointer */ |
563 | xfs_buf_t *bp; /* buffer containing block */ | 562 | xfs_buf_t *bp; /* buffer containing block */ |
564 | 563 | ||
565 | /* | 564 | /* |
@@ -814,7 +813,7 @@ xfs_btree_setbuf( | |||
814 | int lev, /* level in btree */ | 813 | int lev, /* level in btree */ |
815 | xfs_buf_t *bp) /* new buffer to set */ | 814 | xfs_buf_t *bp) /* new buffer to set */ |
816 | { | 815 | { |
817 | xfs_btree_block_t *b; /* btree block */ | 816 | struct xfs_btree_block *b; /* btree block */ |
818 | xfs_buf_t *obp; /* old buffer pointer */ | 817 | xfs_buf_t *obp; /* old buffer pointer */ |
819 | 818 | ||
820 | obp = cur->bc_bufs[lev]; | 819 | obp = cur->bc_bufs[lev]; |
@@ -1252,20 +1251,20 @@ xfs_btree_log_block( | |||
1252 | int first; /* first byte offset logged */ | 1251 | int first; /* first byte offset logged */ |
1253 | int last; /* last byte offset logged */ | 1252 | int last; /* last byte offset logged */ |
1254 | static const short soffsets[] = { /* table of offsets (short) */ | 1253 | static const short soffsets[] = { /* table of offsets (short) */ |
1255 | offsetof(struct xfs_btree_sblock, bb_magic), | 1254 | offsetof(struct xfs_btree_block, bb_magic), |
1256 | offsetof(struct xfs_btree_sblock, bb_level), | 1255 | offsetof(struct xfs_btree_block, bb_level), |
1257 | offsetof(struct xfs_btree_sblock, bb_numrecs), | 1256 | offsetof(struct xfs_btree_block, bb_numrecs), |
1258 | offsetof(struct xfs_btree_sblock, bb_leftsib), | 1257 | offsetof(struct xfs_btree_block, bb_u.s.bb_leftsib), |
1259 | offsetof(struct xfs_btree_sblock, bb_rightsib), | 1258 | offsetof(struct xfs_btree_block, bb_u.s.bb_rightsib), |
1260 | sizeof(struct xfs_btree_sblock) | 1259 | XFS_BTREE_SBLOCK_LEN |
1261 | }; | 1260 | }; |
1262 | static const short loffsets[] = { /* table of offsets (long) */ | 1261 | static const short loffsets[] = { /* table of offsets (long) */ |
1263 | offsetof(struct xfs_btree_lblock, bb_magic), | 1262 | offsetof(struct xfs_btree_block, bb_magic), |
1264 | offsetof(struct xfs_btree_lblock, bb_level), | 1263 | offsetof(struct xfs_btree_block, bb_level), |
1265 | offsetof(struct xfs_btree_lblock, bb_numrecs), | 1264 | offsetof(struct xfs_btree_block, bb_numrecs), |
1266 | offsetof(struct xfs_btree_lblock, bb_leftsib), | 1265 | offsetof(struct xfs_btree_block, bb_u.l.bb_leftsib), |
1267 | offsetof(struct xfs_btree_lblock, bb_rightsib), | 1266 | offsetof(struct xfs_btree_block, bb_u.l.bb_rightsib), |
1268 | sizeof(struct xfs_btree_lblock) | 1267 | XFS_BTREE_LBLOCK_LEN |
1269 | }; | 1268 | }; |
1270 | 1269 | ||
1271 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); | 1270 | XFS_BTREE_TRACE_CURSOR(cur, XBT_ENTRY); |
@@ -3018,7 +3017,7 @@ xfs_btree_kill_iroot( | |||
3018 | if (index) { | 3017 | if (index) { |
3019 | xfs_iroot_realloc(cur->bc_private.b.ip, index, | 3018 | xfs_iroot_realloc(cur->bc_private.b.ip, index, |
3020 | cur->bc_private.b.whichfork); | 3019 | cur->bc_private.b.whichfork); |
3021 | block = (struct xfs_btree_block *)ifp->if_broot; | 3020 | block = ifp->if_broot; |
3022 | } | 3021 | } |
3023 | 3022 | ||
3024 | be16_add_cpu(&block->bb_numrecs, index); | 3023 | be16_add_cpu(&block->bb_numrecs, index); |