]> git.sur5r.net Git - openldap/commitdiff
ITS#7623 Clear P_SUBP on conversion from fake page
authorHoward Chu <hyc@symas.com>
Mon, 17 Jun 2013 20:26:11 +0000 (22:26 +0200)
committerHallvard Furuseth <hallvard@openldap.org>
Mon, 17 Jun 2013 20:26:11 +0000 (22:26 +0200)
libraries/liblmdb/mdb.c

index df2e888c61475d64159c53ee31afb318a6ed5c87..3c8db7eefc6225437fc760a383b95e46d4ffeda9 100644 (file)
@@ -5189,6 +5189,7 @@ more:
                                MDB_page *mp;
                                unsigned int offset;
                                unsigned int i;
+                               uint16_t fp_flags;
 
                                fp = NODEDATA(leaf);
                                if (flags == MDB_CURRENT) {
@@ -5208,6 +5209,7 @@ reuse:
                                        offset = NODESIZE + sizeof(indx_t) + data->mv_size;
                                }
                                offset += offset & 1;
+                               fp_flags = fp->mp_flags;
                                if (NODESIZE + sizeof(indx_t) + NODEKSZ(leaf) + NODEDSZ(leaf) +
                                        offset >= mc->mc_txn->mt_env->me_nodemax) {
                                        /* yes, convert it */
@@ -5231,6 +5233,7 @@ reuse:
                                        offset = mc->mc_txn->mt_env->me_psize - NODEDSZ(leaf);
                                        flags |= F_DUPDATA|F_SUBDATA;
                                        dummy.md_root = mp->mp_pgno;
+                                       fp_flags &= ~P_SUBP;
                                } else {
                                        /* no, just grow it */
                                        rdata = &xdata;
@@ -5240,7 +5243,7 @@ reuse:
                                        mp->mp_pgno = mc->mc_pg[mc->mc_top]->mp_pgno;
                                        flags |= F_DUPDATA;
                                }
-                               mp->mp_flags = fp->mp_flags | P_DIRTY;
+                               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;