From f15d9d5123f9dfd97ac292ebc0643d0d7c4e7282 Mon Sep 17 00:00:00 2001 From: Charles Duffy Date: Sat, 6 Jul 2019 15:57:19 +0000 Subject: squashfsTools: Fix 4k-align patch (regression in 4.4dev) The 4k-align squashfs patch was broken in the update to squashfs 4.4dev, such that the patch was no longer actually applied in full (command line option not even parsed). --- pkgs/tools/filesystems/squashfs/default.nix | 2 +- .../squashfs/squashfs-tools-4.3-4k-align.patch | 93 ---------------------- .../squashfs/squashfs-tools-4.4-4k-align.patch | 87 ++++++++++++++++++++ 3 files changed, 88 insertions(+), 94 deletions(-) delete mode 100644 pkgs/tools/filesystems/squashfs/squashfs-tools-4.3-4k-align.patch create mode 100644 pkgs/tools/filesystems/squashfs/squashfs-tools-4.4-4k-align.patch (limited to 'pkgs/tools/filesystems/squashfs') diff --git a/pkgs/tools/filesystems/squashfs/default.nix b/pkgs/tools/filesystems/squashfs/default.nix index 2fd3d52bdf67..59a786116df6 100644 --- a/pkgs/tools/filesystems/squashfs/default.nix +++ b/pkgs/tools/filesystems/squashfs/default.nix @@ -27,7 +27,7 @@ stdenv.mkDerivation rec { # This patch adds an option to pad filesystems (increasing size) in # exchange for better chunking / binary diff calculation. - ./squashfs-tools-4.3-4k-align.patch + ./squashfs-tools-4.4-4k-align.patch ] ++ stdenv.lib.optional stdenv.isDarwin ./darwin.patch; buildInputs = [ zlib xz zstd ] diff --git a/pkgs/tools/filesystems/squashfs/squashfs-tools-4.3-4k-align.patch b/pkgs/tools/filesystems/squashfs/squashfs-tools-4.3-4k-align.patch deleted file mode 100644 index cd4308b489fe..000000000000 --- a/pkgs/tools/filesystems/squashfs/squashfs-tools-4.3-4k-align.patch +++ /dev/null @@ -1,93 +0,0 @@ -From 7bda7c75748f36b0a50f93e46144d5a4de4974ad Mon Sep 17 00:00:00 2001 -From: Amin Hassani -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 | 16 ++++++++++++++++ - 1 file changed, 16 insertions(+) - -diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c -index 8b1376f..683973d 100644 ---- a/squashfs-tools/mksquashfs.c -+++ b/squashfs-tools/mksquashfs.c -@@ -99,6 +99,8 @@ int old_exclude = TRUE; - int use_regex = FALSE; - int nopad = FALSE; - int exit_on_error = FALSE; - static off_t squashfs_start_offset = 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; - -@@ -1513,6 +1515,9 @@ 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); -@@ -2420,6 +2420,9 @@ - compressed_size = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); - write_buffer->size = compressed_size; - 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; -@@ -2761,6 +2769,10 @@ int write_file_blocks(squashfs_inode *inode, struct dir_ent *dir_ent, - long long sparse = 0; - struct file_buffer *fragment_buffer = NULL; - -+ // 4k align the start of each file. -+ if(do_4k_align) -+ ALIGN_UP(bytes, 4096); -+ - if(pre_duplicate(read_size)) - return write_file_blocks_dup(inode, dir_ent, read_buffer, dup); - -@@ -4692,6 +4704,7 @@ void write_filesystem_tables(struct squashfs_super_block *sBlk, int nopad) - "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, -@@ -5346,6 +5359,8 @@ print_compressor_options: - root_name = argv[i]; - } else if(strcmp(argv[i], "-version") == 0) { - VERSION(); -+ } else if(strcmp(argv[i], "-4k-align") == 0) { -+ do_4k_align = TRUE; - } else { - ERROR("%s: invalid option\n\n", argv[0]); - printOptions: -@@ -5387,6 +5402,7 @@ printOptions: - ERROR("\t\t\tdirectory containing that directory, " - "rather than the\n"); - ERROR("\t\t\tcontents of the directory\n"); -+ ERROR("-4k-align\t\tenables 4k alignment of all files\n"); - ERROR("\nFilesystem filter options:\n"); - ERROR("-p \tAdd pseudo file " - "definition\n"); --- -2.14.1.480.gb18f417b89-goog (previously; hand-patched by charles-dyfis-net) diff --git a/pkgs/tools/filesystems/squashfs/squashfs-tools-4.4-4k-align.patch b/pkgs/tools/filesystems/squashfs/squashfs-tools-4.4-4k-align.patch new file mode 100644 index 000000000000..c9c3dd3d7604 --- /dev/null +++ b/pkgs/tools/filesystems/squashfs/squashfs-tools-4.4-4k-align.patch @@ -0,0 +1,87 @@ +From 7bda7c75748f36b0a50f93e46144d5a4de4974ad Mon Sep 17 00:00:00 2001 +From: Amin Hassani +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' +--- +diff -u a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c +--- a/squashfs-tools/mksquashfs.c 2019-07-06 15:50:22.214873176 +0000 ++++ b/squashfs-tools/mksquashfs.c 2019-07-06 15:51:22.244802582 +0000 +@@ -100,7 +100,9 @@ + int use_regex = FALSE; + int nopad = FALSE; + int exit_on_error = FALSE; ++int do_4k_align = FALSE; + static off_t squashfs_start_offset = 0; ++#define ALIGN_UP(bytes, size) (bytes = (bytes + size - 1) & ~(size - 1)) + + long long global_uid = -1, global_gid = -1; + +@@ -1495,6 +1497,9 @@ + * 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); +@@ -2414,6 +2419,9 @@ + compressed_size = SQUASHFS_COMPRESSED_SIZE_BLOCK(c_byte); + write_buffer->size = compressed_size; + 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; +@@ -2728,6 +2736,10 @@ + long long sparse = 0; + struct file_buffer *fragment_buffer = NULL; + ++ // 4k align the start of each file. ++ if(do_4k_align) ++ ALIGN_UP(bytes, 4096); ++ + if(pre_duplicate(read_size)) + return write_file_blocks_dup(inode, dir_ent, read_buffer, dup); + +@@ -4808,6 +4820,7 @@ + "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, +@@ -5570,6 +5583,8 @@ + root_name = argv[i]; + } else if(strcmp(argv[i], "-version") == 0) { + VERSION(); ++ } else if(strcmp(argv[i], "-4k-align") == 0) { ++ do_4k_align = TRUE; + } else { + ERROR("%s: invalid option\n\n", argv[0]); + printOptions: +@@ -5613,6 +5628,7 @@ + ERROR("\t\t\tdirectory containing that directory, " + "rather than the\n"); + ERROR("\t\t\tcontents of the directory\n"); ++ ERROR("-4k-align\t\tenables 4k alignment of all files\n"); + ERROR("\nFilesystem filter options:\n"); + ERROR("-p \tAdd pseudo file " + "definition\n"); -- cgit 1.4.1