static enum TDB_ERROR transaction_oob(struct tdb_context *tdb, tdb_off_t len,
bool probe)
{
- if (len <= tdb->map_size) {
+ if (len <= tdb->file->map_size) {
return TDB_SUCCESS;
}
if (!probe) {
tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_oob len %lld beyond transaction size %lld",
(long long)len,
- (long long)tdb->map_size);
+ (long long)tdb->file->map_size);
}
return TDB_ERR_IO;
}
/* add a write to the transaction elements, so subsequent
reads see the zero data */
- ecode = transaction_write(tdb, tdb->map_size, NULL, addition);
+ ecode = transaction_write(tdb, tdb->file->map_size, NULL, addition);
if (ecode == TDB_SUCCESS) {
- tdb->map_size += addition;
+ tdb->file->map_size += addition;
}
return ecode;
}
return TDB_SUCCESS;
}
- if (fsync(tdb->fd) != 0) {
+ if (fsync(tdb->file->fd) != 0) {
return tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_transaction: fsync failed: %s",
strerror(errno));
}
#ifdef MS_SYNC
- if (tdb->map_ptr) {
+ if (tdb->file->map_ptr) {
tdb_off_t moffset = offset & ~(getpagesize()-1);
- if (msync(moffset + (char *)tdb->map_ptr,
+ if (msync(moffset + (char *)tdb->file->map_ptr,
length + (offset - moffset), MS_SYNC) != 0) {
return tdb_logerr(tdb, TDB_ERR_IO, TDB_LOG_ERROR,
"tdb_transaction: msync failed: %s",
return;
}
- tdb->map_size = tdb->transaction->old_map_size;
+ tdb->file->map_size = tdb->transaction->old_map_size;
/* free all the transaction blocks */
for (i=0;i<tdb->transaction->num_blocks;i++) {
}
}
- if (tdb->allrecord_lock.count)
- tdb_allrecord_unlock(tdb, tdb->allrecord_lock.ltype);
+ if (tdb->file->allrecord_lock.count)
+ tdb_allrecord_unlock(tdb, tdb->file->allrecord_lock.ltype);
/* restore the normal io methods */
tdb->methods = tdb->transaction->io_methods;
/* make sure we know about any file expansions already done by
anyone else */
- tdb->methods->oob(tdb, tdb->map_size + 1, true);
- tdb->transaction->old_map_size = tdb->map_size;
+ tdb->methods->oob(tdb, tdb->file->map_size + 1, true);
+ tdb->transaction->old_map_size = tdb->file->map_size;
/* finally hook the io methods, replacing them with
transaction specific methods */
= (((sizeof(rec) + *recovery_size) + getpagesize()-1)
& ~(getpagesize()-1))
- sizeof(rec);
- *recovery_offset = tdb->map_size;
+ *recovery_offset = tdb->file->map_size;
recovery_head = *recovery_offset;
/* Restore ->map_size before calling underlying expand_file.
Also so that we don't try to expand the file again in the
transaction commit, which would destroy the recovery
area */
- addition = (tdb->map_size - tdb->transaction->old_map_size) +
+ addition = (tdb->file->map_size - tdb->transaction->old_map_size) +
sizeof(rec) + *recovery_max_size;
- tdb->map_size = tdb->transaction->old_map_size;
+ tdb->file->map_size = tdb->transaction->old_map_size;
ecode = methods->expand_file(tdb, addition);
if (ecode != TDB_SUCCESS) {
return tdb_logerr(tdb, ecode, TDB_LOG_ERROR,
/* we have to reset the old map size so that we don't try to
expand the file again in the transaction commit, which
would destroy the recovery area */
- tdb->transaction->old_map_size = tdb->map_size;
+ tdb->transaction->old_map_size = tdb->file->map_size;
/* write the recovery header offset and sync - we can sync without a race here
as the magic ptr in the recovery record has not been set */
static enum TDB_ERROR transaction_setup_recovery(struct tdb_context *tdb,
tdb_off_t *magic_offset)
{
- tdb_len_t recovery_size;
+ /* Initialized for GCC's 4.4.5 overzealous uninitialized warnings. */
+ tdb_len_t recovery_size = 0;
+ tdb_off_t recovery_offset = 0, recovery_max_size = 0;
unsigned char *data, *p;
const struct tdb_methods *methods = tdb->transaction->io_methods;
struct tdb_recovery_record *rec;
- tdb_off_t recovery_offset, recovery_max_size;
tdb_off_t old_map_size = tdb->transaction->old_map_size;
uint64_t magic, tailer;
int i;
if (offset >= old_map_size) {
continue;
}
- if (offset + length > tdb->map_size) {
+ if (offset + length > tdb->file->map_size) {
free(data);
return tdb_logerr(tdb, TDB_ERR_CORRUPT, TDB_LOG_ERROR,
"tdb_transaction_setup_recovery:"
tdb->transaction->prepared = true;
/* expand the file to the new size if needed */
- if (tdb->map_size != tdb->transaction->old_map_size) {
- tdb_len_t add = tdb->map_size - tdb->transaction->old_map_size;
+ if (tdb->file->map_size != tdb->transaction->old_map_size) {
+ tdb_len_t add;
+
+ add = tdb->file->map_size - tdb->transaction->old_map_size;
/* Restore original map size for tdb_expand_file */
- tdb->map_size = tdb->transaction->old_map_size;
+ tdb->file->map_size = tdb->transaction->old_map_size;
ecode = methods->expand_file(tdb, add);
if (ecode != TDB_SUCCESS) {
tdb_logerr(tdb, ecode, TDB_LOG_ERROR,
tdb->transaction->num_blocks = 0;
/* ensure the new data is on disk */
- ecode = transaction_sync(tdb, 0, tdb->map_size);
+ ecode = transaction_sync(tdb, 0, tdb->file->map_size);
if (ecode != TDB_SUCCESS) {
return ecode;
}
free(data);
- ecode = transaction_sync(tdb, 0, tdb->map_size);
+ ecode = transaction_sync(tdb, 0, tdb->file->map_size);
if (ecode != TDB_SUCCESS) {
return tdb_logerr(tdb, ecode, TDB_LOG_ERROR,
"tdb_transaction_recover:"