From dad503169b2665ecfd3f5bfb3c936897e44ecca7 Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Fri, 7 Oct 2011 21:56:11 +0200 Subject: journal: store XOR combination of entry data object hashes to identify hash lines --- src/journal/journal-def.h | 1 + src/journal/sd-journal.c | 20 +++++++++++++++----- 2 files changed, 16 insertions(+), 5 deletions(-) (limited to 'src/journal') diff --git a/src/journal/journal-def.h b/src/journal/journal-def.h index 0d865ae2a2..2a519fe0db 100644 --- a/src/journal/journal-def.h +++ b/src/journal/journal-def.h @@ -74,6 +74,7 @@ _packed_ struct EntryObject { uint64_t seqnum; uint64_t realtime; uint64_t monotonic; + uint64_t xor_hash; uint64_t prev_entry_offset; uint64_t next_entry_offset; EntryItem items[]; diff --git a/src/journal/sd-journal.c b/src/journal/sd-journal.c index f1dd92927c..d49f717915 100644 --- a/src/journal/sd-journal.c +++ b/src/journal/sd-journal.c @@ -758,7 +758,12 @@ static int journal_file_link_entry(JournalFile *f, Object *o, uint64_t offset) { return 0; } -static int journal_file_append_entry_internal(JournalFile *f, const dual_timestamp *ts, const EntryItem items[], unsigned n_items, Object **ret, uint64_t *offset) { +static int journal_file_append_entry_internal( + JournalFile *f, + const dual_timestamp *ts, + uint64_t xor_hash, + const EntryItem items[], unsigned n_items, + Object **ret, uint64_t *offset) { uint64_t np; uint64_t osize; Object *o; @@ -776,8 +781,9 @@ static int journal_file_append_entry_internal(JournalFile *f, const dual_timesta o->object.type = htole64(OBJECT_ENTRY); o->entry.seqnum = htole64(journal_file_seqnum(f)); memcpy(o->entry.items, items, n_items * sizeof(EntryItem)); - o->entry.realtime = htole64(ts->realtime); - o->entry.monotonic = htole64(ts->monotonic); + o->entry.realtime = ts ? htole64(ts->realtime) : 0; + o->entry.monotonic = ts ? htole64(ts->monotonic) : 0; + o->entry.xor_hash = htole64(xor_hash); r = journal_file_link_entry(f, o, np); if (r < 0) @@ -796,8 +802,10 @@ int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const st unsigned i; EntryItem *items; int r; + uint64_t xor_hash = 0; assert(f); + assert(iovec || n_iovec == 0); items = new(EntryItem, n_iovec); if (!items) @@ -805,15 +813,17 @@ int journal_file_append_entry(JournalFile *f, const dual_timestamp *ts, const st for (i = 0; i < n_iovec; i++) { uint64_t p; + Object *o; - r = journal_file_append_data(f, iovec[i].iov_base, iovec[i].iov_len, NULL, &p); + r = journal_file_append_data(f, iovec[i].iov_base, iovec[i].iov_len, &o, &p); if (r < 0) goto finish; + xor_hash ^= le64toh(o->data.hash); items[i].object_offset = htole64(p); } - r = journal_file_append_entry_internal(f, ts, items, n_iovec, ret, offset); + r = journal_file_append_entry_internal(f, ts, xor_hash, items, n_iovec, ret, offset); finish: free(items); -- cgit v1.2.3-54-g00ecf