X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~ianmdlvl/git?a=blobdiff_plain;f=src%2Fjournal%2Fjournal-file.c;h=7858435badfd9bcb870beb3537bb242a884f2058;hb=ab31f6b8713d43354c3716ee4c37fe4460db9254;hp=d3535d2fadcb2edad6756bc8915c93f76e09473b;hpb=92261977d81fd6a5bfb1418eddd86582d8a57fcd;p=elogind.git diff --git a/src/journal/journal-file.c b/src/journal/journal-file.c index d3535d2fa..7858435ba 100644 --- a/src/journal/journal-file.c +++ b/src/journal/journal-file.c @@ -136,7 +136,7 @@ void journal_file_close(JournalFile *f) { if (f->mmap) mmap_cache_unref(f->mmap); - hashmap_free_free(f->chain_cache); + ordered_hashmap_free_free(f->chain_cache); #if defined(HAVE_XZ) || defined(HAVE_LZ4) free(f->compress_buffer); @@ -279,12 +279,6 @@ static int journal_file_verify_header(JournalFile *f) { !VALID64(le64toh(f->header->entry_array_offset))) return -ENODATA; - if (le64toh(f->header->data_hash_table_offset) < le64toh(f->header->header_size) || - le64toh(f->header->field_hash_table_offset) < le64toh(f->header->header_size) || - le64toh(f->header->tail_object_offset) < le64toh(f->header->header_size) || - le64toh(f->header->entry_array_offset) < le64toh(f->header->header_size)) - return -ENODATA; - if (f->writable) { uint8_t state; sd_id128_t machine_id; @@ -397,7 +391,7 @@ static int journal_file_move_to(JournalFile *f, int context, bool keep_always, u return -EADDRNOTAVAIL; } - return mmap_cache_get(f->mmap, f->fd, f->prot, context, keep_always, offset, size, &f->last_stat, ret); + return mmap_cache_get(f->mmap, f->fd, f->prot, context, keep_always, offset, size, &f->last_stat, ret, NULL); } static uint64_t minimum_header_size(Object *o) { @@ -431,7 +425,6 @@ int journal_file_move_to_object(JournalFile *f, int type, uint64_t offset, Objec if (!VALID64(offset)) return -EFAULT; - r = journal_file_move_to(f, type_to_context(type), false, offset, sizeof(ObjectHeader), &t); if (r < 0) return r; @@ -819,7 +812,9 @@ int journal_file_find_data_object_with_hash( goto next; if (o->object.flags & OBJECT_COMPRESSION_MASK) { - uint64_t l, rsize; +#if defined(HAVE_XZ) || defined(HAVE_LZ4) + uint64_t l; + size_t rsize; l = le64toh(o->object.size); if (l <= offsetof(Object, data.payload)) @@ -843,7 +838,9 @@ int journal_file_find_data_object_with_hash( return 1; } - +#else + return -EPROTONOSUPPORT; +#endif } else if (le64toh(o->object.size) == osize && memcmp(o->data.payload, data, size) == 0) { @@ -982,7 +979,7 @@ static int journal_file_append_data( #if defined(HAVE_XZ) || defined(HAVE_LZ4) if (f->compress_xz && size >= COMPRESSION_SIZE_THRESHOLD) { - uint64_t rsize; + size_t rsize; compression = compress_blob(data, size, o->data.payload, &rsize); @@ -990,7 +987,7 @@ static int journal_file_append_data( o->object.size = htole64(offsetof(Object, data.payload) + rsize); o->object.flags |= compression; - log_debug("Compressed data object %"PRIu64" -> %"PRIu64" using %s", + log_debug("Compressed data object %"PRIu64" -> %zu using %s", size, rsize, object_compressed_to_string(compression)); } } @@ -1295,7 +1292,7 @@ void journal_file_post_change(JournalFile *f) { __sync_synchronize(); if (ftruncate(f->fd, f->last_stat.st_size) < 0) - log_error("Failed to truncate file to its own size: %m"); + log_error_errno(errno, "Failed to truncate file to its own size: %m"); } static int entry_item_cmp(const void *_a, const void *_b) { @@ -1369,7 +1366,7 @@ typedef struct ChainCacheItem { } ChainCacheItem; static void chain_cache_put( - Hashmap *h, + OrderedHashmap *h, ChainCacheItem *ci, uint64_t first, uint64_t array, @@ -1383,9 +1380,10 @@ static void chain_cache_put( if (array == first) return; - if (hashmap_size(h) >= CHAIN_CACHE_MAX) - ci = hashmap_steal_first(h); - else { + if (ordered_hashmap_size(h) >= CHAIN_CACHE_MAX) { + ci = ordered_hashmap_steal_first(h); + assert(ci); + } else { ci = new(ChainCacheItem, 1); if (!ci) return; @@ -1393,7 +1391,7 @@ static void chain_cache_put( ci->first = first; - if (hashmap_put(h, &ci->first, ci) < 0) { + if (ordered_hashmap_put(h, &ci->first, ci) < 0) { free(ci); return; } @@ -1422,7 +1420,7 @@ static int generic_array_get( a = first; /* Try the chain cache first */ - ci = hashmap_get(f->chain_cache, &first); + ci = ordered_hashmap_get(f->chain_cache, &first); if (ci && i > ci->total) { a = ci->array; i -= ci->total; @@ -1525,7 +1523,7 @@ static int generic_array_bisect( /* Start with the first array in the chain */ a = first; - ci = hashmap_get(f->chain_cache, &first); + ci = ordered_hashmap_get(f->chain_cache, &first); if (ci && n > ci->total) { /* Ah, we have iterated this bisection array chain * previously! Let's see if we can skip ahead in the @@ -2501,7 +2499,7 @@ int journal_file_open( goto fail; } - f->chain_cache = hashmap_new(uint64_hash_func, uint64_compare_func); + f->chain_cache = ordered_hashmap_new(&uint64_hash_ops); if (!f->chain_cache) { r = -ENOMEM; goto fail; @@ -2772,7 +2770,8 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6 return -E2BIG; if (o->object.flags & OBJECT_COMPRESSION_MASK) { - uint64_t rsize; +#if defined(HAVE_XZ) || defined(HAVE_LZ4) + size_t rsize; r = decompress_blob(o->object.flags & OBJECT_COMPRESSION_MASK, o->data.payload, l, &from->compress_buffer, &from->compress_buffer_size, &rsize, 0); @@ -2781,6 +2780,9 @@ int journal_file_copy_entry(JournalFile *from, JournalFile *to, Object *o, uint6 data = from->compress_buffer; l = rsize; +#else + return -EPROTONOSUPPORT; +#endif } else data = o->data.payload;