diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-05-24 15:37:07 +0200 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2020-05-24 15:37:07 +0200 |
commit | 69cd1a62b273efdd392f1f130bf3dc57c73ef5d5 (patch) | |
tree | b606a2259aed18ecac404be30ddfe97bccb3d80d | |
parent | d9e5895829a2c20e7624326ce391f0e56762b855 (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>
-rw-r--r-- | lib/sqfs/block_processor/common.c | 34 |
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; |