iCheck cache for consistency - 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 e2a7f03a6b43cf093fc814dd8610e2b73c1345a3 /scm/dedup/commit/e2a7f03a6b43cf093fc814dd8610e2b73c1345a3.gph bitreich.org 70 1parent 6d9bfc25ce2ba1ddc768c68522d05195d783472b /scm/dedup/commit/6d9bfc25ce2ba1ddc768c68522d05195d783472b.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Mon, 4 Mar 2019 14:45:41 +0000 Err bitreich.org 70 i Err bitreich.org 70 iCheck cache for consistency Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 67 ++++++++++++++++++++++++++++--- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 61 insertions(+), 6 deletions(-) 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@@ -25,6 +25,10 @@ enum { Err bitreich.org 70 i WALK_STOP Err bitreich.org 70 i }; Err bitreich.org 70 i Err bitreich.org 70 i+struct check_cache_args { Err bitreich.org 70 i+ int ret; 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@@ -346,8 +350,12 @@ extract(struct snapshot *snap, void *arg) Err bitreich.org 70 i return WALK_STOP; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * For each snapshot, hash every block and check if the hash Err bitreich.org 70 i+ * matches the one in the corresponding block descriptor. Err bitreich.org 70 i+ */ Err bitreich.org 70 i static int Err bitreich.org 70 i-check(struct snapshot *snap, void *arg) Err bitreich.org 70 i+check_snap(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i uint8_t *buf; Err bitreich.org 70 i@@ -355,10 +363,6 @@ check(struct snapshot *snap, void *arg) Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i buf = alloc_buf(compr_size(BLKSIZE_MAX)); Err bitreich.org 70 i- /* Err bitreich.org 70 i- * Calculate hash for each block and compare Err bitreich.org 70 i- * against snapshot entry block descriptor Err bitreich.org 70 i- */ Err bitreich.org 70 i for (i = 0; i < snap->nr_blk_descs; i++) { Err bitreich.org 70 i struct blk_desc *blk_desc; Err bitreich.org 70 i Err bitreich.org 70 i@@ -388,6 +392,35 @@ check(struct snapshot *snap, void *arg) Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * For each block descriptor within each snapshot, do a lookup Err bitreich.org 70 i+ * of the block descriptor hash in the cache. If the lookup fails Err bitreich.org 70 i+ * the cache is corrupted. The caller will rebuild the cache in Err bitreich.org 70 i+ * that case. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+static int Err bitreich.org 70 i+check_cache(struct snapshot *snap, void *arg) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct check_cache_args *args = arg; Err bitreich.org 70 i+ uint64_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ for (i = 0; i < snap->nr_blk_descs; i++) { Err bitreich.org 70 i+ struct blk_desc *blk_desc; Err bitreich.org 70 i+ struct cache_entry cache_entry; Err bitreich.org 70 i+ Err bitreich.org 70 i+ blk_desc = &snap->blk_desc[i]; Err bitreich.org 70 i+ memcpy(&cache_entry.md, blk_desc->md, sizeof(cache_entry.md)); Err bitreich.org 70 i+ if (lookup_cache_entry(cache, &cache_entry) < 0) { Err bitreich.org 70 i+ if (verbose) Err bitreich.org 70 i+ fprintf(stderr, "Cache is corrupted\n"); Err bitreich.org 70 i+ args->ret = -1; Err bitreich.org 70 i+ return WALK_STOP; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ } Err bitreich.org 70 i+ args->ret = 0; Err bitreich.org 70 i+ return WALK_CONTINUE; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i static int Err bitreich.org 70 i list(struct snapshot *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -703,8 +736,30 @@ main(int argc, char *argv[]) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i if (cflag) { Err bitreich.org 70 i+ struct check_cache_args args; Err bitreich.org 70 i+ Err bitreich.org 70 i+ xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i+ walk_snap(check_snap, NULL); Err bitreich.org 70 i+ Err bitreich.org 70 i xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i- walk_snap(check, NULL); Err bitreich.org 70 i+ args.ret = -1; Err bitreich.org 70 i+ walk_snap(check_cache, &args); Err bitreich.org 70 i+ if (args.ret != 0) { Err bitreich.org 70 i+ free_cache(cache); Err bitreich.org 70 i+ cache = alloc_cache(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (ftruncate(cfd, 0) < 0) Err bitreich.org 70 i+ err(1, "ftruncate"); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (verbose > 0) Err bitreich.org 70 i+ fprintf(stderr, "Rebuilding cache..."); Err bitreich.org 70 i+ xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i+ xlseek(cfd, 0, SEEK_SET); Err bitreich.org 70 i+ walk_snap(rebuild_cache, NULL); Err bitreich.org 70 i+ if (verbose > 0) Err bitreich.org 70 i+ fprintf(stderr, "done\n"); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i term(); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 .