static int tdb_oob(struct tdb_context *tdb, tdb_off_t len, bool probe)
{
struct stat st;
+ int ret;
+
if (len <= tdb->map_size)
return 0;
if (tdb->flags & TDB_INTERNAL) {
return -1;
}
- if (fstat(tdb->fd, &st) == -1) {
+ if (tdb_lock_expand(tdb, F_RDLCK) != 0)
+ return -1;
+
+ ret = fstat(tdb->fd, &st);
+
+ tdb_unlock_expand(tdb, F_RDLCK);
+
+ if (ret == -1) {
tdb->ecode = TDB_ERR_IO;
return -1;
}
/* Unmap, update size, remap */
tdb_munmap(tdb);
+
tdb->map_size = st.st_size;
tdb_mmap(tdb);
return 0;