URI: 
       Simplify dedup() function - dedup - deduplicating backup program
  HTML git clone git://bitreich.org/dedup/ git://enlrupgkhuxnvlhsf6lc3fziv5h2hhfrinws65d7roiv6bfj7d652fid.onion/dedup/
   DIR Log
   DIR Files
   DIR Refs
   DIR Tags
   DIR README
   DIR LICENSE
       ---
   DIR commit 893ee1895fb91a98344ba68192d2e9ad678bc203
   DIR parent e8056ddcaccd7972a5008983d9bc60a3a36498c5
  HTML Author: sin <sin@2f30.org>
       Date:   Thu, 21 Feb 2019 10:54:35 +0000
       
       Simplify dedup() function
       
       Diffstat:
         M dedup.c                             |     122 +++++++++++++++++++------------
       
       1 file changed, 74 insertions(+), 48 deletions(-)
       ---
   DIR diff --git a/dedup.c b/dedup.c
       @@ -230,6 +230,12 @@ alloc_cache_entry(void)
        }
        
        void
       +free_cache_entry(struct cache_entry *ent)
       +{
       +        free(ent);
       +}
       +
       +void
        add_cache_entry(struct cache_entry *ent)
        {
                RB_INSERT(cache, &cache_head, ent);
       @@ -255,7 +261,7 @@ free_cache(void)
        
                RB_FOREACH_SAFE(ent, cache, &cache_head, tmp) {
                        RB_REMOVE(cache, &cache_head, ent);
       -                free(ent);
       +                free_cache_entry(ent);
                }
        }
        
       @@ -295,6 +301,12 @@ alloc_snap(void)
                return snap;
        }
        
       +void
       +free_snap(struct snapshot *snap)
       +{
       +        free(snap);
       +}
       +
        struct snapshot *
        grow_snap(struct snapshot *snap, uint64_t nr_blk_descs)
        {
       @@ -320,6 +332,12 @@ alloc_buf(size_t size)
        }
        
        void
       +free_buf(uint8_t *buf)
       +{
       +        free(buf);
       +}
       +
       +void
        hash_blk(uint8_t *buf, size_t size, uint8_t *md)
        {
                SHA256_CTX ctx;
       @@ -360,64 +378,73 @@ lookup_blk_desc(uint8_t *md, struct blk_desc *blk_desc)
        }
        
        void
       +dedup_chunk(struct snapshot *snap, uint8_t *chunkp, size_t chunk_size)
       +{
       +        uint8_t md[MDSIZE];
       +        uint8_t *comp_buf;
       +        struct blk_desc blk_desc;
       +        size_t n;
       +
       +        comp_buf = alloc_buf(comp_size(BLKSIZE));
       +
       +        n = comp(chunkp, comp_buf, chunk_size, comp_size(BLKSIZE));
       +        hash_blk(comp_buf, n, md);
       +
       +        snaphdr.st.orig_size += chunk_size;
       +        snaphdr.st.comp_size += n;
       +
       +        if (lookup_blk_desc(md, &blk_desc) < 0) {
       +                struct cache_entry *ent;
       +
       +                memcpy(blk_desc.md, md, sizeof(blk_desc.md));
       +                blk_desc.offset = snaphdr.store_size;
       +                blk_desc.size = n;
       +
       +                snap->blk_desc[snap->nr_blk_descs++] = blk_desc;
       +
       +                append_blk(comp_buf, &blk_desc);
       +
       +                ent = alloc_cache_entry();
       +                ent->blk_desc = blk_desc;
       +                add_cache_entry(ent);
       +                cache_dirty = 1;
       +                cache_misses++;
       +
       +                snaphdr.st.dedup_size += blk_desc.size;
       +                snaphdr.st.nr_blks++;
       +
       +                if (blk_desc.size > snaphdr.st.max_blk_size)
       +                        snaphdr.st.max_blk_size = blk_desc.size;
       +                if (blk_desc.size < snaphdr.st.min_blk_size)
       +                        snaphdr.st.min_blk_size = blk_desc.size;
       +        } else {
       +                snap->blk_desc[snap->nr_blk_descs++] = blk_desc;
       +                cache_hits++;
       +        }
       +
       +        free(comp_buf);
       +}
       +
       +void
        dedup(int fd, char *msg)
        {
                struct snapshot *snap;
                struct chunker *chunker;
       -        uint8_t *comp_buf;
                SHA256_CTX ctx;
                ssize_t n;
        
                snap = alloc_snap();
                chunker = alloc_chunker(BLKSIZE, fd);
       -        comp_buf = alloc_buf(comp_size(BLKSIZE));
        
                SHA256_Init(&ctx);
                while ((n = fill_chunker(chunker)) > 0) {
       -                uint8_t md[MDSIZE];
       -                struct blk_desc blk_desc;
       -                size_t chunk_size, csize;
                        uint8_t *chunkp;
       +                size_t chunk_size;
        
                        chunkp = get_chunk(chunker, &chunk_size);
                        SHA256_Update(&ctx, chunkp, chunk_size);
       -
       -                csize = comp(chunkp, comp_buf, chunk_size, comp_size(BLKSIZE));
       -                hash_blk(comp_buf, csize, md);
       -
       -                snaphdr.st.orig_size += chunk_size;
       -                snaphdr.st.comp_size += csize;
       -
                        snap = grow_snap(snap, snap->nr_blk_descs + 1);
       -                if (lookup_blk_desc(md, &blk_desc) < 0) {
       -                        struct cache_entry *ent;
       -
       -                        memcpy(blk_desc.md, md, sizeof(blk_desc.md));
       -                        blk_desc.offset = snaphdr.store_size;
       -                        blk_desc.size = csize;
       -
       -                        snap->blk_desc[snap->nr_blk_descs++] = blk_desc;
       -
       -                        append_blk(comp_buf, &blk_desc);
       -
       -                        ent = alloc_cache_entry();
       -                        ent->blk_desc = blk_desc;
       -                        add_cache_entry(ent);
       -                        cache_dirty = 1;
       -                        cache_misses++;
       -
       -                        snaphdr.st.dedup_size += blk_desc.size;
       -                        snaphdr.st.nr_blks++;
       -
       -                        if (blk_desc.size > snaphdr.st.max_blk_size)
       -                                snaphdr.st.max_blk_size = blk_desc.size;
       -                        if (blk_desc.size < snaphdr.st.min_blk_size)
       -                                snaphdr.st.min_blk_size = blk_desc.size;
       -                } else {
       -                        snap->blk_desc[snap->nr_blk_descs++] = blk_desc;
       -                        cache_hits++;
       -                }
       -
       +                dedup_chunk(snap, chunkp, chunk_size);
                        drain_chunker(chunker, chunk_size);
                }
        
       @@ -437,9 +464,8 @@ dedup(int fd, char *msg)
                        append_snap(snap);
                }
        
       -        free(comp_buf);
                free_chunker(chunker);
       -        free(snap);
       +        free_snap(snap);
        }
        
        int
       @@ -461,8 +487,8 @@ extract(struct snapshot *snap, void *arg)
                        blksize = decomp(buf[1], buf[0], snap->blk_desc[i].size, BLKSIZE);
                        xwrite(args->fd, buf[0], blksize);
                }
       -        free(buf[1]);
       -        free(buf[0]);
       +        free_buf(buf[1]);
       +        free_buf(buf[0]);
                return WALK_STOP;
        }
        
       @@ -502,7 +528,7 @@ check(struct snapshot *snap, void *arg)
                        fprintf(stderr, "  Size: %llu\n",
                                (unsigned long long)snap->blk_desc[i].size);
                }
       -        free(buf);
       +        free_buf(buf);
                return WALK_CONTINUE;
        }
        
       @@ -566,7 +592,7 @@ walk(int (*fn)(struct snapshot *, void *), void *arg)
                        if ((*fn)(snap, arg) == WALK_STOP)
                                break;
                }
       -        free(snap);
       +        free_snap(snap);
        }
        
        void