aboutsummaryrefslogtreecommitdiff
path: root/lib/sqfs
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-05-24 15:37:07 +0200
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2020-05-24 15:37:07 +0200
commit69cd1a62b273efdd392f1f130bf3dc57c73ef5d5 (patch)
treeb606a2259aed18ecac404be30ddfe97bccb3d80d /lib/sqfs
parentd9e5895829a2c20e7624326ce391f0e56762b855 (diff)
block processor: promote fragments to fragment blocks
Instead of [potentially] allocating a new fragment block, take an existing fragment and promote it to the fragmenet block. This saves as a potential block allocation and a memcpy of the initial data. Also it *definitely* removes block allocation from the backend path of the block processor. Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib/sqfs')
-rw-r--r--lib/sqfs/block_processor/common.c34
1 files changed, 19 insertions, 15 deletions
diff --git a/lib/sqfs/block_processor/common.c b/lib/sqfs/block_processor/common.c
index c3363f9..1bccf57 100644
--- a/lib/sqfs/block_processor/common.c
+++ b/lib/sqfs/block_processor/common.c
@@ -153,6 +153,9 @@ int block_processor_do_block(sqfs_block_t *block, sqfs_compressor_t *cmp,
sqfs_inode_set_frag_location(*(it->inode),
block->index, offset);
}
+
+ /* XXX: the block itself got promoted from a fragment */
+ sqfs_inode_set_frag_location(*(block->inode), block->index, 0);
}
if (is_zero_block(block->data, block->size)) {
@@ -223,32 +226,33 @@ int process_completed_fragment(sqfs_block_processor_t *proc, sqfs_block_t *frag,
if (err)
goto fail;
- proc->frag_block = get_new_block(proc);
- if (proc->frag_block == NULL) {
- err = SQFS_ERROR_ALLOC;
- goto fail;
- }
-
+ offset = 0;
+ proc->frag_block = frag;
proc->frag_block->index = index;
- proc->frag_block->flags = SQFS_BLK_FRAGMENT_BLOCK;
+ proc->frag_block->flags &= SQFS_BLK_DONT_COMPRESS;
+ proc->frag_block->flags |= SQFS_BLK_FRAGMENT_BLOCK;
+ proc->frag_block->frag_list = NULL;
proc->stats.frag_block_count += 1;
+ } else {
+ index = proc->frag_block->index;
+ offset = proc->frag_block->size;
+
+ frag->next = proc->frag_block->frag_list;
+ proc->frag_block->frag_list = frag;
+
+ proc->frag_block->size += frag->size;
}
- err = sqfs_frag_table_add_tail_end(proc->frag_tbl,
- proc->frag_block->index,
- proc->frag_block->size,
+ err = sqfs_frag_table_add_tail_end(proc->frag_tbl, index, offset,
frag->size, frag->checksum);
if (err)
- goto fail;
-
- frag->next = proc->frag_block->frag_list;
- proc->frag_block->frag_list = frag;
+ goto fail_outblk;
- proc->frag_block->size += frag->size;
proc->stats.actual_frag_count += 1;
return 0;
fail:
release_old_block(proc, frag);
+fail_outblk:
if (*blk_out != NULL) {
release_old_block(proc, *blk_out);
*blk_out = NULL;