aboutsummaryrefslogtreecommitdiff
path: root/lib/sqfs/block_processor/frontend.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-03-22 11:55:18 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-03-23 11:00:49 +0100
commitcb8b925130c0ff5cdb445ad36fde47ca4f58e645 (patch)
tree6c5b0b705bbe0611953d17592a9716fe44b1b7cd /lib/sqfs/block_processor/frontend.c
parent13c804062e9acc7f74850477679265e19704e65a (diff)
block processor: keep duplicate copies of in-flight fragment blocks
If we want full, byte-for byte, verification of fragments during de-duplication we need to check back with the blocks already written to disk, or with the ones that are in flight. The previous, extremely hacky approach simply locked up the thread pool and investigated the queues. For the new approach, we treat the thread pool as completely opaque and don't try to touch it. This commit modifies the block processor to keep duplicate copies of each submitted fragment block around, that are cleaned up once the block is dequeued and written to disk. So instead of touching the thread pool, we can simply investigate the in-fligth-block list and the current block, before resorting to reading back fragment blocks from the file. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfs/block_processor/frontend.c')
-rw-r--r--lib/sqfs/block_processor/frontend.c15
1 files changed, 15 insertions, 0 deletions
diff --git a/lib/sqfs/block_processor/frontend.c b/lib/sqfs/block_processor/frontend.c
index a4a38e9..e8a4207 100644
--- a/lib/sqfs/block_processor/frontend.c
+++ b/lib/sqfs/block_processor/frontend.c
@@ -52,6 +52,21 @@ int enqueue_block(sqfs_block_processor_t *proc, sqfs_block_t *blk)
{
int status;
+ if ((blk->flags & SQFS_BLK_FRAGMENT_BLOCK) &&
+ proc->file != NULL && proc->uncmp != NULL) {
+ sqfs_block_t *copy = alloc_flex(sizeof(*copy), 1, blk->size);
+
+ if (copy == NULL)
+ return SQFS_ERROR_ALLOC;
+
+ copy->size = blk->size;
+ copy->index = blk->index;
+ memcpy(copy->data, blk->data, blk->size);
+
+ copy->next = proc->fblk_in_flight;
+ proc->fblk_in_flight = copy;
+ }
+
if (proc->pool->submit(proc->pool, blk) != 0) {
status = proc->pool->get_status(proc->pool);