iImplement block deletion - 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 a5062b8799146166bf125a7f49630fa46d84639b /scm/dedup/commit/a5062b8799146166bf125a7f49630fa46d84639b.gph bitreich.org 70 1parent 918648012d5b18fa898b7338de99e16583a0f7f6 /scm/dedup/commit/918648012d5b18fa898b7338de99e16583a0f7f6.gph bitreich.org 70 hAuthor: sin URL:mailto:sin@2f30.org bitreich.org 70 iDate: Thu, 25 Apr 2019 22:02:32 +0100 Err bitreich.org 70 i Err bitreich.org 70 iImplement block deletion Err bitreich.org 70 i Err bitreich.org 70 iThis code relies on fallocate(2) so it is not very portable. Err bitreich.org 70 i Err bitreich.org 70 iDiffstat: Err bitreich.org 70 i M bcompress.c | 10 ++++++++++ Err bitreich.org 70 i M block.c | 12 ++++++++++++ Err bitreich.org 70 i M block.h | 2 ++ Err bitreich.org 70 i M bstorage.c | 38 +++++++++++++++++++++++++++++++ Err bitreich.org 70 i M config.mk | 2 +- Err bitreich.org 70 i Err bitreich.org 70 i5 files changed, 63 insertions(+), 1 deletion(-) Err bitreich.org 70 i--- Err bitreich.org 70 1diff --git a/bcompress.c b/bcompress.c /scm/dedup/file/bcompress.c.gph bitreich.org 70 i@@ -25,6 +25,7 @@ static int bccreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i static int bcopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar); Err bitreich.org 70 i static int bcput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i+static int bcrm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bccheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bcsync(struct bctx *bctx); Err bitreich.org 70 i static int bcclose(struct bctx *bctx); Err bitreich.org 70 i@@ -34,6 +35,7 @@ static struct bops bops = { Err bitreich.org 70 i .open = bcopen, Err bitreich.org 70 i .put = bcput, Err bitreich.org 70 i .get = bcget, Err bitreich.org 70 i+ .rm = bcrm, Err bitreich.org 70 i .check = bccheck, Err bitreich.org 70 i .sync = bcsync, Err bitreich.org 70 i .close = bcclose, Err bitreich.org 70 i@@ -238,6 +240,14 @@ bcget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i static int Err bitreich.org 70 i+bcrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bops *bops = bstorageops(); Err bitreich.org 70 i+ Err bitreich.org 70 i+ return bops->rm(bctx, md); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+static int Err bitreich.org 70 i bccheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i { Err bitreich.org 70 i struct bops *bops = bstorageops(); Err bitreich.org 70 1diff --git a/block.c b/block.c /scm/dedup/file/block.c.gph bitreich.org 70 i@@ -78,6 +78,18 @@ bget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i int Err bitreich.org 70 i+brm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct bops *bops; Err bitreich.org 70 i+ Err bitreich.org 70 i+ if (bctx == NULL || md == NULL) Err bitreich.org 70 i+ return -1; Err bitreich.org 70 i+ Err bitreich.org 70 i+ bops = bcompressops(); Err bitreich.org 70 i+ return bops->rm(bctx, md); Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i+int Err bitreich.org 70 i bcheck(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i { Err bitreich.org 70 i struct bops *bops; Err bitreich.org 70 1diff --git a/block.h b/block.h /scm/dedup/file/block.h.gph bitreich.org 70 i@@ -17,6 +17,7 @@ struct bops { Err bitreich.org 70 i int (*open)(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar); Err bitreich.org 70 i int (*put)(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i int (*get)(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i+ int (*rm)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i int (*check)(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i int (*sync)(struct bctx *bctx); Err bitreich.org 70 i int (*close)(struct bctx *bctx); Err bitreich.org 70 i@@ -27,6 +28,7 @@ extern int bcreat(char *path, int mode, struct bparam *bpar, struct bctx **bctx) Err bitreich.org 70 i extern int bopen(char *path, int flags, int mode, struct bparam *bpar, struct bctx **bctx); Err bitreich.org 70 i extern int bput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i extern int bget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i+extern int brm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i extern int bcheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i extern int bsync(struct bctx *bctx); Err bitreich.org 70 i extern int bclose(struct bctx *bctx); Err bitreich.org 70 1diff --git a/bstorage.c b/bstorage.c /scm/dedup/file/bstorage.c.gph bitreich.org 70 i@@ -51,6 +51,7 @@ static int bscreat(struct bctx *bctx, char *path, int mode, struct bparam *bpar) Err bitreich.org 70 i static int bsopen(struct bctx *bctx, char *path, int flags, int mode, struct bparam *bpar); Err bitreich.org 70 i static int bsput(struct bctx *bctx, void *buf, size_t n, unsigned char *md); Err bitreich.org 70 i static int bsget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n); Err bitreich.org 70 i+static int bsrm(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bscheck(struct bctx *bctx, unsigned char *md); Err bitreich.org 70 i static int bssync(struct bctx *bctx); Err bitreich.org 70 i static int bsclose(struct bctx *bctx); Err bitreich.org 70 i@@ -60,6 +61,7 @@ static struct bops bops = { Err bitreich.org 70 i .open = bsopen, Err bitreich.org 70 i .put = bsput, Err bitreich.org 70 i .get = bsget, Err bitreich.org 70 i+ .rm = bsrm, Err bitreich.org 70 i .check = bscheck, Err bitreich.org 70 i .sync = bssync, Err bitreich.org 70 i .close = bsclose, Err bitreich.org 70 i@@ -536,6 +538,42 @@ bsget(struct bctx *bctx, unsigned char *md, void *buf, size_t *n) Err bitreich.org 70 i return 0; Err bitreich.org 70 i } Err bitreich.org 70 i Err bitreich.org 70 i+static int Err bitreich.org 70 i+bsrm(struct bctx *bctx, unsigned char *md) Err bitreich.org 70 i+{ Err bitreich.org 70 i+ struct sctx *sctx; Err bitreich.org 70 i+ struct bd key, *bd; Err bitreich.org 70 i+ off_t bdoffs; Err bitreich.org 70 i+ Err bitreich.org 70 i+ sctx = bctx->sctx; Err bitreich.org 70 i+ Err bitreich.org 70 i+ /* Lookup block in the cache */ Err bitreich.org 70 i+ memcpy(key.md, md, MDSIZE); 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+ return -1; 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+ if (bd->refcnt == 0) { Err bitreich.org 70 i+ int mode; Err bitreich.org 70 i+ Err bitreich.org 70 i+ mode = FALLOC_FL_PUNCH_HOLE | FALLOC_FL_KEEP_SIZE; Err bitreich.org 70 i+ fallocate(sctx->fd, mode, bd->offset, bd->size); Err bitreich.org 70 i+ RB_REMOVE(bdcache, &sctx->bdcache, bd); Err bitreich.org 70 i+ free(bd); Err bitreich.org 70 i+ } Err bitreich.org 70 i+ return 0; Err bitreich.org 70 i+} Err bitreich.org 70 i+ Err bitreich.org 70 i /* Err bitreich.org 70 i * Lookup the block and rehash it. Check that the Err bitreich.org 70 i * resulting hash matches the given hash. Err bitreich.org 70 1diff --git a/config.mk b/config.mk /scm/dedup/file/config.mk.gph bitreich.org 70 i@@ -2,5 +2,5 @@ VERSION = 1.0 Err bitreich.org 70 i PREFIX = /usr/local Err bitreich.org 70 i MANPREFIX = $(PREFIX)/man Err bitreich.org 70 i Err bitreich.org 70 i-CPPFLAGS = -I/usr/local/include -D_FILE_OFFSET_BITS=64 Err bitreich.org 70 i+CPPFLAGS = -I/usr/local/include -D_FILE_OFFSET_BITS=64 -D_GNU_SOURCE Err bitreich.org 70 i LDFLAGS = -L/usr/local/lib Err bitreich.org 70 .