f2356e8dcb
I had to update the 4k alignment patch for this. While it does apply, and the result compiles, and even appears to work fine superficially, I do not know if there have been any changes to squashfs internals that now require other places to take the alignment flag into account. Will do more testing soon.
99 lines
4.0 KiB
Diff
99 lines
4.0 KiB
Diff
This patch is an old patch; see below for the original message body. The patch
|
|
has been updated twice: Once to apply to squashfs 4.4, commit
|
|
52eb4c279cd283ed9802dd1ceb686560b22ffb67, and later to apply to squashfs 4.5,
|
|
commit 0496d7c3de3e09da37ba492081c86159806ebb07.
|
|
|
|
From 7bda7c75748f36b0a50f93e46144d5a4de4974ad Mon Sep 17 00:00:00 2001
|
|
From: Amin Hassani <ahassani@google.com>
|
|
Date: Thu, 15 Dec 2016 10:43:15 -0800
|
|
Subject: [PATCH] mksquashfs 4K aligns the files inside the squashfs image
|
|
|
|
Files inside a squashfs image are not necessarily 4k (4096)
|
|
aligned. This patch starts each file in a 4k aligned address and pads
|
|
zero to the end of the file until it reaches the next 4k aligned
|
|
address. This will not change the size of the compressed
|
|
blocks (especially the last one) and hence it will not change how the
|
|
files are being loaded in kernel or unsquashfs. However on average this
|
|
increases the size of the squashfs image which can be calculated by the
|
|
following formula:
|
|
|
|
increased_size = (number_of_unfragmented_files_in_image + number of fragments) * 2048
|
|
|
|
The 4k alignment can be enabled by flag '-4k-align'
|
|
---
|
|
squashfs-tools/mksquashfs.c | 17 +++++++++++++++++
|
|
1 file changed, 17 insertions(+)
|
|
|
|
diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c
|
|
index aaa4b00..eb2fb23 100644
|
|
--- a/squashfs-tools/mksquashfs.c
|
|
+++ b/squashfs-tools/mksquashfs.c
|
|
@@ -99,6 +99,8 @@ int nopad = FALSE;
|
|
int exit_on_error = FALSE;
|
|
long long start_offset = 0;
|
|
int sleep_time = 0;
|
|
+int do_4k_align = FALSE;
|
|
+#define ALIGN_UP(bytes, size) (bytes = (bytes + size - 1) & ~(size - 1))
|
|
|
|
long long global_uid = -1, global_gid = -1;
|
|
|
|
@@ -1553,6 +1555,9 @@ static void unlock_fragments()
|
|
* queue at this time.
|
|
*/
|
|
while(!queue_empty(locked_fragment)) {
|
|
+ // 4k align the start of remaining queued fragments.
|
|
+ if(do_4k_align)
|
|
+ ALIGN_UP(bytes, 4096);
|
|
write_buffer = queue_get(locked_fragment);
|
|
frg = write_buffer->block;
|
|
size = SQUASHFS_COMPRESSED_SIZE_BLOCK(fragment_table[frg].size);
|
|
@@ -2460,6 +2465,9 @@ static void *frag_deflator(void *arg)
|
|
write_buffer->size = compressed_size;
|
|
pthread_mutex_lock(&fragment_mutex);
|
|
if(fragments_locked == FALSE) {
|
|
+ // 4k align the start of each fragment.
|
|
+ if(do_4k_align)
|
|
+ ALIGN_UP(bytes, 4096);
|
|
fragment_table[file_buffer->block].size = c_byte;
|
|
fragment_table[file_buffer->block].start_block = bytes;
|
|
write_buffer->block = bytes;
|
|
@@ -2850,6 +2858,10 @@ static struct file_info *write_file_blocks(int *status, struct dir_ent *dir_ent,
|
|
struct file_info *file;
|
|
int bl_hash = 0;
|
|
|
|
+ // 4k align the start of each file.
|
|
+ if(do_4k_align)
|
|
+ ALIGN_UP(bytes, 4096);
|
|
+
|
|
if(pre_duplicate(read_size, dir_ent->inode, read_buffer, &bl_hash))
|
|
return write_file_blocks_dup(status, dir_ent, read_buffer, dup, bl_hash);
|
|
|
|
@@ -5975,6 +5987,7 @@ static void print_options(FILE *stream, char *name, int total_mem)
|
|
fprintf(stream, "actions from <f>\n");
|
|
fprintf(stream, "-false-action-file <f>\tas -false-action, but read ");
|
|
fprintf(stream, "actions from <f>\n");
|
|
+ fprintf(stream, "-4k-align\t\tenables 4k alignment of all files\n");
|
|
fprintf(stream, "\nFilesystem filter options:\n");
|
|
fprintf(stream, "-p <pseudo-definition>\tAdd pseudo file definition\n");
|
|
fprintf(stream, "-pf <pseudo-file>\tAdd list of pseudo file definitions\n");
|
|
@@ -6198,6 +6211,7 @@ static void print_summary()
|
|
"compressed", no_fragments ? "no" : noF ? "uncompressed" :
|
|
"compressed", no_xattrs ? "no" : noX ? "uncompressed" :
|
|
"compressed", noI || noId ? "uncompressed" : "compressed");
|
|
+ printf("\t4k %saligned\n", do_4k_align ? "" : "un");
|
|
printf("\tduplicates are %sremoved\n", duplicate_checking ? "" :
|
|
"not ");
|
|
printf("Filesystem size %.2f Kbytes (%.2f Mbytes)\n", bytes / 1024.0,
|
|
@@ -7499,6 +7513,9 @@ print_compressor_options:
|
|
root_name = argv[i];
|
|
} else if(strcmp(argv[i], "-version") == 0) {
|
|
print_version("mksquashfs");
|
|
+
|
|
+ } else if(strcmp(argv[i], "-4k-align") == 0) {
|
|
+ do_4k_align = TRUE;
|
|
} else {
|
|
ERROR("%s: invalid option\n\n", argv[0]);
|
|
print_options(stderr, argv[0], total_mem);
|
|
--
|
|
2.32.0
|