Blame ndb_backport2.diff

Bernhard M. Wiedemann 4b0d85
--- ./lib/backend/ndb/glue.c.orig	2020-04-03 10:24:27.954135180 +0000
Bernhard M. Wiedemann 4b0d85
+++ ./lib/backend/ndb/glue.c	2020-04-14 09:48:23.304231127 +0000
Bernhard M. Wiedemann 4b0d85
@@ -143,9 +143,6 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
Bernhard M. Wiedemann 4b0d85
 	free(path);
Bernhard M. Wiedemann 4b0d85
 	dbi->dbi_db = ndbenv->pkgdb = pkgdb;
Bernhard M. Wiedemann 4b0d85
 	rpmpkgSetFsync(pkgdb, ndbenv->dofsync);
Bernhard M. Wiedemann 4b0d85
-
Bernhard M. Wiedemann 4b0d85
-	if ((oflags & (O_RDWR | O_RDONLY)) == O_RDONLY)
Bernhard M. Wiedemann 4b0d85
-	    dbi->dbi_flags |= DBI_RDONLY;
Bernhard M. Wiedemann 4b0d85
     } else {
Bernhard M. Wiedemann 4b0d85
 	unsigned int id;
Bernhard M. Wiedemann 4b0d85
 	rpmidxdb idxdb = 0;
Bernhard M. Wiedemann 4b0d85
@@ -184,20 +181,20 @@ static int ndb_Open(rpmdb rdb, rpmDbiTag
Bernhard M. Wiedemann 4b0d85
 		ndb_CheckIndexSync(ndbenv->pkgdb, ndbenv->xdb);
Bernhard M. Wiedemann 4b0d85
 	}
Bernhard M. Wiedemann 4b0d85
 	if (rpmxdbLookupBlob(ndbenv->xdb, &id, rpmtag, 0, 0) == RPMRC_NOTFOUND) {
Bernhard M. Wiedemann 4b0d85
+	    oflags = O_RDWR|O_CREAT;
Bernhard M. Wiedemann 4b0d85
 	    dbi->dbi_flags |= DBI_CREATED;
Bernhard M. Wiedemann 4b0d85
 	}
Bernhard M. Wiedemann 4b0d85
 	rpmlog(RPMLOG_DEBUG, "opening  db index       %s tag=%d\n", dbiName(dbi), rpmtag);
Bernhard M. Wiedemann 4b0d85
-	if (rpmidxOpenXdb(&idxdb, rdb->db_pkgs->dbi_db, ndbenv->xdb, rpmtag)) {
Bernhard M. Wiedemann 4b0d85
+	if (rpmidxOpenXdb(&idxdb, rdb->db_pkgs->dbi_db, ndbenv->xdb, rpmtag, oflags)) {
Bernhard M. Wiedemann 4b0d85
 	    perror("rpmidxOpenXdb");
Bernhard M. Wiedemann 4b0d85
 	    ndb_Close(dbi, 0);
Bernhard M. Wiedemann 4b0d85
 	    return 1;
Bernhard M. Wiedemann 4b0d85
 	}
Bernhard M. Wiedemann 4b0d85
 	dbi->dbi_db = idxdb;
Bernhard M. Wiedemann 4b0d85
-
Bernhard M. Wiedemann 4b0d85
-	if (rpmxdbIsRdonly(ndbenv->xdb))
Bernhard M. Wiedemann 4b0d85
-	    dbi->dbi_flags |= DBI_RDONLY;
Bernhard M. Wiedemann 4b0d85
     }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
+    if ((oflags & (O_RDWR | O_RDONLY)) == O_RDONLY)
Bernhard M. Wiedemann 4b0d85
+	dbi->dbi_flags |= DBI_RDONLY;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     if (dbip != NULL)
Bernhard M. Wiedemann 4b0d85
 	*dbip = dbi;
Bernhard M. Wiedemann 4b0d85
--- ./lib/backend/ndb/rpmidx.c.orig	2019-11-13 09:19:29.305710571 +0000
Bernhard M. Wiedemann 4b0d85
+++ ./lib/backend/ndb/rpmidx.c	2020-04-14 09:48:23.304231127 +0000
Bernhard M. Wiedemann 4b0d85
@@ -885,13 +885,17 @@ int rpmidxOpen(rpmidxdb *idxdbp, rpmpkgd
Bernhard M. Wiedemann 4b0d85
     return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
-int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag)
Bernhard M. Wiedemann 4b0d85
+int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag, int flags)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
     rpmidxdb idxdb;
