summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKeith Bostic <keith.bostic@mongodb.com>2015-07-17 11:14:33 -0400
committerMichael Cahill <michael.cahill@mongodb.com>2015-07-24 11:37:34 +1000
commit0969f76b03c0cfcad011c2b7cc2fa4548d65fc88 (patch)
tree8e97d0416fefd64db4871235596865aff57d213f
parent3963315911b94296889f4cacc226e84ae2cda817 (diff)
downloadmongo-0969f76b03c0cfcad011c2b7cc2fa4548d65fc88.tar.gz
Merge pull request #2070 from wiredtiger/verify-no-panic
WT-2002 If a file is corrupted, verify should not panic. (cherry picked from commit 8af8b8a7ce21ca0ee6743c6af9313fd76817bc9c)
-rw-r--r--src/block/block_ckpt.c11
-rw-r--r--src/block/block_ext.c148
-rw-r--r--src/block/block_slvg.c2
-rw-r--r--src/block/block_vrfy.c14
-rw-r--r--src/include/extern.h6
5 files changed, 107 insertions, 74 deletions
diff --git a/src/block/block_ckpt.c b/src/block/block_ckpt.c
index 18c3978c90f..40bba8184a1 100644
--- a/src/block/block_ckpt.c
+++ b/src/block/block_ckpt.c
@@ -315,7 +315,7 @@ __ckpt_extlist_fblocks(
* file that contains a previous checkpoint's extents.
*/
return (__wt_block_insert_ext(
- session, &block->live.ckpt_avail, el->offset, el->size));
+ session, block, &block->live.ckpt_avail, el->offset, el->size));
}
#ifdef HAVE_DIAGNOSTIC
@@ -537,7 +537,7 @@ __ckpt_process(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_CKPT *ckptbase)
* must be paired in the checkpoint.
*/
if (a->root_offset != WT_BLOCK_INVALID_OFFSET)
- WT_ERR(__wt_block_insert_ext(session,
+ WT_ERR(__wt_block_insert_ext(session, block,
&a->discard, a->root_offset, a->root_size));
/*
@@ -554,10 +554,10 @@ __ckpt_process(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_CKPT *ckptbase)
*/
if (a->alloc.entries != 0)
WT_ERR(__wt_block_extlist_merge(
- session, &a->alloc, &b->alloc));
+ session, block, &a->alloc, &b->alloc));
if (a->discard.entries != 0)
WT_ERR(__wt_block_extlist_merge(
- session, &a->discard, &b->discard));
+ session, block, &a->discard, &b->discard));
/*
* If the "to" checkpoint is also being deleted, we're done with
@@ -775,7 +775,8 @@ __wt_block_checkpoint_resolve(WT_SESSION_IMPL *session, WT_BLOCK *block)
block->ckpt_inprogress = 0;
__wt_spin_lock(session, &block->live_lock);
- ret = __wt_block_extlist_merge(session, &ci->ckpt_avail, &ci->avail);
+ ret = __wt_block_extlist_merge(
+ session, block, &ci->ckpt_avail, &ci->avail);
__wt_spin_unlock(session, &block->live_lock);
/* Discard the lists remaining after the checkpoint call. */
diff --git a/src/block/block_ext.c b/src/block/block_ext.c
index e89c70060f3..0dcc1a4bd81 100644
--- a/src/block/block_ext.c
+++ b/src/block/block_ext.c
@@ -8,12 +8,20 @@
#include "wt_internal.h"
-static int __block_append(WT_SESSION_IMPL *, WT_EXTLIST *, wt_off_t, wt_off_t);
+#define WT_BLOCK_ERROR(session, block, ...) do { \
+ if (block->verify) \
+ WT_RET_MSG(session, __VA_ARGS__); \
+ WT_PANIC_RET(session, __VA_ARGS__); \
+} while (0)
+
+static int __block_append(WT_SESSION_IMPL *,
+ WT_BLOCK *, WT_EXTLIST *, wt_off_t, wt_off_t);
static int __block_ext_overlap(WT_SESSION_IMPL *,
WT_BLOCK *, WT_EXTLIST *, WT_EXT **, WT_EXTLIST *, WT_EXT **);
static int __block_extlist_dump(
WT_SESSION_IMPL *, const char *, WT_EXTLIST *, int);
-static int __block_merge(WT_SESSION_IMPL *, WT_EXTLIST *, wt_off_t, wt_off_t);
+static int __block_merge(WT_SESSION_IMPL *,
+ WT_BLOCK *, WT_EXTLIST *, wt_off_t, wt_off_t);
/*
* __block_off_srch_last --
@@ -308,8 +316,8 @@ __wt_block_misplaced(WT_SESSION_IMPL *session,
* Remove a record from an extent list.
*/
static int
-__block_off_remove(
- WT_SESSION_IMPL *session, WT_EXTLIST *el, wt_off_t off, WT_EXT **extp)
+__block_off_remove(WT_SESSION_IMPL *session, WT_BLOCK *block,
+ WT_EXTLIST *el, wt_off_t off, WT_EXT **extp)
{
WT_EXT *ext, **astack[WT_SKIP_MAXDEPTH];
WT_SIZE *szp, **sstack[WT_SKIP_MAXDEPTH];
@@ -370,7 +378,7 @@ __block_off_remove(
return (0);
corrupt:
- WT_PANIC_RET(session, EINVAL,
+ WT_BLOCK_ERROR(session, block, EINVAL,
"attempt to remove non-existent offset from an extent list");
}
@@ -380,8 +388,8 @@ corrupt:
* overlapping entry.
*/
int
-__wt_block_off_remove_overlap(
- WT_SESSION_IMPL *session, WT_EXTLIST *el, wt_off_t off, wt_off_t size)
+__wt_block_off_remove_overlap(WT_SESSION_IMPL *session, WT_BLOCK *block,
+ WT_EXTLIST *el, wt_off_t off, wt_off_t size)
{
WT_EXT *before, *after, *ext;
wt_off_t a_off, a_size, b_off, b_size;
@@ -393,7 +401,8 @@ __wt_block_off_remove_overlap(
/* If "before" or "after" overlaps, retrieve the overlapping entry. */
if (before != NULL && before->off + before->size > off) {
- WT_RET(__block_off_remove(session, el, before->off, &ext));
+ WT_RET(__block_off_remove(
+ session, block, el, before->off, &ext));
/* Calculate overlapping extents. */
a_off = ext->off;
@@ -401,7 +410,8 @@ __wt_block_off_remove_overlap(
b_off = off + size;
b_size = ext->size - (a_size + size);
} else if (after != NULL && off + size > after->off) {
- WT_RET(__block_off_remove(session, el, after->off, &ext));
+ WT_RET(__block_off_remove(
+ session, block, el, after->off, &ext));
/*
* Calculate overlapping extents. There's no initial overlap
@@ -525,7 +535,7 @@ __wt_block_alloc(
__block_size_srch(block->live.avail.sz, size, sstack);
if ((szp = *sstack[0]) == NULL) {
append: WT_RET(__block_extend(session, block, offp, size));
- WT_RET(__block_append(session,
+ WT_RET(__block_append(session, block,
&block->live.alloc, *offp, (wt_off_t)size));
return (0);
}
@@ -535,7 +545,8 @@ append: WT_RET(__block_extend(session, block, offp, size));
}
/* Remove the record, and set the returned offset. */
- WT_RET(__block_off_remove(session, &block->live.avail, ext->off, &ext));
+ WT_RET(__block_off_remove(
+ session, block, &block->live.avail, ext->off, &ext));
*offp = ext->off;
/* If doing a partial allocation, adjust the record and put it back. */
@@ -561,7 +572,7 @@ append: WT_RET(__block_extend(session, block, offp, size));
/* Add the newly allocated extent to the list of allocations. */
WT_RET(__block_merge(
- session, &block->live.alloc, *offp, (wt_off_t)size));
+ session, block, &block->live.alloc, *offp, (wt_off_t)size));
return (0);
}
@@ -618,12 +629,12 @@ __wt_block_off_free(
* list.
*/
if ((ret = __wt_block_off_remove_overlap(
- session, &block->live.alloc, offset, size)) == 0)
- ret = __block_merge(
- session, &block->live.avail, offset, (wt_off_t)size);
+ session, block, &block->live.alloc, offset, size)) == 0)
+ ret = __block_merge(session, block,
+ &block->live.avail, offset, (wt_off_t)size);
else if (ret == WT_NOTFOUND)
- ret = __block_merge(
- session, &block->live.discard, offset, (wt_off_t)size);
+ ret = __block_merge(session, block,
+ &block->live.discard, offset, (wt_off_t)size);
return (ret);
}
@@ -770,9 +781,12 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
*/
*ap = (*ap)->next[0];
*bp = (*bp)->next[0];
- WT_RET(__block_merge(session, avail, b->off, b->size));
- WT_RET(__block_off_remove(session, ael, a->off, NULL));
- WT_RET(__block_off_remove(session, bel, b->off, NULL));
+ WT_RET(__block_merge(
+ session, block, avail, b->off, b->size));
+ WT_RET(__block_off_remove(
+ session, block, ael, a->off, NULL));
+ WT_RET(__block_off_remove(
+ session, block, bel, b->off, NULL));
}
else if (a->size > b->size) { /* Case #4 */
/*
@@ -780,7 +794,8 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Increment/Decrement A's offset/size by the size of B
* Insert A on its list
*/
- WT_RET(__block_off_remove(session, ael, a->off, &a));
+ WT_RET(__block_off_remove(
+ session, block, ael, a->off, &a));
a->off += b->size;
a->size -= b->size;
WT_RET(__block_ext_insert(session, ael, a));
@@ -791,15 +806,18 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Delete B
*/
*bp = (*bp)->next[0];
- WT_RET(__block_merge(session, avail, b->off, b->size));
- WT_RET(__block_off_remove(session, bel, b->off, NULL));
+ WT_RET(__block_merge(
+ session, block, avail, b->off, b->size));
+ WT_RET(__block_off_remove(
+ session, block, bel, b->off, NULL));
} else { /* Case #9 */
/*
* Remove B from its list
* Increment/Decrement B's offset/size by the size of A
* Insert B on its list
*/
- WT_RET(__block_off_remove(session, bel, b->off, &b));
+ WT_RET(__block_off_remove(
+ session, block, bel, b->off, &b));
b->off += a->size;
b->size -= a->size;
WT_RET(__block_ext_insert(session, bel, b));
@@ -810,8 +828,10 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Delete A
*/
*ap = (*ap)->next[0];
- WT_RET(__block_merge(session, avail, a->off, a->size));
- WT_RET(__block_off_remove(session, ael, a->off, NULL));
+ WT_RET(__block_merge(
+ session, block, avail, a->off, a->size));
+ WT_RET(__block_off_remove(
+ session, block, ael, a->off, NULL));
} /* Case #6 */
} else if (a->off + a->size == b->off + b->size) {
/*
@@ -819,7 +839,7 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Decrement A's size by the size of B
* Insert A on its list
*/
- WT_RET(__block_off_remove(session, ael, a->off, &a));
+ WT_RET(__block_off_remove(session, block, ael, a->off, &a));
a->size -= b->size;
WT_RET(__block_ext_insert(session, ael, a));
@@ -829,8 +849,8 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Delete B
*/
*bp = (*bp)->next[0];
- WT_RET(__block_merge(session, avail, b->off, b->size));
- WT_RET(__block_off_remove(session, bel, b->off, NULL));
+ WT_RET(__block_merge(session, block, avail, b->off, b->size));
+ WT_RET(__block_off_remove(session, block, bel, b->off, NULL));
} else if /* Case #3, #7 */
(a->off + a->size < b->off + b->size) {
/*
@@ -838,14 +858,14 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
*/
off = b->off;
size = (a->off + a->size) - b->off;
- WT_RET(__block_merge(session, avail, off, size));
+ WT_RET(__block_merge(session, block, avail, off, size));
/*
* Remove A from its list
* Decrement A's size by the overlap
* Insert A on its list
*/
- WT_RET(__block_off_remove(session, ael, a->off, &a));
+ WT_RET(__block_off_remove(session, block, ael, a->off, &a));
a->size -= size;
WT_RET(__block_ext_insert(session, ael, a));
@@ -854,7 +874,7 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Increment/Decrement B's offset/size by the overlap
* Insert B on its list
*/
- WT_RET(__block_off_remove(session, bel, b->off, &b));
+ WT_RET(__block_off_remove(session, block, bel, b->off, &b));
b->off += size;
b->size -= size;
WT_RET(__block_ext_insert(session, bel, b));
@@ -868,12 +888,12 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Decrement A's size by trailing part of A plus B's size
* Insert A on its list
*/
- WT_RET(__block_off_remove(session, ael, a->off, &a));
+ WT_RET(__block_off_remove(session, block, ael, a->off, &a));
a->size = b->off - a->off;
WT_RET(__block_ext_insert(session, ael, a));
/* Add trailing part of A to A's list as a new element. */
- WT_RET(__block_merge(session, ael, off, size));
+ WT_RET(__block_merge(session, block, ael, off, size));
/*
* Move caller's B to the next element
@@ -881,8 +901,8 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Delete B
*/
*bp = (*bp)->next[0];
- WT_RET(__block_merge(session, avail, b->off, b->size));
- WT_RET(__block_off_remove(session, bel, b->off, NULL));
+ WT_RET(__block_merge(session, block, avail, b->off, b->size));
+ WT_RET(__block_off_remove(session, block, bel, b->off, NULL));
}
return (0);
@@ -893,7 +913,8 @@ __block_ext_overlap(WT_SESSION_IMPL *session,
* Merge one extent list into another.
*/
int
-__wt_block_extlist_merge(WT_SESSION_IMPL *session, WT_EXTLIST *a, WT_EXTLIST *b)
+__wt_block_extlist_merge(WT_SESSION_IMPL *session, WT_BLOCK *block,
+ WT_EXTLIST *a, WT_EXTLIST *b)
{
WT_EXT *ext;
WT_EXTLIST tmp;
@@ -923,7 +944,7 @@ __wt_block_extlist_merge(WT_SESSION_IMPL *session, WT_EXTLIST *a, WT_EXTLIST *b)
}
WT_EXT_FOREACH(ext, a->off)
- WT_RET(__block_merge(session, b, ext->off, ext->size));
+ WT_RET(__block_merge(session, block, b, ext->off, ext->size));
return (0);
}
@@ -933,12 +954,13 @@ __wt_block_extlist_merge(WT_SESSION_IMPL *session, WT_EXTLIST *a, WT_EXTLIST *b)
* Append a new entry to the allocation list.
*/
static int
-__block_append(
- WT_SESSION_IMPL *session, WT_EXTLIST *el, wt_off_t off, wt_off_t size)
+__block_append(WT_SESSION_IMPL *session, WT_BLOCK *block,
+ WT_EXTLIST *el, wt_off_t off, wt_off_t size)
{
WT_EXT *ext, **astack[WT_SKIP_MAXDEPTH];
u_int i;
+ WT_UNUSED(block);
WT_ASSERT(session, el->track_size == 0);
/*
@@ -979,8 +1001,8 @@ __block_append(
* Insert an extent into an extent list, merging if possible.
*/
int
-__wt_block_insert_ext(
- WT_SESSION_IMPL *session, WT_EXTLIST *el, wt_off_t off, wt_off_t size)
+__wt_block_insert_ext(WT_SESSION_IMPL *session, WT_BLOCK *block,
+ WT_EXTLIST *el, wt_off_t off, wt_off_t size)
{
/*
* There are currently two copies of this function (this code is a one-
@@ -993,7 +1015,7 @@ __wt_block_insert_ext(
* Callers of this function are expected to have already acquired any
* locks required to manipulate the extent list.
*/
- return (__block_merge(session, el, off, size));
+ return (__block_merge(session, block, el, off, size));
}
/*
@@ -1002,8 +1024,8 @@ __wt_block_insert_ext(
* version).
*/
static int
-__block_merge(
- WT_SESSION_IMPL *session, WT_EXTLIST *el, wt_off_t off, wt_off_t size)
+__block_merge(WT_SESSION_IMPL *session, WT_BLOCK *block,
+ WT_EXTLIST *el, wt_off_t off, wt_off_t size)
{
WT_EXT *ext, *after, *before;
@@ -1014,7 +1036,7 @@ __block_merge(
__block_off_srch_pair(el, off, &before, &after);
if (before != NULL) {
if (before->off + before->size > off)
- WT_PANIC_RET(session, EINVAL,
+ WT_BLOCK_ERROR(session, block, EINVAL,
"%s: existing range %" PRIdMAX "-%" PRIdMAX
" overlaps with merge range %" PRIdMAX "-%" PRIdMAX,
el->name,
@@ -1025,8 +1047,8 @@ __block_merge(
before = NULL;
}
if (after != NULL) {
- if (off + size > after->off)
- WT_PANIC_RET(session, EINVAL,
+ if (off + size > after->off) {
+ WT_BLOCK_ERROR(session, block, EINVAL,
"%s: merge range %" PRIdMAX "-%" PRIdMAX
" overlaps with existing range %" PRIdMAX
"-%" PRIdMAX,
@@ -1034,6 +1056,7 @@ __block_merge(
(intmax_t)off, (intmax_t)(off + size),
(intmax_t)after->off,
(intmax_t)(after->off + after->size));
+ }
if (off + size != after->off)
after = NULL;
}
@@ -1053,7 +1076,8 @@ __block_merge(
* the record we're going to use, adjust it and re-insert it.
*/
if (before == NULL) {
- WT_RET(__block_off_remove(session, el, after->off, &ext));
+ WT_RET(__block_off_remove(
+ session, block, el, after->off, &ext));
WT_RET(__wt_verbose(session, WT_VERB_BLOCK,
"%s: range grows from %" PRIdMAX "-%" PRIdMAX ", to %"
@@ -1067,10 +1091,11 @@ __block_merge(
} else {
if (after != NULL) {
size += after->size;
- WT_RET(
- __block_off_remove(session, el, after->off, NULL));
+ WT_RET(__block_off_remove(
+ session, block, el, after->off, NULL));
}
- WT_RET(__block_off_remove(session, el, before->off, &ext));
+ WT_RET(__block_off_remove(
+ session, block, el, before->off, &ext));
WT_RET(__wt_verbose(session, WT_VERB_BLOCK,
"%s: range grows from %" PRIdMAX "-%" PRIdMAX ", to %"
@@ -1115,8 +1140,8 @@ __wt_block_extlist_read_avail(WT_SESSION_IMPL *session,
* Extent blocks are allocated from the available list: if reading the
* avail list, the extent blocks might be included, remove them.
*/
- WT_ERR_NOTFOUND_OK(
- __wt_block_off_remove_overlap(session, el, el->offset, el->size));
+ WT_ERR_NOTFOUND_OK(__wt_block_off_remove_overlap(
+ session, block, el, el->offset, el->size));
err:
#ifdef HAVE_DIAGNOSTIC
@@ -1137,7 +1162,8 @@ __wt_block_extlist_read(WT_SESSION_IMPL *session,
WT_DECL_ITEM(tmp);
WT_DECL_RET;
wt_off_t off, size;
- int (*func)(WT_SESSION_IMPL *, WT_EXTLIST *, wt_off_t, wt_off_t);
+ int (*func)(
+ WT_SESSION_IMPL *, WT_BLOCK *, WT_EXTLIST *, wt_off_t, wt_off_t);
const uint8_t *p;
/* If there isn't a list, we're done. */
@@ -1187,14 +1213,16 @@ __wt_block_extlist_read(WT_SESSION_IMPL *session,
if (off < block->allocsize ||
off % block->allocsize != 0 ||
size % block->allocsize != 0 ||
- off + size > ckpt_size)
-corrupted: WT_PANIC_RET(session, WT_ERROR,
+ off + size > ckpt_size) {
+corrupted: __wt_scr_free(session, &tmp);
+ WT_BLOCK_ERROR(session, block, WT_ERROR,
"file contains a corrupted %s extent list, range %"
PRIdMAX "-%" PRIdMAX " past end-of-file",
el->name,
(intmax_t)off, (intmax_t)(off + size));
+ }
- WT_ERR(func(session, el, off, size));
+ WT_ERR(func(session, block, el, off, size));
}
if (WT_VERBOSE_ISSET(session, WT_VERB_BLOCK))
@@ -1290,7 +1318,7 @@ __wt_block_extlist_write(WT_SESSION_IMPL *session,
* blocks never appear on any allocation list.
*/
WT_TRET(__wt_block_off_remove_overlap(
- session, &block->live.alloc, el->offset, el->size));
+ session, block, &block->live.alloc, el->offset, el->size));
WT_ERR(__wt_verbose(session, WT_VERB_BLOCK,
"%s written %" PRIdMAX "/%" PRIu32,
@@ -1331,7 +1359,7 @@ __wt_block_extlist_truncate(
*/
orig = fh->size;
size = ext->off;
- WT_RET(__block_off_remove(session, el, size, NULL));
+ WT_RET(__block_off_remove(session, block, el, size, NULL));
fh->size = size;
/*
diff --git a/src/block/block_slvg.c b/src/block/block_slvg.c
index 517fb92491e..c78a6c39942 100644
--- a/src/block/block_slvg.c
+++ b/src/block/block_slvg.c
@@ -53,7 +53,7 @@ __wt_block_salvage_start(WT_SESSION_IMPL *session, WT_BLOCK *block)
* any blocks we don't want as we process the file.
*/
WT_RET(__wt_block_insert_ext(
- session, &block->live.alloc, allocsize, len - allocsize));
+ session, block, &block->live.alloc, allocsize, len - allocsize));
return (0);
}
diff --git a/src/block/block_vrfy.c b/src/block/block_vrfy.c
index 29a9e4950b4..c9df768a624 100644
--- a/src/block/block_vrfy.c
+++ b/src/block/block_vrfy.c
@@ -87,6 +87,12 @@ __wt_block_verify_start(WT_SESSION_IMPL *session,
WT_RET(__bit_alloc(session, block->frags, &block->fragfile));
/*
+ * Set this before reading any extent lists: don't panic if we see
+ * corruption.
+ */
+ block->verify = 1;
+
+ /*
* We maintain an allocation list that is rolled forward through the
* set of checkpoints.
*/
@@ -102,8 +108,6 @@ __wt_block_verify_start(WT_SESSION_IMPL *session,
/* Configuration: strict behavior on any error. */
WT_RET(__wt_config_gets(session, cfg, "strict", &cval));
block->verify_strict = cval.val ? 1 : 0;
-
- block->verify = 1;
return (0);
}
@@ -228,7 +232,7 @@ __wt_verify_ckpt_load(
WT_RET(__wt_block_extlist_read(
session, block, el, ci->file_size));
WT_RET(__wt_block_extlist_merge(
- session, el, &block->verify_alloc));
+ session, block, el, &block->verify_alloc));
__wt_block_extlist_free(session, el);
}
el = &ci->discard;
@@ -236,7 +240,7 @@ __wt_verify_ckpt_load(
WT_RET(__wt_block_extlist_read(
session, block, el, ci->file_size));
WT_EXT_FOREACH(ext, el->off)
- WT_RET(__wt_block_off_remove_overlap(session,
+ WT_RET(__wt_block_off_remove_overlap(session, block,
&block->verify_alloc, ext->off, ext->size));
__wt_block_extlist_free(session, el);
}
@@ -265,7 +269,7 @@ __wt_verify_ckpt_load(
* checkpoints.
*/
if (ci->root_offset != WT_BLOCK_INVALID_OFFSET)
- WT_RET(__wt_block_off_remove_overlap(session,
+ WT_RET(__wt_block_off_remove_overlap(session, block,
&block->verify_alloc, ci->root_offset, ci->root_size));
/*
diff --git a/src/include/extern.h b/src/include/extern.h
index 63b6bb2cbc5..d8820d0eda7 100644
--- a/src/include/extern.h
+++ b/src/include/extern.h
@@ -26,14 +26,14 @@ extern int __wt_block_compact_end(WT_SESSION_IMPL *session, WT_BLOCK *block);
extern int __wt_block_compact_skip(WT_SESSION_IMPL *session, WT_BLOCK *block, int *skipp);
extern int __wt_block_compact_page_skip(WT_SESSION_IMPL *session, WT_BLOCK *block, const uint8_t *addr, size_t addr_size, int *skipp);
extern int __wt_block_misplaced(WT_SESSION_IMPL *session, WT_BLOCK *block, const char *tag, wt_off_t offset, uint32_t size, int live);
-extern int __wt_block_off_remove_overlap( WT_SESSION_IMPL *session, WT_EXTLIST *el, wt_off_t off, wt_off_t size);
+extern int __wt_block_off_remove_overlap(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_EXTLIST *el, wt_off_t off, wt_off_t size);
extern int __wt_block_alloc( WT_SESSION_IMPL *session, WT_BLOCK *block, wt_off_t *offp, wt_off_t size);
extern int __wt_block_free(WT_SESSION_IMPL *session, WT_BLOCK *block, const uint8_t *addr, size_t addr_size);
extern int __wt_block_off_free( WT_SESSION_IMPL *session, WT_BLOCK *block, wt_off_t offset, wt_off_t size);
extern int __wt_block_extlist_check( WT_SESSION_IMPL *session, WT_EXTLIST *al, WT_EXTLIST *bl);
extern int __wt_block_extlist_overlap( WT_SESSION_IMPL *session, WT_BLOCK *block, WT_BLOCK_CKPT *ci);
-extern int __wt_block_extlist_merge(WT_SESSION_IMPL *session, WT_EXTLIST *a, WT_EXTLIST *b);
-extern int __wt_block_insert_ext( WT_SESSION_IMPL *session, WT_EXTLIST *el, wt_off_t off, wt_off_t size);
+extern int __wt_block_extlist_merge(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_EXTLIST *a, WT_EXTLIST *b);
+extern int __wt_block_insert_ext(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_EXTLIST *el, wt_off_t off, wt_off_t size);
extern int __wt_block_extlist_read_avail(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_EXTLIST *el, wt_off_t ckpt_size);
extern int __wt_block_extlist_read(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_EXTLIST *el, wt_off_t ckpt_size);
extern int __wt_block_extlist_write(WT_SESSION_IMPL *session, WT_BLOCK *block, WT_EXTLIST *el, WT_EXTLIST *additional);