aboutsummaryrefslogtreecommitdiff
path: root/lib/sqfs
diff options
context:
space:
mode:
authorDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-03-04 21:28:14 +0100
committerDavid Oberhollenzer <david.oberhollenzer@sigma-star.at>2023-04-01 12:25:02 +0200
commit32eb57dd9a19254565a0792ab9b627a3dac319f9 (patch)
treec86314fda1e36f2231f352ec0f372aef7d3d9b0a /lib/sqfs
parent6b1020ef3e034cbb6e0fa4cd984b181c0dd414ff (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/sqfs')
-rw-r--r--lib/sqfs/src/block_processor/backend.c6
-rw-r--r--lib/sqfs/src/block_writer.c55
2 files changed, 7 insertions, 54 deletions
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);