From 32eb57dd9a19254565a0792ab9b627a3dac319f9 Mon Sep 17 00:00:00 2001 From: David Oberhollenzer Date: Sat, 4 Mar 2023 21:28:14 +0100 Subject: 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 --- lib/sqfs/src/block_processor/backend.c | 6 ++-- lib/sqfs/src/block_writer.c | 55 ++++------------------------------ 2 files changed, 7 insertions(+), 54 deletions(-) (limited to 'lib/sqfs') 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); -- cgit v1.2.3