]> git.ipfire.org Git - thirdparty/e2fsprogs.git/blobdiff - lib/ext2fs/tdb.c
Merge branch 'maint' into next
[thirdparty/e2fsprogs.git] / lib / ext2fs / tdb.c
index b313f3adcaa0940396ae775f86e627c2f9ea0a32..b36c48583970385c32df6ec2b8e82e89c402e0bd 100644 (file)
@@ -248,6 +248,7 @@ struct tdb_context {
        int page_size;
        int max_dead_records;
        bool have_transaction_lock;
+       tdb_len_t real_map_size; /* how much space has been mapped */
 };
 
 
@@ -972,9 +973,10 @@ int tdb_munmap(struct tdb_context *tdb)
 
 #ifdef HAVE_MMAP
        if (tdb->map_ptr) {
-               int ret = munmap(tdb->map_ptr, tdb->map_size);
+               int ret = munmap(tdb->map_ptr, tdb->real_map_size);
                if (ret != 0)
                        return ret;
+               tdb->real_map_size = 0;
        }
 #endif
        tdb->map_ptr = NULL;
@@ -997,10 +999,12 @@ void tdb_mmap(struct tdb_context *tdb)
                 */
 
                if (tdb->map_ptr == MAP_FAILED) {
+                       tdb->real_map_size = 0;
                        tdb->map_ptr = NULL;
                        TDB_LOG((tdb, TDB_DEBUG_WARNING, "tdb_mmap failed for size %d (%s)\n",
                                 tdb->map_size, strerror(errno)));
                }
+               tdb->real_map_size = tdb->map_size;
        } else {
                tdb->map_ptr = NULL;
        }
@@ -4140,3 +4144,13 @@ int tdb_reopen_all(int parent_longlived)
 
        return 0;
 }
+
+/**
+ * Flush a database file from the page cache.
+ **/
+int tdb_flush(struct tdb_context *tdb)
+{
+       if (tdb->fd != -1)
+               return fsync(tdb->fd);
+       return 0;
+}