Re: openldap: FTBFS on sparc64 due to unaligned access in testsuite
Control: tags -1 +patch
Hello!
Upstream has provided a patch now [1] which fixes the issue for me.
It applies against both OpenLDAP 2.5.13 and 2.6.3 with fuzz and by fixing
a single printf() statement manually. I am attaching the backported patch
which applies cleanly.
Thanks,
Adrian
[1] https://git.openldap.org/openldap/openldap/-/merge_requests/582
--
.''`. John Paul Adrian Glaubitz
: :' : Debian Developer
`. `' Physicist
`- GPG: 62FF 8A75 84E0 2956 9546 0006 7426 3B37 F5B5 F913
--- openldap-2.5.13+dfsg.orig/libraries/liblmdb/mdb.c
+++ openldap-2.5.13+dfsg/libraries/liblmdb/mdb.c
@@ -823,8 +823,6 @@ typedef struct MDB_page {
#define P_KEEP 0x8000 /**< leave this page alone during spill */
/** @} */
uint16_t mp_flags; /**< @ref mdb_page */
-#define mp_lower mp_pb.pb.pb_lower
-#define mp_upper mp_pb.pb.pb_upper
#define mp_pages mp_pb.pb_pages
union {
struct {
@@ -833,9 +831,26 @@ typedef struct MDB_page {
} pb;
uint32_t pb_pages; /**< number of overflow pages */
} mp_pb;
- indx_t mp_ptrs[1]; /**< dynamic size */
+ indx_t mp_ptrs[0]; /**< dynamic size */
} MDB_page;
+/** Alternate page header, for 2-byte aligned access */
+typedef struct MDB_page2 {
+ uint16_t mp_p[sizeof(pgno_t)/2];
+ uint16_t mp_pad;
+ uint16_t mp_flags;
+ indx_t mp_lower;
+ indx_t mp_upper;
+ indx_t mp_ptrs[0];
+} MDB_page2;
+
+#define MP_PGNO(p) (((MDB_page2 *)(void *)(p))->mp_p)
+#define MP_PAD(p) (((MDB_page2 *)(void *)(p))->mp_pad)
+#define MP_FLAGS(p) (((MDB_page2 *)(void *)(p))->mp_flags)
+#define MP_LOWER(p) (((MDB_page2 *)(void *)(p))->mp_lower)
+#define MP_UPPER(p) (((MDB_page2 *)(void *)(p))->mp_upper)
+#define MP_PTRS(p) (((MDB_page2 *)(void *)(p))->mp_ptrs)
+
/** Size of the page header, excluding dynamic data at the end */
#define PAGEHDRSZ ((unsigned) offsetof(MDB_page, mp_ptrs))
@@ -846,10 +861,10 @@ typedef struct MDB_page {
#define PAGEBASE ((MDB_DEVEL) ? PAGEHDRSZ : 0)
/** Number of nodes on a page */
-#define NUMKEYS(p) (((p)->mp_lower - (PAGEHDRSZ-PAGEBASE)) >> 1)
+#define NUMKEYS(p) ((MP_LOWER(p) - (PAGEHDRSZ-PAGEBASE)) >> 1)
/** The amount of space remaining in the page */
-#define SIZELEFT(p) (indx_t)((p)->mp_upper - (p)->mp_lower)
+#define SIZELEFT(p) (indx_t)(MP_UPPER(p) - MP_LOWER(p))
/** The percentage of space used in the page, in tenths of a percent. */
#define PAGEFILL(env, p) (1000L * ((env)->me_psize - PAGEHDRSZ - SIZELEFT(p)) / \
@@ -860,15 +875,15 @@ typedef struct MDB_page {
#define FILL_THRESHOLD 250
/** Test if a page is a leaf page */
-#define IS_LEAF(p) F_ISSET((p)->mp_flags, P_LEAF)
+#define IS_LEAF(p) F_ISSET(MP_FLAGS(p), P_LEAF)
/** Test if a page is a LEAF2 page */
-#define IS_LEAF2(p) F_ISSET((p)->mp_flags, P_LEAF2)
+#define IS_LEAF2(p) F_ISSET(MP_FLAGS(p), P_LEAF2)
/** Test if a page is a branch page */
-#define IS_BRANCH(p) F_ISSET((p)->mp_flags, P_BRANCH)
+#define IS_BRANCH(p) F_ISSET(MP_FLAGS(p), P_BRANCH)
/** Test if a page is an overflow page */
-#define IS_OVERFLOW(p) F_ISSET((p)->mp_flags, P_OVERFLOW)
+#define IS_OVERFLOW(p) F_ISSET(MP_FLAGS(p), P_OVERFLOW)
/** Test if a page is a sub page */
-#define IS_SUBP(p) F_ISSET((p)->mp_flags, P_SUBP)
+#define IS_SUBP(p) F_ISSET(MP_FLAGS(p), P_SUBP)
/** The number of overflow pages needed to store the given size. */
#define OVPAGES(size, psize) ((PAGEHDRSZ-1 + (size)) / (psize) + 1)
@@ -936,7 +951,7 @@ typedef struct MDB_node {
#define LEAFSIZE(k, d) (NODESIZE + (k)->mv_size + (d)->mv_size)
/** Address of node \b i in page \b p */
-#define NODEPTR(p, i) ((MDB_node *)((char *)(p) + (p)->mp_ptrs[i] + PAGEBASE))
+#define NODEPTR(p, i) ((MDB_node *)((char *)(p) + MP_PTRS(p)[i] + PAGEBASE))
/** Address of the key for the node */
#define NODEKEY(node) (void *)((node)->mn_data)
@@ -964,6 +979,8 @@ typedef struct MDB_node {
/** Copy a page number from src to dst */
#ifdef MISALIGNED_OK
#define COPY_PGNO(dst,src) dst = src
+#undef MP_PGNO
+#define MP_PGNO(p) ((p)->mp_pgno)
#else
#if SIZE_MAX > 4294967295UL
#define COPY_PGNO(dst,src) do { \
@@ -1554,7 +1571,7 @@ static pgno_t
mdb_dbg_pgno(MDB_page *mp)
{
pgno_t ret;
- COPY_PGNO(ret, mp->mp_pgno);
+ COPY_PGNO(ret, MP_PGNO(mp));
return ret;
}
@@ -1601,13 +1618,13 @@ void
mdb_page_list(MDB_page *mp)
{
pgno_t pgno = mdb_dbg_pgno(mp);
- const char *type, *state = (mp->mp_flags & P_DIRTY) ? ", dirty" : "";
+ const char *type, *state = (MP_FLAGS(mp) & P_DIRTY) ? ", dirty" : "";
MDB_node *node;
unsigned int i, nkeys, nsize, total = 0;
MDB_val key;
DKBUF;
- switch (mp->mp_flags & (P_BRANCH|P_LEAF|P_LEAF2|P_META|P_OVERFLOW|P_SUBP)) {
+ switch (MP_FLAGS(mp) & (P_BRANCH|P_LEAF|P_LEAF2|P_META|P_OVERFLOW|P_SUBP)) {
case P_BRANCH: type = "Branch page"; break;
case P_LEAF: type = "Leaf page"; break;
case P_LEAF|P_SUBP: type = "Sub-page"; break;
@@ -1622,7 +1639,7 @@ mdb_page_list(MDB_page *mp)
pgno, ((MDB_meta *)METADATA(mp))->mm_txnid);
return;
default:
- fprintf(stderr, "Bad page %"Z"u flags 0x%X\n", pgno, mp->mp_flags);
+ fprintf(stderr, "Bad page %"Z"u flags 0x%X\n", pgno, MP_FLAGS(mp));
return;
}
@@ -1658,7 +1675,7 @@ mdb_page_list(MDB_page *mp)
total = EVEN(total);
}
fprintf(stderr, "Total: header %d + contents %d + unused %d\n",
- IS_LEAF2(mp) ? PAGEHDRSZ : PAGEBASE + mp->mp_lower, total, SIZELEFT(mp));
+ IS_LEAF2(mp) ? PAGEHDRSZ : PAGEBASE + MP_LOWER(mp), total, SIZELEFT(mp));
}
void
@@ -1856,7 +1873,7 @@ mdb_page_loose(MDB_cursor *mc, MDB_page
pgno_t pgno = mp->mp_pgno;
MDB_txn *txn = mc->mc_txn;
- if ((mp->mp_flags & P_DIRTY) && mc->mc_dbi != FREE_DBI) {
+ if ((MP_FLAGS(mp) & P_DIRTY) && mc->mc_dbi != FREE_DBI) {
if (txn->mt_parent) {
MDB_ID2 *dl = txn->mt_u.dirty_list;
/* If txn has a parent, make sure the page is in our
@@ -1885,7 +1902,7 @@ mdb_page_loose(MDB_cursor *mc, MDB_page
NEXT_LOOSE_PAGE(mp) = txn->mt_loose_pgs;
txn->mt_loose_pgs = mp;
txn->mt_loose_count++;
- mp->mp_flags |= P_LOOSE;
+ MP_FLAGS(mp) |= P_LOOSE;
} else {
int rc = mdb_midl_append(&txn->mt_free_pgs, pgno);
if (rc)
@@ -1925,14 +1942,14 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned
mp = NULL;
for (j=0; j<m3->mc_snum; j++) {
mp = m3->mc_pg[j];
- if ((mp->mp_flags & Mask) == pflags)
- mp->mp_flags ^= P_KEEP;
+ if ((MP_FLAGS(mp) & Mask) == pflags)
+ MP_FLAGS(mp) ^= P_KEEP;
}
mx = m3->mc_xcursor;
/* Proceed to mx if it is at a sub-database */
if (! (mx && (mx->mx_cursor.mc_flags & C_INITIALIZED)))
break;
- if (! (mp && (mp->mp_flags & P_LEAF)))
+ if (! (mp && (MP_FLAGS(mp) & P_LEAF)))
break;
leaf = NODEPTR(mp, m3->mc_ki[j-1]);
if (!(leaf->mn_flags & F_SUBDATA))
@@ -1952,8 +1969,8 @@ mdb_pages_xkeep(MDB_cursor *mc, unsigned
continue;
if ((rc = mdb_page_get(m0, pgno, &dp, &level)) != MDB_SUCCESS)
break;
- if ((dp->mp_flags & Mask) == pflags && level <= 1)
- dp->mp_flags ^= P_KEEP;
+ if ((MP_FLAGS(dp) & Mask) == pflags && level <= 1)
+ MP_FLAGS(dp) ^= P_KEEP;
}
}
}
@@ -2056,7 +2073,7 @@ mdb_page_spill(MDB_cursor *m0, MDB_val *
for (i=dl[0].mid; i && need; i--) {
MDB_ID pn = dl[i].mid << 1;
dp = dl[i].mptr;
- if (dp->mp_flags & (P_LOOSE|P_KEEP))
+ if (MP_FLAGS(dp) & (P_LOOSE|P_KEEP))
continue;
/* Can't spill twice, make sure it's not already in a parent's
* spill list.
@@ -2067,7 +2084,7 @@ mdb_page_spill(MDB_cursor *m0, MDB_val *
if (tx2->mt_spill_pgs) {
j = mdb_midl_search(tx2->mt_spill_pgs, pn);
if (j <= tx2->mt_spill_pgs[0] && tx2->mt_spill_pgs[j] == pn) {
- dp->mp_flags |= P_KEEP;
+ MP_FLAGS(dp) |= P_KEEP;
break;
}
}
@@ -2327,7 +2344,7 @@ static void
mdb_page_copy(MDB_page *dst, MDB_page *src, unsigned int psize)
{
enum { Align = sizeof(pgno_t) };
- indx_t upper = src->mp_upper, lower = src->mp_lower, unused = upper-lower;
+ indx_t upper = MP_UPPER(src), lower = MP_LOWER(src), unused = upper-lower;
/* If page isn't full, just copy the used portion. Adjust
* alignment so memcpy may copy words instead of bytes.
@@ -2396,7 +2413,7 @@ mdb_page_unspill(MDB_txn *txn, MDB_page
*/
mdb_page_dirty(txn, np);
- np->mp_flags |= P_DIRTY;
+ MP_FLAGS(np) |= P_DIRTY;
*ret = np;
break;
}
@@ -2418,7 +2435,7 @@ mdb_page_touch(MDB_cursor *mc)
pgno_t pgno;
int rc;
- if (!F_ISSET(mp->mp_flags, P_DIRTY)) {
+ if (!F_ISSET(MP_FLAGS(mp), P_DIRTY)) {
if (txn->mt_flags & MDB_TXN_SPILLS) {
np = NULL;
rc = mdb_page_unspill(txn, mp, &np);
@@ -2475,7 +2492,7 @@ mdb_page_touch(MDB_cursor *mc)
mdb_page_copy(np, mp, txn->mt_env->me_psize);
np->mp_pgno = pgno;
- np->mp_flags |= P_DIRTY;
+ MP_FLAGS(np) |= P_DIRTY;
done:
/* Adjust cursors pointing to mp */
@@ -3320,12 +3337,12 @@ mdb_page_flush(MDB_txn *txn, int keep)
while (++i <= pagecount) {
dp = dl[i].mptr;
/* Don't flush this page yet */
- if (dp->mp_flags & (P_LOOSE|P_KEEP)) {
- dp->mp_flags &= ~P_KEEP;
+ if (MP_FLAGS(dp) & (P_LOOSE|P_KEEP)) {
+ MP_FLAGS(dp) &= ~P_KEEP;
dl[++j] = dl[i];
continue;
}
- dp->mp_flags &= ~P_DIRTY;
+ MP_FLAGS(dp) &= ~P_DIRTY;
}
goto done;
}
@@ -3335,14 +3352,14 @@ mdb_page_flush(MDB_txn *txn, int keep)
if (++i <= pagecount) {
dp = dl[i].mptr;
/* Don't flush this page yet */
- if (dp->mp_flags & (P_LOOSE|P_KEEP)) {
- dp->mp_flags &= ~P_KEEP;
+ if (MP_FLAGS(dp) & (P_LOOSE|P_KEEP)) {
+ MP_FLAGS(dp) &= ~P_KEEP;
dl[i].mid = 0;
continue;
}
pgno = dl[i].mid;
/* clear dirty flag */
- dp->mp_flags &= ~P_DIRTY;
+ MP_FLAGS(dp) &= ~P_DIRTY;
pos = pgno * psize;
size = psize;
if (IS_OVERFLOW(dp)) size *= dp->mp_pages;
@@ -3784,12 +3801,12 @@ mdb_env_init_meta(MDB_env *env, MDB_meta
return ENOMEM;
p->mp_pgno = 0;
- p->mp_flags = P_META;
+ MP_FLAGS(p) = P_META;
*(MDB_meta *)METADATA(p) = *meta;
q = (MDB_page *)((char *)p + psize);
q->mp_pgno = 1;
- q->mp_flags = P_META;
+ MP_FLAGS(q) = P_META;
*(MDB_meta *)METADATA(q) = *meta;
DO_PWRITE(rc, env->me_fd, p, psize * NUM_METAS, len, 0);
@@ -5561,7 +5578,7 @@ ready:
if (!IS_LEAF(mp)) {
DPRINTF(("internal error, index points to a %02X page!?",
- mp->mp_flags));
+ MP_FLAGS(mp)));
mc->mc_txn->mt_flags |= MDB_TXN_ERROR;
return MDB_CORRUPTED;
}
@@ -5705,7 +5722,7 @@ mdb_ovpage_free(MDB_cursor *mc, MDB_page
*/
if (env->me_pghead &&
!txn->mt_parent &&
- ((mp->mp_flags & P_DIRTY) ||
+ ((MP_FLAGS(mp) & P_DIRTY) ||
(sl && (x = mdb_midl_search(sl, pn)) <= sl[0] && sl[x] == pn)))
{
unsigned i, j;
@@ -5714,7 +5731,7 @@ mdb_ovpage_free(MDB_cursor *mc, MDB_page
rc = mdb_midl_need(&env->me_pghead, ovpages);
if (rc)
return rc;
- if (!(mp->mp_flags & P_DIRTY)) {
+ if (!(MP_FLAGS(mp) & P_DIRTY)) {
/* This page is no longer spilled */
if (x == sl[0])
sl[0]--;
@@ -6061,7 +6078,7 @@ mdb_cursor_set(MDB_cursor *mc, MDB_val *
mc->mc_ki[mc->mc_top] = 0;
return MDB_NOTFOUND;
}
- if (mp->mp_flags & P_LEAF2) {
+ if (MP_FLAGS(mp) & P_LEAF2) {
nodekey.mv_size = mc->mc_db->md_pad;
nodekey.mv_data = LEAF2KEY(mp, 0, nodekey.mv_size);
} else {
@@ -6082,7 +6099,7 @@ mdb_cursor_set(MDB_cursor *mc, MDB_val *
unsigned int i;
unsigned int nkeys = NUMKEYS(mp);
if (nkeys > 1) {
- if (mp->mp_flags & P_LEAF2) {
+ if (MP_FLAGS(mp) & P_LEAF2) {
nodekey.mv_data = LEAF2KEY(mp,
nkeys-1, nodekey.mv_size);
} else {
@@ -6100,7 +6117,7 @@ mdb_cursor_set(MDB_cursor *mc, MDB_val *
if (rc < 0) {
if (mc->mc_ki[mc->mc_top] < NUMKEYS(mp)) {
/* This is definitely the right page, skip search_page */
- if (mp->mp_flags & P_LEAF2) {
+ if (MP_FLAGS(mp) & P_LEAF2) {
nodekey.mv_data = LEAF2KEY(mp,
mc->mc_ki[mc->mc_top], nodekey.mv_size);
} else {
@@ -6663,7 +6680,7 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *
*mc->mc_dbflag |= DB_DIRTY;
if ((mc->mc_db->md_flags & (MDB_DUPSORT|MDB_DUPFIXED))
== MDB_DUPFIXED)
- np->mp_flags |= P_LEAF2;
+ MP_FLAGS(np) |= P_LEAF2;
mc->mc_flags |= C_INITIALIZED;
} else {
/* make sure all cursor pages are writable */
@@ -6685,7 +6702,7 @@ mdb_cursor_put(MDB_cursor *mc, MDB_val *
fp_flags = P_LEAF|P_DIRTY;
fp = env->me_pbuf;
fp->mp_pad = data->mv_size; /* used if MDB_DUPFIXED */
- fp->mp_lower = fp->mp_upper = (PAGEHDRSZ-PAGEBASE);
+ MP_LOWER(fp) = MP_UPPER(fp) = (PAGEHDRSZ-PAGEBASE);
olddata.mv_size = PAGEHDRSZ;
goto prep_subDB;
}
@@ -6761,18 +6778,18 @@ more:
dkey.mv_data = memcpy(fp+1, olddata.mv_data, olddata.mv_size);
/* Make sub-page header for the dup items, with dummy body */
- fp->mp_flags = P_LEAF|P_DIRTY|P_SUBP;
- fp->mp_lower = (PAGEHDRSZ-PAGEBASE);
+ MP_FLAGS(fp) = P_LEAF|P_DIRTY|P_SUBP;
+ MP_LOWER(fp) = (PAGEHDRSZ-PAGEBASE);
xdata.mv_size = PAGEHDRSZ + dkey.mv_size + data->mv_size;
if (mc->mc_db->md_flags & MDB_DUPFIXED) {
- fp->mp_flags |= P_LEAF2;
+ MP_FLAGS(fp) |= P_LEAF2;
fp->mp_pad = data->mv_size;
xdata.mv_size += 2 * data->mv_size; /* leave space for 2 more */
} else {
xdata.mv_size += 2 * (sizeof(indx_t) + NODESIZE) +
(dkey.mv_size & 1) + (data->mv_size & 1);
}
- fp->mp_upper = xdata.mv_size - PAGEBASE;
+ MP_UPPER(fp) = xdata.mv_size - PAGEBASE;
olddata.mv_size = xdata.mv_size; /* pretend olddata is fp */
} else if (leaf->mn_flags & F_SUBDATA) {
/* Data is on sub-DB, just store it */
@@ -6795,8 +6812,8 @@ more:
}
/* FALLTHRU */ /* Big enough MDB_DUPFIXED sub-page */
case MDB_CURRENT:
- fp->mp_flags |= P_DIRTY;
- COPY_PGNO(fp->mp_pgno, mp->mp_pgno);
+ MP_FLAGS(fp) |= P_DIRTY;
+ COPY_PGNO(MP_PGNO(fp), MP_PGNO(mp));
mc->mc_xcursor->mx_cursor.mc_pg[0] = fp;
flags |= F_DUPDATA;
goto put_sub;
@@ -6804,7 +6821,7 @@ more:
xdata.mv_size = olddata.mv_size + offset;
}
- fp_flags = fp->mp_flags;
+ fp_flags = MP_FLAGS(fp);
if (NODESIZE + NODEKSZ(leaf) + xdata.mv_size > env->me_nodemax) {
/* Too big for a sub-page, convert to sub-DB */
fp_flags &= ~P_SUBP;
@@ -6834,16 +6851,16 @@ prep_subDB:
sub_root = mp;
}
if (mp != fp) {
- mp->mp_flags = fp_flags | P_DIRTY;
- mp->mp_pad = fp->mp_pad;
- mp->mp_lower = fp->mp_lower;
- mp->mp_upper = fp->mp_upper + offset;
+ MP_FLAGS(mp) = fp_flags | P_DIRTY;
+ MP_PAD(mp) = MP_PAD(fp);
+ MP_LOWER(mp) = MP_LOWER(fp);
+ MP_UPPER(mp) = MP_UPPER(fp) + offset;
if (fp_flags & P_LEAF2) {
memcpy(METADATA(mp), METADATA(fp), NUMKEYS(fp) * fp->mp_pad);
} else {
- memcpy((char *)mp + mp->mp_upper + PAGEBASE, (char *)fp + fp->mp_upper + PAGEBASE,
- olddata.mv_size - fp->mp_upper - PAGEBASE);
- memcpy((char *)(&mp->mp_ptrs), (char *)(&fp->mp_ptrs), NUMKEYS(fp) * sizeof(mp->mp_ptrs[0]));
+ memcpy((char *)mp + MP_UPPER(mp) + PAGEBASE, (char *)fp + MP_UPPER(fp) + PAGEBASE,
+ olddata.mv_size - MP_UPPER(fp) - PAGEBASE);
+ memcpy((char *)MP_PTRS(mp), (char *)MP_PTRS(fp), NUMKEYS(fp) * sizeof(mp->mp_ptrs[0]));
for (i=0; i<NUMKEYS(fp); i++)
mp->mp_ptrs[i] += offset;
}
@@ -6873,7 +6890,7 @@ current:
/* Is the ov page large enough? */
if (ovpages >= dpages) {
- if (!(omp->mp_flags & P_DIRTY) &&
+ if (!(MP_FLAGS(omp) & P_DIRTY) &&
(level || (env->me_flags & MDB_WRITEMAP)))
{
rc = mdb_page_unspill(mc->mc_txn, omp, &omp);
@@ -6882,7 +6899,7 @@ current:
level = 0; /* dirty in this txn or clean */
}
/* Is it dirty? */
- if (omp->mp_flags & P_DIRTY) {
+ if (MP_FLAGS(omp) & P_DIRTY) {
/* yes, overwrite it. Note in this case we don't
* bother to try shrinking the page if the new data
* is smaller than the overflow threshold.
@@ -7194,9 +7211,9 @@ mdb_page_new(MDB_cursor *mc, uint32_t fl
return rc;
DPRINTF(("allocated new mpage %"Z"u, page size %u",
np->mp_pgno, mc->mc_txn->mt_env->me_psize));
- np->mp_flags = flags | P_DIRTY;
- np->mp_lower = (PAGEHDRSZ-PAGEBASE);
- np->mp_upper = mc->mc_txn->mt_env->me_psize - PAGEBASE;
+ MP_FLAGS(np) = flags | P_DIRTY;
+ MP_LOWER(np) = (PAGEHDRSZ-PAGEBASE);
+ MP_UPPER(np) = mc->mc_txn->mt_env->me_psize - PAGEBASE;
if (IS_BRANCH(np))
mc->mc_db->md_branch_pages++;
@@ -7291,7 +7308,7 @@ mdb_node_add(MDB_cursor *mc, indx_t indx
void *ndata;
DKBUF;
- mdb_cassert(mc, mp->mp_upper >= mp->mp_lower);
+ mdb_cassert(mc, MP_UPPER(mp) >= MP_LOWER(mp));
DPRINTF(("add to %s %spage %"Z"u index %i, data size %"Z"u key size %"Z"u [%s]",
IS_LEAF(mp) ? "leaf" : "branch",
@@ -7310,8 +7327,8 @@ mdb_node_add(MDB_cursor *mc, indx_t indx
memcpy(ptr, key->mv_data, ksize);
/* Just using these for counting */
- mp->mp_lower += sizeof(indx_t);
- mp->mp_upper -= ksize - sizeof(indx_t);
+ MP_LOWER(mp) += sizeof(indx_t);
+ MP_UPPER(mp) -= ksize - sizeof(indx_t);
return MDB_SUCCESS;
}
@@ -7348,14 +7365,14 @@ mdb_node_add(MDB_cursor *mc, indx_t indx
update:
/* Move higher pointers up one slot. */
for (i = NUMKEYS(mp); i > indx; i--)
- mp->mp_ptrs[i] = mp->mp_ptrs[i - 1];
+ MP_PTRS(mp)[i] = MP_PTRS(mp)[i - 1];
/* Adjust free space offsets. */
- ofs = mp->mp_upper - node_size;
- mdb_cassert(mc, ofs >= mp->mp_lower + sizeof(indx_t));
- mp->mp_ptrs[indx] = ofs;
- mp->mp_upper = ofs;
- mp->mp_lower += sizeof(indx_t);
+ ofs = MP_UPPER(mp) - node_size;
+ mdb_cassert(mc, ofs >= MP_LOWER(mp) + sizeof(indx_t));
+ MP_PTRS(mp)[indx] = ofs;
+ MP_UPPER(mp) = ofs;
+ MP_LOWER(mp) += sizeof(indx_t);
/* Write the node data. */
node = NODEPTR(mp, indx);
@@ -7393,7 +7410,7 @@ update:
full:
DPRINTF(("not enough room in page %"Z"u, got %u ptrs",
mdb_dbg_pgno(mp), NUMKEYS(mp)));
- DPRINTF(("upper-lower = %u - %u = %"Z"d", mp->mp_upper,mp->mp_lower,room));
+ DPRINTF(("upper-lower = %u - %u = %"Z"d", MP_UPPER(mp),MP_LOWER(mp),room));
DPRINTF(("node size = %"Z"u", node_size));
mc->mc_txn->mt_flags |= MDB_TXN_ERROR;
return MDB_PAGE_FULL;
@@ -7424,8 +7441,8 @@ mdb_node_del(MDB_cursor *mc, int ksize)
base = LEAF2KEY(mp, indx, ksize);
if (x)
memmove(base, base + ksize, x * ksize);
- mp->mp_lower -= sizeof(indx_t);
- mp->mp_upper += ksize - sizeof(indx_t);
+ MP_LOWER(mp) -= sizeof(indx_t);
+ MP_UPPER(mp) += ksize - sizeof(indx_t);
return;
}
@@ -7439,21 +7456,21 @@ mdb_node_del(MDB_cursor *mc, int ksize)
}
sz = EVEN(sz);
- ptr = mp->mp_ptrs[indx];
+ ptr = MP_PTRS(mp)[indx];
for (i = j = 0; i < numkeys; i++) {
if (i != indx) {
- mp->mp_ptrs[j] = mp->mp_ptrs[i];
- if (mp->mp_ptrs[i] < ptr)
- mp->mp_ptrs[j] += sz;
+ MP_PTRS(mp)[j] = MP_PTRS(mp)[i];
+ if (MP_PTRS(mp)[i] < ptr)
+ MP_PTRS(mp)[j] += sz;
j++;
}
}
- base = (char *)mp + mp->mp_upper + PAGEBASE;
- memmove(base + sz, base, ptr - mp->mp_upper);
+ base = (char *)mp + MP_UPPER(mp) + PAGEBASE;
+ memmove(base + sz, base, ptr - MP_UPPER(mp));
- mp->mp_lower -= sizeof(indx_t);
- mp->mp_upper += sz;
+ MP_LOWER(mp) -= sizeof(indx_t);
+ MP_UPPER(mp) += sz;
}
/** Compact the main page after deleting a node on a subpage.
@@ -7482,15 +7499,15 @@ mdb_node_shrink(MDB_page *mp, indx_t ind
} else {
xp = (MDB_page *)((char *)sp + delta); /* destination subpage */
for (i = NUMKEYS(sp); --i >= 0; )
- xp->mp_ptrs[i] = sp->mp_ptrs[i] - delta;
+ MP_PTRS(xp)[i] = MP_PTRS(sp)[i] - delta;
len = PAGEHDRSZ;
}
- sp->mp_upper = sp->mp_lower;
- COPY_PGNO(sp->mp_pgno, mp->mp_pgno);
+ MP_UPPER(sp) = MP_LOWER(sp);
+ COPY_PGNO(MP_PGNO(sp), MP_PGNO(mp));
SETDSZ(node, nsize);
/* Shift <lower nodes...initial part of subpage> upward */
- base = (char *)mp + mp->mp_upper + PAGEBASE;
+ base = (char *)mp + MP_UPPER(mp) + PAGEBASE;
memmove(base + delta, base, (char *)sp + len - base);
ptr = mp->mp_ptrs[indx];
@@ -7498,7 +7515,7 @@ mdb_node_shrink(MDB_page *mp, indx_t ind
if (mp->mp_ptrs[i] <= ptr)
mp->mp_ptrs[i] += delta;
}
- mp->mp_upper += delta;
+ MP_UPPER(mp) += delta;
}
/** Initial setup of a sorted-dups cursor.
@@ -7557,7 +7574,7 @@ mdb_xcursor_init1(MDB_cursor *mc, MDB_no
mx->mx_db.md_leaf_pages = 1;
mx->mx_db.md_overflow_pages = 0;
mx->mx_db.md_entries = NUMKEYS(fp);
- COPY_PGNO(mx->mx_db.md_root, fp->mp_pgno);
+ COPY_PGNO(mx->mx_db.md_root, MP_PGNO(fp));
mx->mx_cursor.mc_snum = 1;
mx->mx_cursor.mc_top = 0;
mx->mx_cursor.mc_flags = C_INITIALIZED|C_SUB;
@@ -7813,10 +7830,10 @@ mdb_update_key(MDB_cursor *mc, MDB_val *
mp->mp_ptrs[i] -= delta;
}
- base = (char *)mp + mp->mp_upper + PAGEBASE;
- len = ptr - mp->mp_upper + NODESIZE;
+ base = (char *)mp + MP_UPPER(mp) + PAGEBASE;
+ len = ptr - MP_UPPER(mp) + NODESIZE;
memmove(base - delta, base, len);
- mp->mp_upper -= delta;
+ MP_UPPER(mp) -= delta;
node = NODEPTR(mp, indx);
}
@@ -8635,7 +8652,7 @@ mdb_page_split(MDB_cursor *mc, MDB_val *
DKEY(newkey), mc->mc_ki[mc->mc_top], nkeys));
/* Create a right sibling. */
- if ((rc = mdb_page_new(mc, mp->mp_flags, 1, &rp)))
+ if ((rc = mdb_page_new(mc, MP_FLAGS(mp), 1, &rp)))
return rc;
rp->mp_pad = mp->mp_pad;
DPRINTF(("new right sibling: page %"Z"u", rp->mp_pgno));
@@ -8700,10 +8717,10 @@ mdb_page_split(MDB_cursor *mc, MDB_val *
split = LEAF2KEY(mp, split_indx, ksize);
rsize = (nkeys - split_indx) * ksize;
lsize = (nkeys - split_indx) * sizeof(indx_t);
- mp->mp_lower -= lsize;
- rp->mp_lower += lsize;
- mp->mp_upper += rsize - lsize;
- rp->mp_upper -= rsize - lsize;
+ MP_LOWER(mp) -= lsize;
+ MP_LOWER(rp) += lsize;
+ MP_UPPER(mp) += rsize - lsize;
+ MP_UPPER(rp) -= rsize - lsize;
sepkey.mv_size = ksize;
if (newindx == split_indx) {
sepkey.mv_data = newkey->mv_data;
@@ -8716,16 +8733,16 @@ mdb_page_split(MDB_cursor *mc, MDB_val *
sepkey.mv_data = rp->mp_ptrs;
memmove(ins+ksize, ins, (split_indx - mc->mc_ki[mc->mc_top]) * ksize);
memcpy(ins, newkey->mv_data, ksize);
- mp->mp_lower += sizeof(indx_t);
- mp->mp_upper -= ksize - sizeof(indx_t);
+ MP_LOWER(mp) += sizeof(indx_t);
+ MP_UPPER(mp) -= ksize - sizeof(indx_t);
} else {
if (x)
memcpy(rp->mp_ptrs, split, x * ksize);
ins = LEAF2KEY(rp, x, ksize);
memcpy(ins, newkey->mv_data, ksize);
memcpy(ins+ksize, split + x * ksize, rsize - x * ksize);
- rp->mp_lower += sizeof(indx_t);
- rp->mp_upper -= ksize - sizeof(indx_t);
+ MP_LOWER(rp) += sizeof(indx_t);
+ MP_UPPER(rp) -= ksize - sizeof(indx_t);
mc->mc_ki[mc->mc_top] = x;
}
} else {
@@ -8745,9 +8762,9 @@ mdb_page_split(MDB_cursor *mc, MDB_val *
goto done;
}
copy->mp_pgno = mp->mp_pgno;
- copy->mp_flags = mp->mp_flags;
- copy->mp_lower = (PAGEHDRSZ-PAGEBASE);
- copy->mp_upper = env->me_psize - PAGEBASE;
+ MP_FLAGS(copy) = MP_FLAGS(mp);
+ MP_LOWER(copy) = (PAGEHDRSZ-PAGEBASE);
+ MP_UPPER(copy) = env->me_psize - PAGEBASE;
/* prepare to insert */
for (i=0, j=0; i<nkeys; i++) {
@@ -8917,10 +8934,10 @@ mdb_page_split(MDB_cursor *mc, MDB_val *
nkeys = NUMKEYS(copy);
for (i=0; i<nkeys; i++)
mp->mp_ptrs[i] = copy->mp_ptrs[i];
- mp->mp_lower = copy->mp_lower;
- mp->mp_upper = copy->mp_upper;
+ MP_LOWER(mp) = MP_LOWER(copy);
+ MP_UPPER(mp) = MP_UPPER(copy);
memcpy(NODEPTR(mp, nkeys-1), NODEPTR(copy, nkeys-1),
- env->me_psize - copy->mp_upper - PAGEBASE);
+ env->me_psize - MP_UPPER(copy) - PAGEBASE);
/* reset back to original page */
if (newindx < split_indx) {
@@ -9390,14 +9407,14 @@ mdb_env_copyfd1(MDB_env *env, HANDLE fd)
mp = (MDB_page *)my.mc_wbuf[0];
memset(mp, 0, NUM_METAS * env->me_psize);
mp->mp_pgno = 0;
- mp->mp_flags = P_META;
+ MP_FLAGS(mp) = P_META;
mm = (MDB_meta *)METADATA(mp);
mdb_env_init_meta0(env, mm);
mm->mm_address = env->me_metas[0]->mm_address;
mp = (MDB_page *)(my.mc_wbuf[0] + env->me_psize);
mp->mp_pgno = 1;
- mp->mp_flags = P_META;
+ MP_FLAGS(mp) = P_META;
*(MDB_meta *)METADATA(mp) = *mm;
mm = (MDB_meta *)METADATA(mp);
Reply to: