# pragma GCC diagnostic ignored "-Waddress-of-packed-member"
#endif
-static int journal_file_tail_end(JournalFile *f, uint64_t *ret_offset) {
- Object *tail;
- uint64_t p;
- int r;
-
- assert(f);
- assert(f->header);
- assert(ret_offset);
-
- p = le64toh(f->header->tail_object_offset);
- if (p == 0)
- p = le64toh(f->header->header_size);
- else {
- uint64_t sz;
-
- r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &tail);
- if (r < 0)
- return r;
-
- sz = le64toh(READ_NOW(tail->object.size));
- if (sz > UINT64_MAX - sizeof(uint64_t) + 1)
- return -EBADMSG;
-
- sz = ALIGN64(sz);
- if (p > UINT64_MAX - sz)
- return -EBADMSG;
-
- p += sz;
- }
-
- *ret_offset = p;
-
- return 0;
-}
-
/* This may be called from a separate thread to prevent blocking the caller for the duration of fsync().
* As a result we use atomic operations on f->offline_state for inter-thread communications with
* journal_file_set_offline() and journal_file_set_online(). */
f->header->state = f->archive ? STATE_ARCHIVED : STATE_OFFLINE;
(void) fsync(f->fd);
-
- if (f->archive) {
- uint64_t p;
- int r;
-
- /* truncate excess from the end of archives */
- r = journal_file_tail_end(f, &p);
- if (r < 0)
- log_debug_errno(r, "Failed to determine end of tail object, ignoring: %m");
- else {
- /* arena_size can't exceed the file size, ensure it's updated before truncating */
- f->header->arena_size = htole64(p - le64toh(f->header->header_size));
-
- (void) fsync(f->fd);
-
- if (ftruncate(f->fd, p) < 0)
- log_debug_errno(errno, "Failed to truncate archive at end of tail object, ignoring: %m");
- }
- }
break;
case OFFLINE_OFFLINING:
int r;
uint64_t p;
- Object *o;
+ Object *tail, *o;
void *t;
assert(f);
if (r < 0)
return r;
- r = journal_file_tail_end(f, &p);
- if (r < 0)
- return r;
+ p = le64toh(f->header->tail_object_offset);
+ if (p == 0)
+ p = le64toh(f->header->header_size);
+ else {
+ uint64_t sz;
+
+ r = journal_file_move_to_object(f, OBJECT_UNUSED, p, &tail);
+ if (r < 0)
+ return r;
+
+ sz = le64toh(READ_NOW(tail->object.size));
+ if (sz > UINT64_MAX - sizeof(uint64_t) + 1)
+ return -EBADMSG;
+
+ sz = ALIGN64(sz);
+ if (p > UINT64_MAX - sz)
+ return -EBADMSG;
+
+ p += sz;
+ }
r = journal_file_allocate(f, p, size);
if (r < 0)