assert(f);
- if (f->header && f->writable)
- f->header->state = STATE_OFFLINE;
+ if (f->header) {
+ if (f->writable)
+ f->header->state = STATE_OFFLINE;
+ munmap(f->header, PAGE_ALIGN(sizeof(Header)));
+ }
for (t = 0; t < _WINDOW_MAX; t++)
if (f->windows[t].ptr)
zero(h);
memcpy(h.signature, signature, 8);
- h.arena_offset = htole64(ALIGN64(sizeof(h)));
+ h.header_size = htole64(ALIGN64(sizeof(h)));
r = sd_id128_randomize(&h.file_id);
if (r < 0)
return -EPROTONOSUPPORT;
#endif
- if ((uint64_t) f->last_stat.st_size < (le64toh(f->header->arena_offset) + le64toh(f->header->arena_size)))
+ if (f->header->header_size != htole64(ALIGN64(sizeof(*(f->header)))))
+ return -EBADMSG;
+
+ if ((uint64_t) f->last_stat.st_size < (le64toh(f->header->header_size) + le64toh(f->header->arena_size)))
return -ENODATA;
if (f->writable) {
static int journal_file_allocate(JournalFile *f, uint64_t offset, uint64_t size) {
uint64_t old_size, new_size;
+ int r;
assert(f);
* ourselves */
old_size =
- le64toh(f->header->arena_offset) +
+ le64toh(f->header->header_size) +
le64toh(f->header->arena_size);
new_size = PAGE_ALIGN(offset + size);
- if (new_size < le64toh(f->header->arena_offset))
- new_size = le64toh(f->header->arena_offset);
+ if (new_size < le64toh(f->header->header_size))
+ new_size = le64toh(f->header->header_size);
if (new_size <= old_size)
return 0;
/* Note that the glibc fallocate() fallback is very
inefficient, hence we try to minimize the allocation area
as we can. */
- if (posix_fallocate(f->fd, old_size, new_size - old_size) < 0)
- return -errno;
+ r = posix_fallocate(f->fd, old_size, new_size - old_size);
+ if (r != 0)
+ return -r;
if (fstat(f->fd, &f->last_stat) < 0)
return -errno;
- f->header->arena_size = htole64(new_size - le64toh(f->header->arena_offset));
+ f->header->arena_size = htole64(new_size - le64toh(f->header->header_size));
return 0;
}
p = le64toh(f->header->tail_object_offset);
if (p == 0)
- p = le64toh(f->header->arena_offset);
+ p = le64toh(f->header->header_size);
else {
r = journal_file_move_to_object(f, -1, p, &tail);
if (r < 0)
o->data.n_entries = 0;
h = hash % (le64toh(f->header->data_hash_table_size) / sizeof(HashItem));
- p = le64toh(f->data_hash_table[h].head_hash_offset);
+ p = le64toh(f->data_hash_table[h].tail_hash_offset);
if (p == 0) {
/* Only entry in the hash table is easy */
f->data_hash_table[h].head_hash_offset = htole64(offset);
(unsigned long) le64toh(f->header->n_objects),
(unsigned long) le64toh(f->header->n_entries));
- p = le64toh(f->header->arena_offset);
+ p = le64toh(f->header->header_size);
while (p != 0) {
r = journal_file_move_to_object(f, -1, p, &o);
if (r < 0)
case OBJECT_ENTRY_ARRAY:
printf("Type: OBJECT_ENTRY_ARRAY\n");
break;
+
+ case OBJECT_SIGNATURE:
+ printf("Type: OBJECT_SIGNATURE\n");
+ break;
}
if (o->object.flags & OBJECT_COMPRESSED)
size_t q;
struct stat st;
char *p;
- unsigned long long seqnum, realtime;
+ unsigned long long seqnum = 0, realtime;
sd_id128_t seqnum_id;
bool have_seqnum;