iStore a reference count in the block descriptor - 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 f91758f2fd077c0288c664572559d01c91ba54fd /scm/dedup/commit/f91758f2fd077c0288c664572559d01c91ba54fd.gph bitreich.org 70 1parent dfdce10112dbafc512a9b4d69a4f380372532422 /scm/dedup/commit/dfdce10112dbafc512a9b4d69a4f380372532422.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 25 Apr 2019 21:36:29 +0100 Err bitreich.org 70 i Err bitreich.org 70 iStore a reference count in the block descriptor Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M bstorage.c | 22 +++++++++++++++++++--- Err bitreich.org 70 i Err bitreich.org 70 i1 file changed, 19 insertions(+), 3 deletions(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -42,7 +42,7 @@ Err bitreich.org 70 i #define BDTYPE 0x100 Err bitreich.org 70 i Err bitreich.org 70 i #define BHDRSIZE (NBHDRMAGIC + 8 + 8) Err bitreich.org 70 i-#define BDSIZE (8 + 8 + 8 + (MDSIZE)) Err bitreich.org 70 i+#define BDSIZE (8 + 8 + 8 + 8 + (MDSIZE)) Err bitreich.org 70 i Err bitreich.org 70 i extern int pack(unsigned char *dst, char *fmt, ...); Err bitreich.org 70 i extern int unpack(unsigned char *src, char *fmt, ...); Err bitreich.org 70 i@@ -77,6 +77,7 @@ struct bd { Err bitreich.org 70 i uint64_t type; Err bitreich.org 70 i uint64_t offset; Err bitreich.org 70 i uint64_t size; Err bitreich.org 70 i+ uint64_t refcnt; Err bitreich.org 70 i unsigned char md[MDSIZE]; Err bitreich.org 70 i RB_ENTRY(bd) entry; Err bitreich.org 70 i }; Err bitreich.org 70 i@@ -218,11 +219,12 @@ unpackbd(int fd, struct bd *bd) Err bitreich.org 70 i if (xread(fd, buf, sizeof(buf)) != sizeof(buf)) Err bitreich.org 70 i return -1; Err bitreich.org 70 i Err bitreich.org 70 i- snprintf(fmt, sizeof(fmt), "qqq'%d", MDSIZE); Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "qqqq'%d", MDSIZE); Err bitreich.org 70 i n = unpack(buf, fmt, Err bitreich.org 70 i &bd->type, Err bitreich.org 70 i &bd->offset, Err bitreich.org 70 i &bd->size, Err bitreich.org 70 i+ &bd->refcnt, Err bitreich.org 70 i bd->md); Err bitreich.org 70 i Err bitreich.org 70 i assert(n == BDSIZE); Err bitreich.org 70 i@@ -237,11 +239,12 @@ packbd(int fd, struct bd *bd) Err bitreich.org 70 i char fmt[BUFSIZ]; Err bitreich.org 70 i int n; Err bitreich.org 70 i Err bitreich.org 70 i- snprintf(fmt, sizeof(fmt), "qqq'%d", MDSIZE); Err bitreich.org 70 i+ snprintf(fmt, sizeof(fmt), "qqqq'%d", MDSIZE); Err bitreich.org 70 i n = pack(buf, fmt, Err bitreich.org 70 i bd->type, Err bitreich.org 70 i bd->offset, Err bitreich.org 70 i bd->size, Err bitreich.org 70 i+ bd->refcnt, Err bitreich.org 70 i bd->md); Err bitreich.org 70 i Err bitreich.org 70 i assert(n == BDSIZE); Err bitreich.org 70 i@@ -457,6 +460,18 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i Err bitreich.org 70 i bd = RB_FIND(bdcache, &sctx->bdcache, &key); Err bitreich.org 70 i if (bd != NULL) { Err bitreich.org 70 i+ off_t bdoffs; Err bitreich.org 70 i+ Err bitreich.org 70 i+ bdoffs = bd->offset - BDSIZE; Err bitreich.org 70 i+ if (lseek(sctx->fd, bdoffs, SEEK_SET) < 0) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ bd->refcnt++; Err bitreich.org 70 i+ if (packbd(sctx->fd, bd) < 0) { Err bitreich.org 70 i+ bd->refcnt--; Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ } Err bitreich.org 70 i+ Err bitreich.org 70 i memcpy(md, bd->md, MDSIZE); Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i@@ -471,6 +486,7 @@ bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md) Err bitreich.org 70 i bd->type = BDTYPE; Err bitreich.org 70 i bd->offset = offs + BDSIZE; Err bitreich.org 70 i bd->size = n; Err bitreich.org 70 i+ bd->refcnt = 1; Err bitreich.org 70 i memcpy(bd->md, key.md, MDSIZE); Err bitreich.org 70 i Err bitreich.org 70 i if (packbd(sctx->fd, bd) < 0) { Err bitreich.org 70 .