iMove rbtree cache to cache.c - dedup - deduplicating backup program Err bitreich.org 70 hgit clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ URL:git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/ bitreich.org 70 1Log /scm/dedup/log.gph bitreich.org 70 1Files /scm/dedup/files.gph bitreich.org 70 1Refs /scm/dedup/refs.gph bitreich.org 70 1Tags /scm/dedup/tag bitreich.org 70 1README /scm/dedup/file/README.gph bitreich.org 70 1LICENSE /scm/dedup/file/LICENSE.gph bitreich.org 70 i--- Err bitreich.org 70 1commit 9adb9c6c1a308e2845d822987948afbf12fc943b /scm/dedup/commit/9adb9c6c1a308e2845d822987948afbf12fc943b.gph bitreich.org 70 1parent 19420eb96fb72d9d5f7940678d1b957aa26f1fce /scm/dedup/commit/19420eb96fb72d9d5f7940678d1b957aa26f1fce.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Fri, 22 Feb 2019 23:24:03 +0000 Err bitreich.org 70 i Err bitreich.org 70 iMove rbtree cache to cache.c Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M Makefile | 5 +++-- Err bitreich.org 70 i A cache.c | 94 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M dedup.c | 222 +++++++++---------------------- Err bitreich.org 70 i M dedup.h | 7 +++++++ Err bitreich.org 70 i A types.h | 44 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 210 insertions(+), 162 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/Makefile b/Makefile /scm/dedup/file/Makefile.gph bitreich.org 70 i@@ -2,8 +2,8 @@ VERSION = 0.4 Err bitreich.org 70 i PREFIX = /usr/local Err bitreich.org 70 i MANPREFIX = $(PREFIX)/man Err bitreich.org 70 i BIN = dedup Err bitreich.org 70 i-SRC = $(BIN).c chunker.c hash.c pack.c unpack.c utils.c Err bitreich.org 70 i-OBJ = $(BIN).o chunker.o hash.o pack.o unpack.o utils.o Err bitreich.org 70 i+SRC = $(BIN).c cache.c chunker.c hash.c pack.c unpack.c utils.c Err bitreich.org 70 i+OBJ = $(BIN).o cache.o chunker.o hash.o pack.o unpack.o utils.o Err bitreich.org 70 i DISTFILES = \ Err bitreich.org 70 i $(SRC) \ Err bitreich.org 70 i LICENSE \ Err bitreich.org 70 i@@ -14,6 +14,7 @@ DISTFILES = \ Err bitreich.org 70 i $(BIN).1 \ Err bitreich.org 70 i dedup.h \ Err bitreich.org 70 i tree.h \ Err bitreich.org 70 i+ types.h \ Err bitreich.org 70 i Err bitreich.org 70 i CFLAGS = -g -Wall Err bitreich.org 70 i CPPFLAGS = -I/usr/local/include -D_FILE_OFFSET_BITS=64 Err bitreich.org 70 1diff --git a/cache.c b/cache.c /scm/dedup/file/cache.c.gph bitreich.org 70 i@@ -0,0 +1,94 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+#include Err bitreich.org 70 i+ Err bitreich.org 70 i+#include "dedup.h" Err bitreich.org 70 i+#include "tree.h" Err bitreich.org 70 i+ Err bitreich.org 70 i+struct cache_node { Err bitreich.org 70 i+ struct cache_entry ent; Err bitreich.org 70 i+ RB_ENTRY(cache_node) e; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+static RB_HEAD(cache, cache_node) cache_head; Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i+cache_node_cmp(struct cache_node *e1, struct cache_node *e2) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ int r; Err bitreich.org 70 i+ Err bitreich.org 70 i+ r = memcmp(e1->ent.md, e2->ent.md, sizeof(e1->ent.md)); Err bitreich.org 70 i+ if (r > 0) Err bitreich.org 70 i+ return 1; Err bitreich.org 70 i+ else if (r < 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+static RB_PROTOTYPE(cache, cache_node, e, cache_node_cmp); Err bitreich.org 70 i+static RB_GENERATE(cache, cache_node, e, cache_node_cmp); Err bitreich.org 70 i+ Err bitreich.org 70 i+static struct cache_node * Err bitreich.org 70 i+alloc_cache_node(struct cache_entry *ent) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct cache_node *node; Err bitreich.org 70 i+ Err bitreich.org 70 i+ node = calloc(1, sizeof(*node)); Err bitreich.org 70 i+ if (node == NULL) Err bitreich.org 70 i+ err(1, "calloc"); Err bitreich.org 70 i+ node->ent = *ent; Err bitreich.org 70 i+ return node; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static void Err bitreich.org 70 i+free_cache_node(struct cache_node *node) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ free(node); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+add_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct cache_node *node; Err bitreich.org 70 i+ Err bitreich.org 70 i+ node = alloc_cache_node(ent); Err bitreich.org 70 i+ RB_INSERT(cache, &cache_head, node); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i+lookup_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct cache_node *node, key; Err bitreich.org 70 i+ Err bitreich.org 70 i+ key.ent = *ent; Err bitreich.org 70 i+ node = RB_FIND(cache, &cache_head, &key); Err bitreich.org 70 i+ if (node != NULL) { Err bitreich.org 70 i+ *ent = node->ent; Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+walk_cache(int (*fn)(struct cache_entry *)) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct cache_node *node; Err bitreich.org 70 i+ Err bitreich.org 70 i+ RB_FOREACH(node, cache, &cache_head) Err bitreich.org 70 i+ (*fn)(&node->ent); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+free_cache(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct cache_node *node, *tmp; Err bitreich.org 70 i+ Err bitreich.org 70 i+ RB_FOREACH_SAFE(node, cache, &cache_head, tmp) { Err bitreich.org 70 i+ RB_REMOVE(cache, &cache_head, node); Err bitreich.org 70 i+ free_cache_node(node); Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 1diff --git a/dedup.c b/dedup.c /scm/dedup/file/dedup.c.gph bitreich.org 70 i@@ -1,3 +1,4 @@ Err bitreich.org 70 i+#include Err bitreich.org 70 i #include Err bitreich.org 70 i #include Err bitreich.org 70 i Err bitreich.org 70 i@@ -14,67 +15,21 @@ Err bitreich.org 70 i Err bitreich.org 70 i #include "arg.h" Err bitreich.org 70 i #include "dedup.h" Err bitreich.org 70 i-#include "tree.h" Err bitreich.org 70 i Err bitreich.org 70 i #define SNAPSF ".snapshots" Err bitreich.org 70 i #define STOREF ".store" Err bitreich.org 70 i #define CACHEF ".cache" Err bitreich.org 70 i Err bitreich.org 70 i-#define MSGSIZE 256 Err bitreich.org 70 i-#define MDSIZE SHA256_DIGEST_LENGTH Err bitreich.org 70 i- Err bitreich.org 70 i-/* file format version */ Err bitreich.org 70 i-#define VER_MIN 1 Err bitreich.org 70 i-#define VER_MAJ 0 Err bitreich.org 70 i- Err bitreich.org 70 i enum { Err bitreich.org 70 i WALK_CONTINUE, Err bitreich.org 70 i WALK_STOP Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-struct stats { Err bitreich.org 70 i- uint64_t orig_size; Err bitreich.org 70 i- uint64_t comp_size; Err bitreich.org 70 i- uint64_t dedup_size; Err bitreich.org 70 i- uint64_t min_blk_size; Err bitreich.org 70 i- uint64_t max_blk_size; Err bitreich.org 70 i- uint64_t nr_blks; Err bitreich.org 70 i- uint64_t reserved[6]; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-struct snapshot_hdr { Err bitreich.org 70 i- uint64_t flags; Err bitreich.org 70 i- uint64_t nr_snapshots; Err bitreich.org 70 i- uint64_t store_size; Err bitreich.org 70 i- uint64_t reserved[4]; Err bitreich.org 70 i- struct stats st; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-struct blk_desc { Err bitreich.org 70 i- uint8_t md[MDSIZE]; Err bitreich.org 70 i- uint64_t offset; Err bitreich.org 70 i- uint64_t size; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-struct snapshot { Err bitreich.org 70 i- uint64_t size; Err bitreich.org 70 i- uint8_t msg[MSGSIZE]; Err bitreich.org 70 i- uint8_t md[MDSIZE]; /* hash of file */ Err bitreich.org 70 i- uint64_t nr_blk_descs; Err bitreich.org 70 i- struct blk_desc blk_desc[]; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i-struct cache_entry { Err bitreich.org 70 i- struct blk_desc blk_desc; Err bitreich.org 70 i- RB_ENTRY(cache_entry) e; Err bitreich.org 70 i-}; Err bitreich.org 70 i- Err bitreich.org 70 i struct extract_args { Err bitreich.org 70 i uint8_t *md; Err bitreich.org 70 i int fd; Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i-static RB_HEAD(cache, cache_entry) cache_head; Err bitreich.org 70 i static struct snapshot_hdr snaphdr; Err bitreich.org 70 i static int ifd; Err bitreich.org 70 i static int sfd; Err bitreich.org 70 i@@ -144,78 +99,6 @@ print_stats(struct stats *st) Err bitreich.org 70 i fprintf(stderr, "cache misses: %llu\n", cache_misses); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static int Err bitreich.org 70 i-cache_entry_cmp(struct cache_entry *e1, struct cache_entry *e2) Err bitreich.org 70 i-{ Err bitreich.org 70 i- int r; Err bitreich.org 70 i- Err bitreich.org 70 i- r = memcmp(e1->blk_desc.md, e2->blk_desc.md, sizeof(e1->blk_desc.md)); Err bitreich.org 70 i- if (r > 0) Err bitreich.org 70 i- return 1; Err bitreich.org 70 i- else if (r < 0) Err bitreich.org 70 i- return -1; Err bitreich.org 70 i- return 0; Err bitreich.org 70 i-} Err bitreich.org 70 i-static RB_PROTOTYPE(cache, cache_entry, e, cache_entry_cmp); Err bitreich.org 70 i-static RB_GENERATE(cache, cache_entry, e, cache_entry_cmp); Err bitreich.org 70 i- Err bitreich.org 70 i-static struct cache_entry * Err bitreich.org 70 i-alloc_cache_entry(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct cache_entry *ent; Err bitreich.org 70 i- Err bitreich.org 70 i- ent = calloc(1, sizeof(*ent)); Err bitreich.org 70 i- if (ent == NULL) Err bitreich.org 70 i- err(1, "calloc"); Err bitreich.org 70 i- return ent; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-free_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i-{ Err bitreich.org 70 i- free(ent); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-add_cache_entry(struct cache_entry *ent) Err bitreich.org 70 i-{ Err bitreich.org 70 i- RB_INSERT(cache, &cache_head, ent); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-flush_cache(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct cache_entry *ent; Err bitreich.org 70 i- Err bitreich.org 70 i- if (!cache_dirty) Err bitreich.org 70 i- return; Err bitreich.org 70 i- Err bitreich.org 70 i- xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i- RB_FOREACH(ent, cache, &cache_head) Err bitreich.org 70 i- xwrite(cfd, &ent->blk_desc, sizeof(ent->blk_desc)); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-free_cache(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct cache_entry *ent, *tmp; Err bitreich.org 70 i- Err bitreich.org 70 i- RB_FOREACH_SAFE(ent, cache, &cache_head, tmp) { Err bitreich.org 70 i- RB_REMOVE(cache, &cache_head, ent); Err bitreich.org 70 i- free_cache_entry(ent); Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static uint64_t Err bitreich.org 70 i-cache_nr_entries(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct stat sb; Err bitreich.org 70 i- Err bitreich.org 70 i- if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i- err(1, "fstat"); Err bitreich.org 70 i- return sb.st_size / sizeof(struct blk_desc); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i append_snap(struct snapshot *snap) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -304,26 +187,12 @@ append_blk(uint8_t *buf, struct blk_desc *blk_desc) Err bitreich.org 70 i snaphdr.store_size += blk_desc->size; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static int Err bitreich.org 70 i-lookup_blk_desc(uint8_t *md, struct blk_desc *blk_desc) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct cache_entry *ent, key; Err bitreich.org 70 i- Err bitreich.org 70 i- memcpy(key.blk_desc.md, md, sizeof(key.blk_desc.md)); Err bitreich.org 70 i- ent = RB_FIND(cache, &cache_head, &key); Err bitreich.org 70 i- if (ent != NULL) { Err bitreich.org 70 i- *blk_desc = ent->blk_desc; Err bitreich.org 70 i- return 0; Err bitreich.org 70 i- } Err bitreich.org 70 i- return -1; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i dedup_chunk(struct snapshot *snap, uint8_t *chunkp, size_t chunk_size) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i+ struct cache_entry cache_entry; Err bitreich.org 70 i uint8_t *comp_buf; Err bitreich.org 70 i- struct blk_desc blk_desc; Err bitreich.org 70 i size_t n; Err bitreich.org 70 i Err bitreich.org 70 i comp_buf = alloc_buf(comp_size(BLKSIZE_MAX)); Err bitreich.org 70 i@@ -334,21 +203,21 @@ dedup_chunk(struct snapshot *snap, uint8_t *chunkp, size_t chunk_size) Err bitreich.org 70 i snaphdr.st.orig_size += chunk_size; Err bitreich.org 70 i snaphdr.st.comp_size += n; Err bitreich.org 70 i Err bitreich.org 70 i- if (lookup_blk_desc(md, &blk_desc) < 0) { Err bitreich.org 70 i- struct cache_entry *ent; Err bitreich.org 70 i+ memcpy(cache_entry.md, md, sizeof(cache_entry.md)); Err bitreich.org 70 i+ if (lookup_cache_entry(&cache_entry) < 0) { Err bitreich.org 70 i+ struct blk_desc blk_desc; Err bitreich.org 70 i Err bitreich.org 70 i- memcpy(blk_desc.md, md, sizeof(blk_desc.md)); Err bitreich.org 70 i+ memcpy(&blk_desc.md, md, sizeof(blk_desc.md)); Err bitreich.org 70 i blk_desc.offset = snaphdr.store_size; Err bitreich.org 70 i blk_desc.size = n; Err bitreich.org 70 i Err bitreich.org 70 i snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i- Err bitreich.org 70 i append_blk(comp_buf, &blk_desc); Err bitreich.org 70 i Err bitreich.org 70 i- ent = alloc_cache_entry(); Err bitreich.org 70 i- ent->blk_desc = blk_desc; Err bitreich.org 70 i- add_cache_entry(ent); Err bitreich.org 70 i+ cache_entry.offset = blk_desc.offset; Err bitreich.org 70 i+ cache_entry.size = blk_desc.size; Err bitreich.org 70 i cache_dirty = 1; Err bitreich.org 70 i+ add_cache_entry(&cache_entry); Err bitreich.org 70 i cache_misses++; Err bitreich.org 70 i Err bitreich.org 70 i snaphdr.st.dedup_size += blk_desc.size; Err bitreich.org 70 i@@ -359,6 +228,11 @@ dedup_chunk(struct snapshot *snap, uint8_t *chunkp, size_t chunk_size) Err bitreich.org 70 i if (blk_desc.size < snaphdr.st.min_blk_size) Err bitreich.org 70 i snaphdr.st.min_blk_size = blk_desc.size; Err bitreich.org 70 i } else { Err bitreich.org 70 i+ struct blk_desc blk_desc; Err bitreich.org 70 i+ Err bitreich.org 70 i+ memcpy(&blk_desc.md, cache_entry.md, sizeof(blk_desc.md)); Err bitreich.org 70 i+ blk_desc.offset = cache_entry.offset; Err bitreich.org 70 i+ blk_desc.size = cache_entry.size; Err bitreich.org 70 i snap->blk_desc[snap->nr_blk_descs++] = blk_desc; Err bitreich.org 70 i cache_hits++; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -494,19 +368,21 @@ rebuild_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i Err bitreich.org 70 i buf = alloc_buf(comp_size(BLKSIZE_MAX)); Err bitreich.org 70 i for (i = 0; i < snap->nr_blk_descs; i++) { Err bitreich.org 70 i- struct cache_entry *ent; Err bitreich.org 70 i+ struct cache_entry cache_entry; Err bitreich.org 70 i+ struct blk_desc *blk_desc; Err bitreich.org 70 i Err bitreich.org 70 i- read_blk(buf, &snap->blk_desc[i]); Err bitreich.org 70 i+ blk_desc = &snap->blk_desc[i]; Err bitreich.org 70 i+ read_blk(buf, blk_desc); Err bitreich.org 70 i Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i- SHA256_Update(&ctx, buf, snap->blk_desc[i].size); Err bitreich.org 70 i+ SHA256_Update(&ctx, buf, blk_desc->size); Err bitreich.org 70 i SHA256_Final(md, &ctx); Err bitreich.org 70 i Err bitreich.org 70 i- ent = alloc_cache_entry(); Err bitreich.org 70 i- memcpy(ent->blk_desc.md, md, sizeof(ent->blk_desc.md)); Err bitreich.org 70 i- ent->blk_desc = snap->blk_desc[i]; Err bitreich.org 70 i- add_cache_entry(ent); Err bitreich.org 70 i+ memcpy(cache_entry.md, blk_desc->md, sizeof(cache_entry.md)); Err bitreich.org 70 i+ cache_entry.offset = blk_desc->offset; Err bitreich.org 70 i+ cache_entry.size = blk_desc->size; Err bitreich.org 70 i cache_dirty = 1; Err bitreich.org 70 i+ add_cache_entry(&cache_entry); Err bitreich.org 70 i } Err bitreich.org 70 i free(buf); Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i@@ -514,7 +390,7 @@ rebuild_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i Err bitreich.org 70 i /* Walk through all snapshots and call fn() on each one */ Err bitreich.org 70 i static void Err bitreich.org 70 i-walk(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i+walk_snap(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i@@ -539,19 +415,37 @@ walk(int (*fn)(struct snapshot *, void *), void *arg) Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+static int Err bitreich.org 70 i+flush_cache(struct cache_entry *cache_entry) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ xwrite(cfd, cache_entry, sizeof(*cache_entry)); Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static uint64_t Err bitreich.org 70 i+cache_nr_entries(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct stat sb; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (fstat(cfd, &sb) < 0) Err bitreich.org 70 i+ err(1, "fstat"); Err bitreich.org 70 i+ return sb.st_size / sizeof(struct cache_entry); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i static void Err bitreich.org 70 i-init_cache(void) Err bitreich.org 70 i+load_cache(void) Err bitreich.org 70 i { Err bitreich.org 70 i+ uint64_t nr_entries; Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < cache_nr_entries(); i++) { Err bitreich.org 70 i- struct cache_entry *ent; Err bitreich.org 70 i+ nr_entries = cache_nr_entries(); Err bitreich.org 70 i+ for (i = 0; i < nr_entries; i++) { Err bitreich.org 70 i+ struct cache_entry cache_entry; Err bitreich.org 70 i Err bitreich.org 70 i- ent = alloc_cache_entry(); Err bitreich.org 70 i- if (xread(cfd, &ent->blk_desc, sizeof(ent->blk_desc)) == 0) Err bitreich.org 70 i+ if (xread(cfd, &cache_entry, sizeof(cache_entry)) == 0) Err bitreich.org 70 i errx(1, "read: unexpected EOF"); Err bitreich.org 70 i- add_cache_entry(ent); Err bitreich.org 70 i+ add_cache_entry(&cache_entry); Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i@@ -596,9 +490,9 @@ init(void) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (cache_nr_entries() != 0) Err bitreich.org 70 i- init_cache(); Err bitreich.org 70 i+ load_cache(); Err bitreich.org 70 i else Err bitreich.org 70 i- walk(rebuild_cache, NULL); Err bitreich.org 70 i+ walk_snap(rebuild_cache, NULL); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 i@@ -606,7 +500,11 @@ term(void) Err bitreich.org 70 i { Err bitreich.org 70 i if (verbose) Err bitreich.org 70 i print_stats(&snaphdr.st); Err bitreich.org 70 i- flush_cache(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (cache_dirty) { Err bitreich.org 70 i+ xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i+ walk_cache(flush_cache); Err bitreich.org 70 i+ } Err bitreich.org 70 i free_cache(); Err bitreich.org 70 i Err bitreich.org 70 i fsync(ifd); Err bitreich.org 70 i@@ -683,20 +581,24 @@ main(int argc, char *argv[]) Err bitreich.org 70 i init(); Err bitreich.org 70 i Err bitreich.org 70 i if (cflag) { Err bitreich.org 70 i- walk(check, NULL); Err bitreich.org 70 i+ walk_snap(check, NULL); Err bitreich.org 70 i term(); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (lflag) { Err bitreich.org 70 i- walk(list, NULL); Err bitreich.org 70 i+ walk_snap(list, NULL); Err bitreich.org 70 i term(); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (id) { Err bitreich.org 70 i+ struct extract_args args; Err bitreich.org 70 i+ Err bitreich.org 70 i str2bin(id, md); Err bitreich.org 70 i- walk(extract, &(struct extract_args){ .md = md, .fd = fd }); Err bitreich.org 70 i+ args.md = md; Err bitreich.org 70 i+ args.fd = fd; Err bitreich.org 70 i+ walk_snap(extract, &args); Err bitreich.org 70 i } else { Err bitreich.org 70 i dedup(fd, msg); Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/dedup.h b/dedup.h /scm/dedup/file/dedup.h.gph bitreich.org 70 i@@ -1,7 +1,14 @@ Err bitreich.org 70 i #include "config.h" Err bitreich.org 70 i+#include "types.h" Err bitreich.org 70 i Err bitreich.org 70 i struct chunker; Err bitreich.org 70 i Err bitreich.org 70 i+/* cache.c */ Err bitreich.org 70 i+void add_cache_entry(struct cache_entry *ent); Err bitreich.org 70 i+int lookup_cache_entry(struct cache_entry *ent); Err bitreich.org 70 i+void walk_cache(int (*fn)(struct cache_entry *)); Err bitreich.org 70 i+void free_cache(void); Err bitreich.org 70 i+ Err bitreich.org 70 i /* chunker.c */ Err bitreich.org 70 i struct chunker *alloc_chunker(size_t cap, int fd); Err bitreich.org 70 i void free_chunker(struct chunker *chunker); Err bitreich.org 70 1diff --git a/types.h b/types.h /scm/dedup/file/types.h.gph bitreich.org 70 i@@ -0,0 +1,44 @@ Err bitreich.org 70 i+#define MSGSIZE 256 Err bitreich.org 70 i+#define MDSIZE 32 Err bitreich.org 70 i+ Err bitreich.org 70 i+/* snashot file format version */ Err bitreich.org 70 i+#define VER_MIN 1 Err bitreich.org 70 i+#define VER_MAJ 0 Err bitreich.org 70 i+ Err bitreich.org 70 i+struct stats { Err bitreich.org 70 i+ uint64_t orig_size; Err bitreich.org 70 i+ uint64_t comp_size; Err bitreich.org 70 i+ uint64_t dedup_size; Err bitreich.org 70 i+ uint64_t min_blk_size; Err bitreich.org 70 i+ uint64_t max_blk_size; Err bitreich.org 70 i+ uint64_t nr_blks; Err bitreich.org 70 i+ uint64_t reserved[6]; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct snapshot_hdr { Err bitreich.org 70 i+ uint64_t flags; Err bitreich.org 70 i+ uint64_t nr_snapshots; Err bitreich.org 70 i+ uint64_t store_size; Err bitreich.org 70 i+ uint64_t reserved[4]; Err bitreich.org 70 i+ struct stats st; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct blk_desc { Err bitreich.org 70 i+ uint8_t md[MDSIZE]; Err bitreich.org 70 i+ uint64_t offset; Err bitreich.org 70 i+ uint64_t size; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct snapshot { Err bitreich.org 70 i+ uint64_t size; Err bitreich.org 70 i+ uint8_t msg[MSGSIZE]; Err bitreich.org 70 i+ uint8_t md[MDSIZE]; /* hash of snapshot */ Err bitreich.org 70 i+ uint64_t nr_blk_descs; Err bitreich.org 70 i+ struct blk_desc blk_desc[]; Err bitreich.org 70 i+}; Err bitreich.org 70 i+ Err bitreich.org 70 i+struct cache_entry { Err bitreich.org 70 i+ uint8_t md[MDSIZE]; Err bitreich.org 70 i+ uint64_t offset; Err bitreich.org 70 i+ uint64_t size; Err bitreich.org 70 i+}; Err bitreich.org 70 .