Bernhard M. Wiedemann 4b0d85
     unsigned int id;
Bernhard M. Wiedemann 4b0d85
     *idxdbp = 0;
Bernhard M. Wiedemann 4b0d85
     int rc;
Bernhard M. Wiedemann 4b0d85
     
Bernhard M. Wiedemann 4b0d85
+    if (rpmxdbIsRdonly(xdb) && (flags & (O_RDONLY|O_RDWR)) != O_RDONLY) {
Bernhard M. Wiedemann 4b0d85
+	errno = EACCES;
Bernhard M. Wiedemann 4b0d85
+	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
+    }
Bernhard M. Wiedemann 4b0d85
     if (rpmxdbLock(xdb, 0))
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
     rc = rpmxdbLookupBlob(xdb, &id, xdbtag, IDXDB_XDB_SUBTAG, 0);
Bernhard M. Wiedemann 4b0d85
@@ -907,7 +911,7 @@ int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmp
Bernhard M. Wiedemann 4b0d85
     idxdb->xdbid = id;
Bernhard M. Wiedemann 4b0d85
     idxdb->pkgdb = pkgdb;
Bernhard M. Wiedemann 4b0d85
     idxdb->pagesize = rpmxdbPagesize(xdb);
Bernhard M. Wiedemann 4b0d85
-    idxdb->rdonly = rpmxdbIsRdonly(xdb) ? 1 : 0;
Bernhard M. Wiedemann 4b0d85
+    idxdb->rdonly = (flags & (O_RDONLY|O_RDWR)) == O_RDONLY ? 1 : 0;
Bernhard M. Wiedemann 4b0d85
     if (!id) {
Bernhard M. Wiedemann 4b0d85
 	if (rpmidxInit(idxdb)) {
Bernhard M. Wiedemann 4b0d85
 	    free(idxdb);
Bernhard M. Wiedemann 4b0d85
--- ./lib/backend/ndb/rpmidx.h.orig	2019-06-26 14:17:31.406985703 +0000
Bernhard M. Wiedemann 4b0d85
+++ ./lib/backend/ndb/rpmidx.h	2020-04-14 09:48:23.304231127 +0000
Bernhard M. Wiedemann 4b0d85
@@ -5,7 +5,7 @@ struct rpmidxdb_s;
Bernhard M. Wiedemann 4b0d85
 typedef struct rpmidxdb_s *rpmidxdb;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
 int rpmidxOpen(rpmidxdb *idxdbp, rpmpkgdb pkgdb, const char *filename, int flags, int mode);
Bernhard M. Wiedemann 4b0d85
-int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag);
Bernhard M. Wiedemann 4b0d85
+int rpmidxOpenXdb(rpmidxdb *idxdbp, rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag, int flags);
Bernhard M. Wiedemann 4b0d85
 int rpmidxDelXdb(rpmpkgdb pkgdb, rpmxdb xdb, unsigned int xdbtag);
Bernhard M. Wiedemann 4b0d85
 void rpmidxClose(rpmidxdb idxdbp);
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
--- ./lib/backend/ndb/rpmxdb.c.orig	2020-04-03 10:24:27.954135180 +0000
Bernhard M. Wiedemann 4b0d85
+++ ./lib/backend/ndb/rpmxdb.c	2020-04-14 09:48:23.304231127 +0000
Bernhard M. Wiedemann 4b0d85
@@ -36,7 +36,7 @@ typedef struct rpmxdb_s {
Bernhard M. Wiedemann 4b0d85
     unsigned int usergeneration;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     unsigned char *mapped;
Bernhard M. Wiedemann 4b0d85
-    int mapflags;
Bernhard M. Wiedemann 4b0d85
+    int mappedrw;
Bernhard M. Wiedemann 4b0d85
     unsigned int mappedlen;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     struct xdb_slot {
Bernhard M. Wiedemann 4b0d85
@@ -57,6 +57,7 @@ typedef struct rpmxdb_s {
Bernhard M. Wiedemann 4b0d85
     unsigned int usedblobpages;
Bernhard M. Wiedemann 4b0d85
     unsigned int systempagesize;
Bernhard M. Wiedemann 4b0d85
     int dofsync;
Bernhard M. Wiedemann 4b0d85
+    unsigned int locked_excl;
Bernhard M. Wiedemann 4b0d85
 } *rpmxdb;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
@@ -125,17 +126,19 @@ static void unmapmem(void *addr, size_t
Bernhard M. Wiedemann 4b0d85
 #define ROUNDTOSYSTEMPAGE(xdb, size) (((size) + (xdb->systempagesize - 1)) & ~(xdb->systempagesize - 1))
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
 /* xdb header mapping functions */
Bernhard M. Wiedemann 4b0d85
-static int mapheader(rpmxdb xdb, unsigned int slotnpages)
Bernhard M. Wiedemann 4b0d85
+static int mapheader(rpmxdb xdb, unsigned int slotnpages, int rw)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
     unsigned char *mapped;
Bernhard M. Wiedemann 4b0d85
     size_t mappedlen = slotnpages * xdb->pagesize;
Bernhard M. Wiedemann 4b0d85
+    int mapflags = rw ? PROT_READ | PROT_WRITE : PROT_READ;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     mappedlen = ROUNDTOSYSTEMPAGE(xdb, mappedlen);
Bernhard M. Wiedemann 4b0d85
-    mapped = mapmem(xdb->mapped, xdb->mappedlen, mappedlen, xdb->mapflags, xdb->fd, 0);
Bernhard M. Wiedemann 4b0d85
+    mapped = mapmem(xdb->mapped, xdb->mappedlen, mappedlen, mapflags, xdb->fd, 0);
Bernhard M. Wiedemann 4b0d85
     if ((void *)mapped == MAP_FAILED)
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
     xdb->mapped = mapped;
Bernhard M. Wiedemann 4b0d85
     xdb->mappedlen = mappedlen;
Bernhard M. Wiedemann 4b0d85
+    xdb->mappedrw = rw;
Bernhard M. Wiedemann 4b0d85
     return RPMRC_OK;
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
@@ -247,7 +250,7 @@ static int rpmxdbReadHeaderRaw(rpmxdb xd
Bernhard M. Wiedemann 4b0d85
     return RPMRC_OK;
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
-static int rpmxdbReadHeader(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
+static int rpmxdbReadHeader(rpmxdb xdb, int rw)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
     struct xdb_slot *slot;
Bernhard M. Wiedemann 4b0d85
     unsigned int slotnpages, pagesize, generation, usergeneration;
Bernhard M. Wiedemann 4b0d85
@@ -261,6 +264,11 @@ static int rpmxdbReadHeader(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     if (xdb->mapped) {
Bernhard M. Wiedemann 4b0d85
 	if (le2ha(xdb->mapped + XDB_OFFSET_GENERATION) == xdb->generation) {
Bernhard M. Wiedemann 4b0d85
+	    if (rw && !xdb->mappedrw) {
Bernhard M. Wiedemann 4b0d85
+		unmapheader(xdb);
Bernhard M. Wiedemann 4b0d85
+		if (mapheader(xdb, xdb->slotnpages, rw))
Bernhard M. Wiedemann 4b0d85
+		    return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
+	    }
Bernhard M. Wiedemann 4b0d85
 	    return RPMRC_OK;
Bernhard M. Wiedemann 4b0d85
 	}
Bernhard M. Wiedemann 4b0d85
 	unmapheader(xdb);
Bernhard M. Wiedemann 4b0d85
@@ -273,9 +281,8 @@ static int rpmxdbReadHeader(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
     if (stb.st_size % pagesize != 0)
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
     xdb->pagesize = pagesize;
Bernhard M. Wiedemann 4b0d85
-    xdb->mapflags = xdb->rdonly ? PROT_READ : PROT_READ | PROT_WRITE;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
-    if (mapheader(xdb, slotnpages))
Bernhard M. Wiedemann 4b0d85
+    if (mapheader(xdb, slotnpages, rw))
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     /* read in all slots */
Bernhard M. Wiedemann 4b0d85
@@ -368,6 +375,8 @@ static int rpmxdbReadHeader(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
 			    nslot->mapcallback(xdb, nslot->mapcallbackdata, 0, 0);
Bernhard M. Wiedemann 4b0d85
 			}
Bernhard M. Wiedemann 4b0d85
 		    }
Bernhard M. Wiedemann 4b0d85
+		} else {
Bernhard M. Wiedemann 4b0d85
+		    nslot->mapped = slot->mapped;
Bernhard M. Wiedemann 4b0d85
 		}
Bernhard M. Wiedemann 4b0d85
 	    }
Bernhard M. Wiedemann 4b0d85
 	}
Bernhard M. Wiedemann 4b0d85
@@ -382,17 +391,14 @@ static int rpmxdbReadHeader(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
     return RPMRC_OK;
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
-static int rpmxdbWriteHeader(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
+static void rpmxdbWriteHeader(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
-    if (!xdb->mapped)
Bernhard M. Wiedemann 4b0d85
-	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
     h2lea(XDB_MAGIC, xdb->mapped + XDB_OFFSET_MAGIC);
Bernhard M. Wiedemann 4b0d85
     h2lea(XDB_VERSION, xdb->mapped + XDB_OFFSET_VERSION);
Bernhard M. Wiedemann 4b0d85
     h2lea(xdb->generation, xdb->mapped + XDB_OFFSET_GENERATION);
Bernhard M. Wiedemann 4b0d85
     h2lea(xdb->slotnpages, xdb->mapped + XDB_OFFSET_SLOTNPAGES);
Bernhard M. Wiedemann 4b0d85
     h2lea(xdb->pagesize, xdb->mapped + XDB_OFFSET_PAGESIZE);
Bernhard M. Wiedemann 4b0d85
     h2lea(xdb->usergeneration, xdb->mapped + XDB_OFFSET_USERGENERATION);
Bernhard M. Wiedemann 4b0d85
-    return RPMRC_OK;
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
 static void rpmxdbUpdateSlot(rpmxdb xdb, struct xdb_slot *slot)
Bernhard M. Wiedemann 4b0d85
@@ -473,19 +479,25 @@ static int rpmxdbInitInternal(rpmxdb xdb
Bernhard M. Wiedemann 4b0d85
 /* we use the master pdb for locking */
Bernhard M. Wiedemann 4b0d85
 static int rpmxdbLockOnly(rpmxdb xdb, int excl)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
+    int rc;
Bernhard M. Wiedemann 4b0d85
     if (excl && xdb->rdonly)
Bernhard M. Wiedemann 4b0d85
         return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
-    return rpmpkgLock(xdb->pkgdb, excl);
Bernhard M. Wiedemann 4b0d85
+    rc = rpmpkgLock(xdb->pkgdb, excl);
Bernhard M. Wiedemann 4b0d85
+    if (!rc && excl)
Bernhard M. Wiedemann 4b0d85
+	xdb->locked_excl++;
Bernhard M. Wiedemann 4b0d85
+    return rc;
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
-/* this is the same as rpmxdbLockReadHeader. It does the
Bernhard M. Wiedemann 4b0d85
+/* This is similar to rpmxdbLockReadHeader. It does the
Bernhard M. Wiedemann 4b0d85
  * ReadHeader to sync the mappings if xdb moved some blobs.
Bernhard M. Wiedemann 4b0d85
+ * Note that we just ask for rad-only access in the
Bernhard M. Wiedemann 4b0d85
+ * rpmxdbReadHeader call.
Bernhard M. Wiedemann 4b0d85
  */
Bernhard M. Wiedemann 4b0d85
 int rpmxdbLock(rpmxdb xdb, int excl)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
     if (rpmxdbLockOnly(xdb, excl))
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
-    if (rpmxdbReadHeader(xdb)) {
Bernhard M. Wiedemann 4b0d85
+    if (rpmxdbReadHeader(xdb, 0)) {
Bernhard M. Wiedemann 4b0d85
 	rpmxdbUnlock(xdb, excl);
Bernhard M. Wiedemann 4b0d85
         return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
     }
Bernhard M. Wiedemann 4b0d85
@@ -494,14 +506,25 @@ int rpmxdbLock(rpmxdb xdb, int excl)
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
 int rpmxdbUnlock(rpmxdb xdb, int excl)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
+    if (excl && xdb->locked_excl) {
Bernhard M. Wiedemann 4b0d85
+	xdb->locked_excl--;
Bernhard M. Wiedemann 4b0d85
+	if (!xdb->locked_excl && xdb->mapped && xdb->mappedrw) {
Bernhard M. Wiedemann 4b0d85
+	    unmapheader(xdb);
Bernhard M. Wiedemann 4b0d85
+	    mapheader(xdb, xdb->slotnpages, 0);
Bernhard M. Wiedemann 4b0d85
+	}
Bernhard M. Wiedemann 4b0d85
+    }
Bernhard M. Wiedemann 4b0d85
     return rpmpkgUnlock(xdb->pkgdb, excl);
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
+/* Like rpmxdbLock, but map the header rw if excl is set.
Bernhard M. Wiedemann 4b0d85
+ * This is what the functions in this module use, whereas
Bernhard M. Wiedemann 4b0d85
+ * rpmidx uses rpmxdbLock.
Bernhard M. Wiedemann 4b0d85
+ */
Bernhard M. Wiedemann 4b0d85
 static int rpmxdbLockReadHeader(rpmxdb xdb, int excl)
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
     if (rpmxdbLockOnly(xdb, excl))
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
-    if (rpmxdbReadHeader(xdb)) {
Bernhard M. Wiedemann 4b0d85
+    if (rpmxdbReadHeader(xdb, excl)) {
Bernhard M. Wiedemann 4b0d85
 	rpmxdbUnlock(xdb, excl);
Bernhard M. Wiedemann 4b0d85
         return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
     }
Bernhard M. Wiedemann 4b0d85
@@ -594,6 +617,8 @@ void rpmxdbClose(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
     }
Bernhard M. Wiedemann 4b0d85
     if (xdb->slots)
Bernhard M. Wiedemann 4b0d85
 	free(xdb->slots);
Bernhard M. Wiedemann 4b0d85
+    if (xdb->mapped)
Bernhard M. Wiedemann 4b0d85
+	unmapheader(xdb);
Bernhard M. Wiedemann 4b0d85
     if (xdb->fd >= 0)
Bernhard M. Wiedemann 4b0d85
 	close(xdb->fd);
Bernhard M. Wiedemann 4b0d85
     if (xdb->filename)
Bernhard M. Wiedemann 4b0d85
@@ -623,7 +648,8 @@ static int moveblobto(rpmxdb xdb, struct
Bernhard M. Wiedemann 4b0d85
     didmap = 0;
Bernhard M. Wiedemann 4b0d85
     oldpagecnt = oldslot->pagecnt;
Bernhard M. Wiedemann 4b0d85
     if (!oldslot->mapped && oldpagecnt) {
Bernhard M. Wiedemann 4b0d85
-	oldslot->mapflags = PROT_READ;
Bernhard M. Wiedemann 4b0d85
+	if (!oldslot->mapcallback)
Bernhard M. Wiedemann 4b0d85
+	    oldslot->mapflags = PROT_READ;
Bernhard M. Wiedemann 4b0d85
 	if (mapslot(xdb, oldslot))
Bernhard M. Wiedemann 4b0d85
 	    return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
         didmap = 1;
Bernhard M. Wiedemann 4b0d85
@@ -772,7 +798,7 @@ static int addslotpage(rpmxdb xdb)
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     /* remap the header */
Bernhard M. Wiedemann 4b0d85
-    if (mapheader(xdb, xdb->slotnpages + 1))
Bernhard M. Wiedemann 4b0d85
+    if (mapheader(xdb, xdb->slotnpages + 1, xdb->mappedrw))
Bernhard M. Wiedemann 4b0d85
 	return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     /* update the header */
Bernhard M. Wiedemann 4b0d85
@@ -852,7 +878,8 @@ int rpmxdbLookupBlob(rpmxdb xdb, unsigne
Bernhard M. Wiedemann 4b0d85
 {
Bernhard M. Wiedemann 4b0d85
     struct xdb_slot *slot;
Bernhard M. Wiedemann 4b0d85
     unsigned int i, nslots;
Bernhard M. Wiedemann 4b0d85
-    if (rpmxdbLockReadHeader(xdb, flags ? 1 : 0))
Bernhard M. Wiedemann 4b0d85
+    int excl = flags ? 1 : 0;
Bernhard M. Wiedemann 4b0d85
+    if (rpmxdbLockReadHeader(xdb, excl))
Bernhard M. Wiedemann 4b0d85
         return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
     nslots = xdb->nslots;
Bernhard M. Wiedemann 4b0d85
     slot = 0;
Bernhard M. Wiedemann 4b0d85
@@ -865,18 +892,18 @@ int rpmxdbLookupBlob(rpmxdb xdb, unsigne
Bernhard M. Wiedemann 4b0d85
 	i = 0;
Bernhard M. Wiedemann 4b0d85
     if (i && (flags & O_TRUNC) != 0) {
Bernhard M. Wiedemann 4b0d85
 	if (rpmxdbResizeBlob(xdb, i, 0)) {
Bernhard M. Wiedemann 4b0d85
-	    rpmxdbUnlock(xdb, flags ? 1 : 0);
Bernhard M. Wiedemann 4b0d85
+	    rpmxdbUnlock(xdb, excl);
Bernhard M. Wiedemann 4b0d85
 	    return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
 	}
Bernhard M. Wiedemann 4b0d85
     }
Bernhard M. Wiedemann 4b0d85
     if (!i && (flags & O_CREAT) != 0) {
Bernhard M. Wiedemann 4b0d85
 	if (createblob(xdb, &i, blobtag, subtag)) {
Bernhard M. Wiedemann 4b0d85
-	    rpmxdbUnlock(xdb, flags ? 1 : 0);
Bernhard M. Wiedemann 4b0d85
+	    rpmxdbUnlock(xdb, excl);
Bernhard M. Wiedemann 4b0d85
 	    return RPMRC_FAIL;
Bernhard M. Wiedemann 4b0d85
 	}
Bernhard M. Wiedemann 4b0d85
     }
Bernhard M. Wiedemann 4b0d85
     *idp = i;
Bernhard M. Wiedemann 4b0d85
-    rpmxdbUnlock(xdb, flags ? 1 : 0);
Bernhard M. Wiedemann 4b0d85
+    rpmxdbUnlock(xdb, excl);
Bernhard M. Wiedemann 4b0d85
     return i ? RPMRC_OK : RPMRC_NOTFOUND;
Bernhard M. Wiedemann 4b0d85
 }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
--- ./lib/rpmdb.c.orig	2020-04-03 10:24:27.954135180 +0000
Bernhard M. Wiedemann 4b0d85
+++ ./lib/rpmdb.c	2020-04-14 09:48:23.304231127 +0000
Bernhard M. Wiedemann 4b0d85
@@ -2622,6 +2622,7 @@ int rpmdbRebuild(const char * prefix, rp
Bernhard M. Wiedemann 4b0d85
     }
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     rpmdbClose(olddb);
Bernhard M. Wiedemann 4b0d85
+    dbCtrl(newdb, DB_CTRL_INDEXSYNC);
Bernhard M. Wiedemann 4b0d85
     rpmdbClose(newdb);
Bernhard M. Wiedemann 4b0d85
 
Bernhard M. Wiedemann 4b0d85
     if (failed) {