summaryrefslogtreecommitdiff
path: root/lib/sqfs/block_processor/backend.c
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-03-22 16:20:39 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2021-03-22 21:09:54 +0100
commite8cc53ad5fbac2cb2f578091125dc506f136bfde (patch)
tree3b2fa7616c6780189d82de0ced2c610f11befed9 /lib/sqfs/block_processor/backend.c
parent5aa0f30173ecf3b6538b9136cb4783fc19266288 (diff)
block processor: simplify backlog accounting
Simply count the number of blocks we hand out (malloc'ed or recycled) and decrease the counter when we put blocks back for recycling. The sync() part becomes a little more complicated, because we can get stuck with a backlog of 1 or 2 because we have a fragment or current block buffer in use. We also need to accout for this when creating the processor, because we need to be able to request at least 2 blocks without stalling. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfs/block_processor/backend.c')
-rw-r--r--lib/sqfs/block_processor/backend.c9
1 files changed, 4 insertions, 5 deletions
diff --git a/lib/sqfs/block_processor/backend.c b/lib/sqfs/block_processor/backend.c
index ff142c9..68e299e 100644
--- a/lib/sqfs/block_processor/backend.c
+++ b/lib/sqfs/block_processor/backend.c
@@ -48,6 +48,8 @@ static void release_old_block(sqfs_block_processor_t *proc, sqfs_block_t *blk)
{
blk->next = proc->free_list;
proc->free_list = blk;
+
+ proc->backlog -= 1;
}
static int process_completed_block(sqfs_block_processor_t *proc, sqfs_block_t *blk)
@@ -216,7 +218,8 @@ static int process_completed_fragment(sqfs_block_processor_t *proc,
return 0;
fail:
free(chunk);
- free(frag);
+ if (frag != NULL)
+ release_old_block(proc, frag);
return err;
}
@@ -236,7 +239,6 @@ static void store_io_block(sqfs_block_processor_t *proc, sqfs_block_t *blk)
}
blk->next = it;
- proc->backlog += 1;
}
int dequeue_block(sqfs_block_processor_t *proc)
@@ -253,7 +255,6 @@ int dequeue_block(sqfs_block_processor_t *proc)
blk = proc->io_queue;
proc->io_queue = blk->next;
proc->io_deq_seq_num += 1;
- proc->backlog -= 1;
status = process_completed_block(proc, blk);
if (status != 0)
@@ -270,8 +271,6 @@ int dequeue_block(sqfs_block_processor_t *proc)
return status ? status : SQFS_ERROR_INTERNAL;
}
- proc->backlog -= 1;
-
if (blk->flags & SQFS_BLK_IS_FRAGMENT) {
status = process_completed_fragment(proc, blk);
if (status != 0)