diff options
author | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2023-03-04 21:28:14 +0100 |
---|---|---|
committer | David Oberhollenzer <david.oberhollenzer@sigma-star.at> | 2023-04-01 12:25:02 +0200 |
commit | 32eb57dd9a19254565a0792ab9b627a3dac319f9 (patch) | |
tree | c86314fda1e36f2231f352ec0f372aef7d3d9b0a /lib | |
parent | 6b1020ef3e034cbb6e0fa4cd984b181c0dd414ff (diff) |
libsquashfs: remove the default block writer alignment feature
The idea of the block align feature was to allow micro-managing that
some files are forcefully aligned to 1k/4k ("device block") boundaries,
hoping to improve access time at the cost of data density. The feature
was not exposed in the tools for a long time and eventuall added to the
sort file. Measurement and experimentation showed, that it in fact
worsened the read performance on a test system with an old micro SD
card as the bottle neck.
The feature is removed, and if needed, can be brought back simply by
wrapping/sub-classing the default block writer, if need be..
Signed-off-by: David Oberhollenzer <david.oberhollenzer@sigma-star.at>
Diffstat (limited to 'lib')
-rw-r--r-- | lib/common/src/writer/init.c | 3 | ||||
-rw-r--r-- | lib/sqfs/src/block_processor/backend.c | 6 | ||||
-rw-r--r-- | lib/sqfs/src/block_writer.c | 55 |
3 files changed, 8 insertions, 56 deletions
diff --git a/lib/common/src/writer/init.c b/lib/common/src/writer/init.c index 497fc6e..fe5fcc5 100644 --- a/lib/common/src/writer/init.c +++ b/lib/common/src/writer/init.c @@ -120,8 +120,7 @@ int sqfs_writer_init(sqfs_writer_t *sqfs, const sqfs_writer_cfg_t *wrcfg) if (ret > 0) sqfs->super.flags |= SQFS_FLAG_COMPRESSOR_OPTIONS; - sqfs->blkwr = sqfs_block_writer_create(sqfs->outfile, - wrcfg->devblksize, 0); + sqfs->blkwr = sqfs_block_writer_create(sqfs->outfile, 0); if (sqfs->blkwr == NULL) { perror("creating block writer"); goto fail_uncmp; diff --git a/lib/sqfs/src/block_processor/backend.c b/lib/sqfs/src/block_processor/backend.c index b443c9d..acff7f5 100644 --- a/lib/sqfs/src/block_processor/backend.c +++ b/lib/sqfs/src/block_processor/backend.c @@ -202,8 +202,7 @@ static int process_completed_fragment(sqfs_block_processor_t *proc, offset = 0; proc->frag_block = frag; proc->frag_block->index = index; - proc->frag_block->flags &= - (SQFS_BLK_DONT_COMPRESS | SQFS_BLK_ALIGN); + proc->frag_block->flags &= SQFS_BLK_DONT_COMPRESS; proc->frag_block->flags |= SQFS_BLK_FRAGMENT_BLOCK; } else { index = proc->frag_block->index; @@ -214,8 +213,7 @@ static int process_completed_fragment(sqfs_block_processor_t *proc, proc->frag_block->size += frag->size; proc->frag_block->flags |= - (frag->flags & - (SQFS_BLK_DONT_COMPRESS | SQFS_BLK_ALIGN)); + (frag->flags & SQFS_BLK_DONT_COMPRESS); } if (proc->frag_tbl != NULL) { diff --git a/lib/sqfs/src/block_writer.c b/lib/sqfs/src/block_writer.c index a5135bc..c747079 100644 --- a/lib/sqfs/src/block_writer.c +++ b/lib/sqfs/src/block_writer.c @@ -36,7 +36,6 @@ typedef struct { sqfs_file_t *file; array_t blocks; - size_t devblksz; size_t file_start; @@ -79,9 +78,6 @@ static int deduplicate_blocks(block_writer_default_t *wr, sqfs_u32 flags, sqfs_u for (i = 0; i < wr->file_start; ++i) { for (j = 0; j < count; ++j) { - if (blocks[i + j].hash == 0) - break; - if (blocks[i + j].hash != blocks[wr->file_start + j].hash) break; @@ -119,33 +115,6 @@ static int deduplicate_blocks(block_writer_default_t *wr, sqfs_u32 flags, sqfs_u return wr->file->truncate(wr->file, sz); } -static int align_file(block_writer_default_t *wr, sqfs_u32 flags) -{ - void *padding; - sqfs_u64 size; - size_t diff; - int ret; - - if (!(flags & SQFS_BLK_ALIGN)) - return 0; - - size = wr->file->get_size(wr->file); - diff = size % wr->devblksz; - if (diff == 0) - return 0; - - padding = calloc(1, diff); - if (padding == 0) - return SQFS_ERROR_ALLOC; - - ret = wr->file->write_at(wr->file, size, padding, diff); - free(padding); - if (ret) - return ret; - - return store_block_location(wr, size, 0, 0); -} - static void block_writer_destroy(sqfs_object_t *wr) { sqfs_drop(((block_writer_default_t *)wr)->file); @@ -161,14 +130,8 @@ static int write_data_block(sqfs_block_writer_t *base, void *user, int err; (void)user; - if (flags & (SQFS_BLK_FIRST_BLOCK | SQFS_BLK_FRAGMENT_BLOCK)) { - err = align_file(wr, flags); - if (err) - return err; - - if (flags & SQFS_BLK_FIRST_BLOCK) - wr->file_start = wr->blocks.used; - } + if (flags & SQFS_BLK_FIRST_BLOCK) + wr->file_start = wr->blocks.used; *location = wr->file->get_size(wr->file); @@ -186,14 +149,8 @@ static int write_data_block(sqfs_block_writer_t *base, void *user, return err; } - if (flags & (SQFS_BLK_LAST_BLOCK | SQFS_BLK_FRAGMENT_BLOCK)) { - err = align_file(wr, flags); - if (err) - return err; - - if (flags & SQFS_BLK_LAST_BLOCK) - return deduplicate_blocks(wr, flags, location); - } + if (flags & SQFS_BLK_LAST_BLOCK) + return deduplicate_blocks(wr, flags, location); return 0; } @@ -203,8 +160,7 @@ static sqfs_u64 get_block_count(const sqfs_block_writer_t *wr) return ((const block_writer_default_t *)wr)->blocks.used; } -sqfs_block_writer_t *sqfs_block_writer_create(sqfs_file_t *file, - size_t devblksz, sqfs_u32 flags) +sqfs_block_writer_t *sqfs_block_writer_create(sqfs_file_t *file, sqfs_u32 flags) { block_writer_default_t *wr; @@ -226,7 +182,6 @@ sqfs_block_writer_t *sqfs_block_writer_create(sqfs_file_t *file, ((sqfs_block_writer_t *)wr)->get_block_count = get_block_count; wr->flags = flags; wr->file = sqfs_grab(file); - wr->devblksz = devblksz; if (array_init(&(wr->blocks), sizeof(blk_info_t), INIT_BLOCK_COUNT)) { sqfs_drop(wr->file); |