int insert_result(struct results_tree *res, unsigned char *digest, struct filerec *recs[2], uint64_t startoff[2], uint64_t endoff[2]) { struct extent *e0 = alloc_extent(recs[0], startoff[0]); struct extent *e1 = alloc_extent(recs[1], startoff[1]); struct dupe_extents *dext; uint64_t len = endoff[0] - startoff[0]; int add_score = 1; if (!e0 || !e1) return ENOMEM; dext = find_dupe_extents(res, digest, len); if (!dext) { dext = dupe_extents_new(res, digest, len); if (!dext) return ENOMEM; add_score = 0; } abort_on(dext->de_len != len); insert_extent_list_free(dext, &e0); insert_extent_list_free(dext, &e1); if (e0) { if (add_score) dext->de_score += len; e0->e_itnode.start = e0->e_loff; e0->e_itnode.last = extent_end(e0); interval_tree_insert(&e0->e_itnode, &recs[0]->extent_tree); #ifdef ITDEBUG recs[0]->num_extents++; #endif } if (e1) { if (add_score) dext->de_score += len; e1->e_itnode.start = e1->e_loff; e1->e_itnode.last = extent_end(e1); interval_tree_insert(&e1->e_itnode, &recs[1]->extent_tree); #ifdef ITDEBUG recs[1]->num_extents++; #endif } return 0; }
int insert_result(struct results_tree *res, unsigned char *digest, struct filerec *recs[2], uint64_t startoff[2], uint64_t endoff[2]) { struct extent *e0 = alloc_extent(recs[0], startoff[0]); struct extent *e1 = alloc_extent(recs[1], startoff[1]); struct dupe_extents *dext; uint64_t len = endoff[0] - startoff[0]; int add_score = 1; if (!e0 || !e1) return ENOMEM; dext = find_dupe_extents(res, digest, len); if (!dext) { dext = dupe_extents_new(res, digest, len); if (!dext) return ENOMEM; add_score = 0; } abort_on(dext->de_len != len); insert_extent_list_free(dext, &e0); insert_extent_list_free(dext, &e1); if (e0) { if (add_score) dext->de_score += len; list_add_tail(&e0->e_file_extents, &recs[0]->extent_list); } if (e1) { if (add_score) dext->de_score += len; list_add_tail(&e1->e_file_extents, &recs[1]->extent_list); } return 0; }
/* * This does not do all the work of insert_result(), just enough for * the dedupe phase of block-dedupe to work properly. */ int insert_one_result(struct results_tree *res, unsigned char *digest, struct filerec *file, uint64_t startoff, uint64_t len) { struct extent *extent = alloc_extent(file, startoff); struct dupe_extents *dext; if (!extent) return ENOMEM; dext = find_dupe_extents(res, digest, len); if (!dext) { dext = dupe_extents_new(res, digest, len); if (!dext) return ENOMEM; } abort_on(dext->de_len != len); insert_extent_list_free(dext, &extent); return 0; }