commit a7876bfd884b201019ba7d498347257d1869f340
parent b32c5c5b3c6b92b0a10ddc694e7df2d233c43c52
Author: sin <sin@2f30.org>
Date:   Sun, 17 Feb 2019 10:08:01 +0000
Rework lookup
Diffstat:
| M | dedup.c |  |  | 25 | +++++++++++-------------- | 
1 file changed, 11 insertions(+), 14 deletions(-)
diff --git a/dedup.c b/dedup.c
@@ -351,16 +351,14 @@ store_size(void)
 }
 
 int
-lookup_blk(uint8_t *md, struct bdescr *bdescr)
+lookup_blk(uint8_t *md)
 {
 	struct cent *ent, key;
 
 	memcpy(key.bdescr.md, md, sizeof(key.bdescr.md));
 	ent = RB_FIND(cache, &cache_head, &key);
-	if (ent != NULL) {
-		*bdescr = ent->bdescr;
+	if (ent != NULL)
 		return 0;
-	}
 	return -1;
 }
 
@@ -389,26 +387,25 @@ dedup(int fd)
 			else
 				blksiz = n;
 
-			hash_blk(bp, blksiz, md);
+			memcpy(bdescr.md, md, sizeof(bdescr));
+			bdescr.offset = store_size();
+			bdescr.size = blksiz;
+
+			hash_blk(bp, bdescr.size, bdescr.md);
 
 			/* Calculate file hash one block at a time */
-			SHA256_Update(&ctx, bp, blksiz);
+			SHA256_Update(&ctx, bp, bdescr.size);
 
 			ent = grow_ent(ent, ent->nblks + 1);
-			if (lookup_blk(md, &bdescr) < 0) {
-				struct bdescr bdescr;
-				struct cent *cent;
 
-				/* Block not found, create new block descriptor */
-				memcpy(bdescr.md, md, sizeof(bdescr));
-				bdescr.offset = store_size();
-				bdescr.size = blksiz;
+			if (lookup_blk(bdescr.md) < 0) {
+				struct cent *cent;
 
 				/* Update index entry */
 				ent->bdescr[ent->nblks++] = bdescr;
 
 				/* Store block */
-				append_blk(bp, blksiz);
+				append_blk(bp, bdescr.size);
 
 				/* Create a cache entry for this block */
 				cent = alloc_cent();