iPut snapshot helpers to utils.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 78273e89af8024ff892a83cdb04b8b2374aa9521 /scm/dedup/commit/78273e89af8024ff892a83cdb04b8b2374aa9521.gph bitreich.org 70 1parent 94596df085ef611772b52d9d7e3ffe0e26db3fb8 /scm/dedup/commit/94596df085ef611772b52d9d7e3ffe0e26db3fb8.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 18 Apr 2019 10:35:07 +0100 Err bitreich.org 70 i Err bitreich.org 70 iPut snapshot helpers to utils.c Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dcheck.c | 66 +------------------------------ Err bitreich.org 70 i M dedup.h | 12 ++++++++++++ Err bitreich.org 70 i M dlist.c | 66 +------------------------------ Err bitreich.org 70 i M dpack.c | 115 +------------------------------ Err bitreich.org 70 i M dunpack.c | 66 +------------------------------ Err bitreich.org 70 i M utils.c | 106 ++++++++++++++++++++++++++++++ Err bitreich.org 70 i Err bitreich.org 70 i6 files changed, 124 insertions(+), 307 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/dcheck.c b/dcheck.c /scm/dedup/file/dcheck.c.gph bitreich.org 70 i@@ -17,11 +17,6 @@ Err bitreich.org 70 i #define SNAPSF ".snapshots" Err bitreich.org 70 i #define STOREF ".store" 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 static struct snap_hdr snap_hdr; Err bitreich.org 70 i static struct blk_hdr blk_hdr; Err bitreich.org 70 i static int ifd; Err bitreich.org 70 i@@ -41,42 +36,6 @@ print_md(FILE *fp, uint8_t *md, size_t size) Err bitreich.org 70 i fprintf(fp, "%02x", md[i]); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-alloc_snap(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = calloc(1, sizeof(*snap)); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-free_snap(struct snap *snap) Err bitreich.org 70 i-{ Err bitreich.org 70 i- free(snap); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-grow_snap(struct snap *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i-{ Err bitreich.org 70 i- size_t size; Err bitreich.org 70 i- Err bitreich.org 70 i- if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0])) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i- Err bitreich.org 70 i- if (size > SIZE_MAX - sizeof(*snap)) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size += sizeof(*snap); Err bitreich.org 70 i- Err bitreich.org 70 i- snap = realloc(snap, size); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static uint8_t * Err bitreich.org 70 i alloc_buf(size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -169,29 +128,6 @@ check_snap(struct snap *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-/* Walk through all snapshots and call fn() on each one */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-walk_snap(int (*fn)(struct snap *, 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- xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < snap_hdr.nr_snaps; i++) { Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- int ret; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = alloc_snap(); Err bitreich.org 70 i- read_snap(ifd, snap); Err bitreich.org 70 i- snap = grow_snap(snap, snap->nr_blk_descs); Err bitreich.org 70 i- read_snap_descs(ifd, snap); Err bitreich.org 70 i- Err bitreich.org 70 i- ret = (*fn)(snap, arg); Err bitreich.org 70 i- free_snap(snap); Err bitreich.org 70 i- if (ret == WALK_STOP) Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i init(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -257,7 +193,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i Err bitreich.org 70 i init(); Err bitreich.org 70 i ret = 0; Err bitreich.org 70 i- walk_snap(check_snap, &ret); Err bitreich.org 70 i+ walk_snap(ifd, &snap_hdr, check_snap, &ret); Err bitreich.org 70 i if (ret != 0) Err bitreich.org 70 i errx(1, "%s or %s is corrupted", SNAPSF, STOREF); Err bitreich.org 70 i term(); Err bitreich.org 70 1diff --git a/dedup.h b/dedup.h /scm/dedup/file/dedup.h.gph bitreich.org 70 i@@ -29,6 +29,11 @@ Err bitreich.org 70 i #define COMPR_ALGO_SHIFT 16 Err bitreich.org 70 i #define COMPR_ALGO_MASK 0x7 /* max 8 compression algos */ 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 enum compr_algo { Err bitreich.org 70 i COMPR_NONE, Err bitreich.org 70 i COMPR_LZ4, Err bitreich.org 70 i@@ -210,3 +215,10 @@ void init_blk_hdr(struct blk_hdr *hdr, int compr_algo, int hash_algo); Err bitreich.org 70 i void init_snap_hdr(struct snap_hdr *hdr); Err bitreich.org 70 i void load_blk_hdr(int fd, struct blk_hdr *hdr, int *compr_algo, int *hash_algo); Err bitreich.org 70 i void load_snap_hdr(int fd, struct snap_hdr *hdr); Err bitreich.org 70 i+struct snap *alloc_snap(void); Err bitreich.org 70 i+void free_snap(struct snap *snap); Err bitreich.org 70 i+struct snap *grow_snap(struct snap *snap, uint64_t nr_blk_descs); Err bitreich.org 70 i+void append_snap(int fd, struct snap_hdr *hdr, struct snap *snap); Err bitreich.org 70 i+void hash_snap(struct snap *snap, uint8_t *md, int hash_algo); Err bitreich.org 70 i+void walk_snap(int fd, struct snap_hdr *hdr, Err bitreich.org 70 i+ int (*fn)(struct snap *, void *), void *arg); Err bitreich.org 70 1diff --git a/dlist.c b/dlist.c /scm/dedup/file/dlist.c.gph bitreich.org 70 i@@ -17,11 +17,6 @@ Err bitreich.org 70 i #define SNAPSF ".snapshots" Err bitreich.org 70 i #define STOREF ".store" 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 static struct snap_hdr snap_hdr; Err bitreich.org 70 i static struct blk_hdr blk_hdr; Err bitreich.org 70 i static int ifd; Err bitreich.org 70 i@@ -41,42 +36,6 @@ print_md(FILE *fp, uint8_t *md, size_t size) Err bitreich.org 70 i fprintf(fp, "%02x", md[i]); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-alloc_snap(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = calloc(1, sizeof(*snap)); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-free_snap(struct snap *snap) Err bitreich.org 70 i-{ Err bitreich.org 70 i- free(snap); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-grow_snap(struct snap *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i-{ Err bitreich.org 70 i- size_t size; Err bitreich.org 70 i- Err bitreich.org 70 i- if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0])) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i- Err bitreich.org 70 i- if (size > SIZE_MAX - sizeof(*snap)) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size += sizeof(*snap); Err bitreich.org 70 i- Err bitreich.org 70 i- snap = realloc(snap, size); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static int Err bitreich.org 70 i list(struct snap *snap, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -88,29 +47,6 @@ list(struct snap *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-/* Walk through all snapshots and call fn() on each one */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-walk_snap(int (*fn)(struct snap *, 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- xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < snap_hdr.nr_snaps; i++) { Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- int ret; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = alloc_snap(); Err bitreich.org 70 i- read_snap(ifd, snap); Err bitreich.org 70 i- snap = grow_snap(snap, snap->nr_blk_descs); Err bitreich.org 70 i- read_snap_descs(ifd, snap); Err bitreich.org 70 i- Err bitreich.org 70 i- ret = (*fn)(snap, arg); Err bitreich.org 70 i- free_snap(snap); Err bitreich.org 70 i- if (ret == WALK_STOP) Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i init(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -175,7 +111,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i err(1, "chdir: %s", repo); Err bitreich.org 70 i Err bitreich.org 70 i init(); Err bitreich.org 70 i- walk_snap(list, NULL); Err bitreich.org 70 i+ walk_snap(ifd, &snap_hdr, list, NULL); Err bitreich.org 70 i term(); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 1diff --git a/dpack.c b/dpack.c /scm/dedup/file/dpack.c.gph bitreich.org 70 i@@ -17,11 +17,6 @@ Err bitreich.org 70 i #define SNAPSF ".snapshots" Err bitreich.org 70 i #define STOREF ".store" 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 static struct snap_hdr snap_hdr; Err bitreich.org 70 i static struct blk_hdr blk_hdr; Err bitreich.org 70 i static struct icache *icache; Err bitreich.org 70 i@@ -33,87 +28,6 @@ static int compr_algo = COMPR_LZ4; Err bitreich.org 70 i int verbose; Err bitreich.org 70 i char *argv0; Err bitreich.org 70 i Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-alloc_snap(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = calloc(1, sizeof(*snap)); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-free_snap(struct snap *snap) Err bitreich.org 70 i-{ Err bitreich.org 70 i- free(snap); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-/* Err bitreich.org 70 i- * The snapshot hash is calculated over the Err bitreich.org 70 i- * hash of its block descriptors. Err bitreich.org 70 i- */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-hash_snap(struct snap *snap, uint8_t *md) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct hash_ctx ctx; Err bitreich.org 70 i- uint64_t i; Err bitreich.org 70 i- Err bitreich.org 70 i- if (hash_init(&ctx, hash_algo, MD_SIZE) < 0) Err bitreich.org 70 i- errx(1, "hash_init failed"); 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- blk_desc = &snap->blk_desc[i]; Err bitreich.org 70 i- hash_update(&ctx, blk_desc->md, sizeof(blk_desc->md)); Err bitreich.org 70 i- } Err bitreich.org 70 i- hash_final(&ctx, md, MD_SIZE); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-grow_snap(struct snap *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i-{ Err bitreich.org 70 i- size_t size; Err bitreich.org 70 i- Err bitreich.org 70 i- if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0])) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i- Err bitreich.org 70 i- if (size > SIZE_MAX - sizeof(*snap)) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size += sizeof(*snap); Err bitreich.org 70 i- Err bitreich.org 70 i- snap = realloc(snap, size); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; 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 snap *snap) Err bitreich.org 70 i-{ Err bitreich.org 70 i- if (snap->nr_blk_descs > UINT64_MAX / BLK_DESC_SIZE) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- snap->size = snap->nr_blk_descs * BLK_DESC_SIZE; Err bitreich.org 70 i- Err bitreich.org 70 i- if (snap->size > UINT64_MAX - SNAPSHOT_SIZE) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- snap->size += SNAPSHOT_SIZE; Err bitreich.org 70 i- Err bitreich.org 70 i- xlseek(ifd, snap_hdr.size, SEEK_SET); Err bitreich.org 70 i- write_snap(ifd, snap); Err bitreich.org 70 i- write_snap_blk_descs(ifd, snap); Err bitreich.org 70 i- Err bitreich.org 70 i- if (snap_hdr.size > UINT64_MAX - snap->size) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- snap_hdr.size += snap->size; Err bitreich.org 70 i- Err bitreich.org 70 i- if (snap_hdr.nr_snaps > UINT64_MAX - 1) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- snap_hdr.nr_snaps++; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static uint8_t * Err bitreich.org 70 i alloc_buf(size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -222,8 +136,8 @@ dedup(int fd, char *msg) Err bitreich.org 70 i memcpy(snap->msg, msg, size); Err bitreich.org 70 i snap->msg[size - 1] = '\0'; Err bitreich.org 70 i } Err bitreich.org 70 i- hash_snap(snap, snap->md); Err bitreich.org 70 i- append_snap(snap); Err bitreich.org 70 i+ hash_snap(snap, snap->md, hash_algo); Err bitreich.org 70 i+ append_snap(ifd, &snap_hdr, snap); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i free_chunker(chunker); Err bitreich.org 70 i@@ -251,29 +165,6 @@ build_icache(struct snap *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-/* Walk through all snapshots and call fn() on each one */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-walk_snap(int (*fn)(struct snap *, 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- xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < snap_hdr.nr_snaps; i++) { Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- int ret; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = alloc_snap(); Err bitreich.org 70 i- read_snap(ifd, snap); Err bitreich.org 70 i- snap = grow_snap(snap, snap->nr_blk_descs); Err bitreich.org 70 i- read_snap_descs(ifd, snap); Err bitreich.org 70 i- Err bitreich.org 70 i- ret = (*fn)(snap, arg); Err bitreich.org 70 i- free_snap(snap); Err bitreich.org 70 i- if (ret == WALK_STOP) Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i init(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -296,7 +187,7 @@ init(void) Err bitreich.org 70 i load_blk_hdr(sfd, &blk_hdr, &compr_algo, &hash_algo); Err bitreich.org 70 i Err bitreich.org 70 i icache = alloc_icache(); Err bitreich.org 70 i- walk_snap(build_icache, NULL); Err bitreich.org 70 i+ walk_snap(ifd, &snap_hdr, build_icache, NULL); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static void Err bitreich.org 70 1diff --git a/dunpack.c b/dunpack.c /scm/dedup/file/dunpack.c.gph bitreich.org 70 i@@ -17,11 +17,6 @@ Err bitreich.org 70 i #define SNAPSF ".snapshots" Err bitreich.org 70 i #define STOREF ".store" 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 extract_args { Err bitreich.org 70 i uint8_t *md; Err bitreich.org 70 i int fd; Err bitreich.org 70 i@@ -38,42 +33,6 @@ static int compr_algo = COMPR_LZ4; Err bitreich.org 70 i int verbose; Err bitreich.org 70 i char *argv0; Err bitreich.org 70 i Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-alloc_snap(void) Err bitreich.org 70 i-{ Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = calloc(1, sizeof(*snap)); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static void Err bitreich.org 70 i-free_snap(struct snap *snap) Err bitreich.org 70 i-{ Err bitreich.org 70 i- free(snap); Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i-static struct snap * Err bitreich.org 70 i-grow_snap(struct snap *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i-{ Err bitreich.org 70 i- size_t size; Err bitreich.org 70 i- Err bitreich.org 70 i- if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0])) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i- Err bitreich.org 70 i- if (size > SIZE_MAX - sizeof(*snap)) Err bitreich.org 70 i- errx(1, "%s: overflow", __func__); Err bitreich.org 70 i- size += sizeof(*snap); Err bitreich.org 70 i- Err bitreich.org 70 i- snap = realloc(snap, size); Err bitreich.org 70 i- if (snap == NULL) Err bitreich.org 70 i- err(1, "%s", __func__); Err bitreich.org 70 i- return snap; Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static uint8_t * Err bitreich.org 70 i alloc_buf(size_t size) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -135,29 +94,6 @@ extract(struct snap *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-/* Walk through all snapshots and call fn() on each one */ Err bitreich.org 70 i-static void Err bitreich.org 70 i-walk_snap(int (*fn)(struct snap *, 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- xlseek(ifd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i- for (i = 0; i < snap_hdr.nr_snaps; i++) { Err bitreich.org 70 i- struct snap *snap; Err bitreich.org 70 i- int ret; Err bitreich.org 70 i- Err bitreich.org 70 i- snap = alloc_snap(); Err bitreich.org 70 i- read_snap(ifd, snap); Err bitreich.org 70 i- snap = grow_snap(snap, snap->nr_blk_descs); Err bitreich.org 70 i- read_snap_descs(ifd, snap); Err bitreich.org 70 i- Err bitreich.org 70 i- ret = (*fn)(snap, arg); Err bitreich.org 70 i- free_snap(snap); Err bitreich.org 70 i- if (ret == WALK_STOP) Err bitreich.org 70 i- break; Err bitreich.org 70 i- } Err bitreich.org 70 i-} Err bitreich.org 70 i- Err bitreich.org 70 i static void Err bitreich.org 70 i init(void) Err bitreich.org 70 i { Err bitreich.org 70 i@@ -229,7 +165,7 @@ main(int argc, char *argv[]) Err bitreich.org 70 i args.md = md; Err bitreich.org 70 i args.fd = STDOUT_FILENO; Err bitreich.org 70 i args.ret = -1; Err bitreich.org 70 i- walk_snap(extract, &args); Err bitreich.org 70 i+ walk_snap(ifd, &snap_hdr, extract, &args); Err bitreich.org 70 i if (args.ret != 0) Err bitreich.org 70 i errx(1, "unknown snapshot: %s", id); Err bitreich.org 70 i term(); Err bitreich.org 70 1diff --git a/utils.c b/utils.c /scm/dedup/file/utils.c.gph bitreich.org 70 i@@ -3,6 +3,7 @@ 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 #include Err bitreich.org 70 i Err bitreich.org 70 i@@ -128,3 +129,108 @@ load_snap_hdr(int fd, struct snap_hdr *hdr) Err bitreich.org 70 i read_snap_hdr(fd, hdr); Err bitreich.org 70 i match_ver(hdr->flags); Err bitreich.org 70 i } Err bitreich.org 70 i+ Err bitreich.org 70 i+struct snap * Err bitreich.org 70 i+alloc_snap(void) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct snap *snap; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snap = calloc(1, sizeof(*snap)); Err bitreich.org 70 i+ if (snap == NULL) Err bitreich.org 70 i+ err(1, "%s", __func__); Err bitreich.org 70 i+ return snap; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+free_snap(struct snap *snap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ free(snap); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+struct snap * Err bitreich.org 70 i+grow_snap(struct snap *snap, uint64_t nr_blk_descs) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ size_t size; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (nr_blk_descs > SIZE_MAX / sizeof(snap->blk_desc[0])) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i+ size = nr_blk_descs * sizeof(snap->blk_desc[0]); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (size > SIZE_MAX - sizeof(*snap)) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i+ size += sizeof(*snap); Err bitreich.org 70 i+ Err bitreich.org 70 i+ snap = realloc(snap, size); Err bitreich.org 70 i+ if (snap == NULL) Err bitreich.org 70 i+ err(1, "%s", __func__); Err bitreich.org 70 i+ return snap; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+void Err bitreich.org 70 i+append_snap(int fd, struct snap_hdr *hdr, struct snap *snap) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ if (snap->nr_blk_descs > UINT64_MAX / BLK_DESC_SIZE) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i+ snap->size = snap->nr_blk_descs * BLK_DESC_SIZE; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (snap->size > UINT64_MAX - SNAPSHOT_SIZE) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i+ snap->size += SNAPSHOT_SIZE; Err bitreich.org 70 i+ Err bitreich.org 70 i+ xlseek(fd, hdr->size, SEEK_SET); Err bitreich.org 70 i+ write_snap(fd, snap); Err bitreich.org 70 i+ write_snap_blk_descs(fd, snap); Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (hdr->size > UINT64_MAX - snap->size) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i+ hdr->size += snap->size; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (hdr->nr_snaps > UINT64_MAX - 1) Err bitreich.org 70 i+ errx(1, "%s: overflow", __func__); Err bitreich.org 70 i+ hdr->nr_snaps++; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+/* Err bitreich.org 70 i+ * The snapshot hash is calculated over the Err bitreich.org 70 i+ * hash of its block descriptors. Err bitreich.org 70 i+ */ Err bitreich.org 70 i+void Err bitreich.org 70 i+hash_snap(struct snap *snap, uint8_t *md, int hash_algo) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct hash_ctx ctx; Err bitreich.org 70 i+ uint64_t i; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (hash_init(&ctx, hash_algo, MD_SIZE) < 0) Err bitreich.org 70 i+ errx(1, "hash_init failed"); 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+ blk_desc = &snap->blk_desc[i]; Err bitreich.org 70 i+ hash_update(&ctx, blk_desc->md, sizeof(blk_desc->md)); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ hash_final(&ctx, md, MD_SIZE); Err bitreich.org 70 i+} 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+void Err bitreich.org 70 i+walk_snap(int fd, struct snap_hdr *hdr, Err bitreich.org 70 i+ int (*fn)(struct snap *, 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+ xlseek(fd, SNAP_HDR_SIZE, SEEK_SET); Err bitreich.org 70 i+ for (i = 0; i < hdr->nr_snaps; i++) { Err bitreich.org 70 i+ struct snap *snap; Err bitreich.org 70 i+ int ret; Err bitreich.org 70 i+ Err bitreich.org 70 i+ snap = alloc_snap(); Err bitreich.org 70 i+ read_snap(fd, snap); Err bitreich.org 70 i+ snap = grow_snap(snap, snap->nr_blk_descs); Err bitreich.org 70 i+ read_snap_descs(fd, snap); Err bitreich.org 70 i+ Err bitreich.org 70 i+ ret = (*fn)(snap, arg); Err bitreich.org 70 i+ free_snap(snap); Err bitreich.org 70 i+ if (ret == WALK_STOP) Err bitreich.org 70 i+ break; Err bitreich.org 70 i+ } Err bitreich.org 70 i+} Err bitreich.org 70 .