iUse a "double" buffer for compression - 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 f28b07e0a5e1b3adfd9b2ac9d252b499ae763918 /scm/dedup/commit/f28b07e0a5e1b3adfd9b2ac9d252b499ae763918.gph bitreich.org 70 1parent 6d6cce9ed24f393e09afec8f45d3c2566210038d /scm/dedup/commit/6d6cce9ed24f393e09afec8f45d3c2566210038d.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Sun, 17 Feb 2019 22:03:43 +0000 Err bitreich.org 70 i Err bitreich.org 70 iUse a "double" buffer for compression Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M dedup.c | 43 ++++++++++++++++--------------- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 22 insertions(+), 21 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@@ -394,35 +394,36 @@ lookup_blk(uint8_t *md) Err bitreich.org 70 i void Err bitreich.org 70 i dedup(int fd, char *msg) Err bitreich.org 70 i { Err bitreich.org 70 i- uint8_t *buf, *cbuf; Err bitreich.org 70 i+ uint8_t *buf[2]; Err bitreich.org 70 i struct ent *ent; Err bitreich.org 70 i SHA256_CTX ctx; Err bitreich.org 70 i ssize_t n; Err bitreich.org 70 i Err bitreich.org 70 i- buf = alloc_buf(BLKSIZE); Err bitreich.org 70 i- cbuf = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i+ buf[0] = alloc_buf(BLKSIZE); Err bitreich.org 70 i+ buf[1] = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i ent = alloc_ent(); Err bitreich.org 70 i Err bitreich.org 70 i SHA256_Init(&ctx); Err bitreich.org 70 i- while ((n = xread(fd, buf, BLKSIZE)) > 0) { Err bitreich.org 70 i- uint8_t *bp = buf; Err bitreich.org 70 i+ while ((n = xread(fd, buf[0], BLKSIZE)) > 0) { Err bitreich.org 70 i+ uint8_t *inp = buf[0]; /* input buf */ Err bitreich.org 70 i+ uint8_t *outp = buf[1]; /* compressed buf */ Err bitreich.org 70 i Err bitreich.org 70 i while (n > 0) { Err bitreich.org 70 i uint8_t md[MDSIZE]; Err bitreich.org 70 i struct bdescr bdescr; Err bitreich.org 70 i size_t blksize, csize; Err bitreich.org 70 i Err bitreich.org 70 i- blksize = chunk_blk(bp, n); Err bitreich.org 70 i- csize = comp(bp, cbuf, blksize, comp_size(BLKSIZE)); Err bitreich.org 70 i+ blksize = chunk_blk(inp, n); Err bitreich.org 70 i+ csize = comp(inp, outp, blksize, comp_size(BLKSIZE)); Err bitreich.org 70 i Err bitreich.org 70 i memcpy(bdescr.md, md, sizeof(bdescr)); Err bitreich.org 70 i bdescr.offset = enthdr.store_size; Err bitreich.org 70 i bdescr.size = csize; Err bitreich.org 70 i Err bitreich.org 70 i- hash_blk(cbuf, bdescr.size, bdescr.md); Err bitreich.org 70 i+ hash_blk(outp, bdescr.size, bdescr.md); Err bitreich.org 70 i Err bitreich.org 70 i /* Calculate file hash one block at a time */ Err bitreich.org 70 i- SHA256_Update(&ctx, cbuf, bdescr.size); Err bitreich.org 70 i+ SHA256_Update(&ctx, outp, bdescr.size); Err bitreich.org 70 i Err bitreich.org 70 i ent = grow_ent(ent, ent->nblks + 1); Err bitreich.org 70 i Err bitreich.org 70 i@@ -433,7 +434,7 @@ dedup(int fd, char *msg) Err bitreich.org 70 i ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i Err bitreich.org 70 i /* Store block */ Err bitreich.org 70 i- append_blk(cbuf, &bdescr); Err bitreich.org 70 i+ append_blk(outp, &bdescr); Err bitreich.org 70 i Err bitreich.org 70 i /* Create a cache entry for this block */ Err bitreich.org 70 i cent = alloc_cent(); Err bitreich.org 70 i@@ -443,7 +444,7 @@ dedup(int fd, char *msg) Err bitreich.org 70 i ent->bdescr[ent->nblks++] = bdescr; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i- bp += blksize; Err bitreich.org 70 i+ inp += blksize; Err bitreich.org 70 i n -= blksize; Err bitreich.org 70 i } Err bitreich.org 70 i } Err bitreich.org 70 i@@ -466,31 +467,31 @@ dedup(int fd, char *msg) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i free(ent); Err bitreich.org 70 i- free(cbuf); Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i+ free(buf[1]); Err bitreich.org 70 i+ free(buf[0]); Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i extract(struct ent *ent, void *arg) Err bitreich.org 70 i { Err bitreich.org 70 i- uint8_t *buf, *cbuf; Err bitreich.org 70 i+ uint8_t *buf[2]; Err bitreich.org 70 i struct extract_args *args = arg; Err bitreich.org 70 i uint64_t i; Err bitreich.org 70 i Err bitreich.org 70 i if (memcmp(ent->md, args->md, sizeof(ent->md)) != 0) Err bitreich.org 70 i return WALK_CONTINUE; Err bitreich.org 70 i Err bitreich.org 70 i- buf = alloc_buf(BLKSIZE); Err bitreich.org 70 i- cbuf = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i+ buf[0] = alloc_buf(BLKSIZE); Err bitreich.org 70 i+ buf[1] = alloc_buf(comp_size(BLKSIZE)); Err bitreich.org 70 i for (i = 0; i < ent->nblks; i++) { Err bitreich.org 70 i size_t blksize; Err bitreich.org 70 i Err bitreich.org 70 i- read_blk(cbuf, &ent->bdescr[i]); Err bitreich.org 70 i- blksize = decomp(cbuf, buf, ent->bdescr[i].size, BLKSIZE); Err bitreich.org 70 i- xwrite(args->fd, buf, blksize); Err bitreich.org 70 i+ read_blk(buf[1], &ent->bdescr[i]); Err bitreich.org 70 i+ blksize = decomp(buf[1], buf[0], ent->bdescr[i].size, BLKSIZE); Err bitreich.org 70 i+ xwrite(args->fd, buf[0], blksize); Err bitreich.org 70 i } Err bitreich.org 70 i- free(cbuf); Err bitreich.org 70 i- free(buf); Err bitreich.org 70 i+ free(buf[1]); Err bitreich.org 70 i+ free(buf[0]); Err bitreich.org 70 i return WALK_STOP; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 .