summary refs log tree commit diff
diff options
context:
space:
mode:
authorCharles Duffy <charles@dyfis.net>2018-11-17 09:44:19 -0600
committerJörg Thalheim <Mic92@users.noreply.github.com>2018-11-17 15:44:19 +0000
commit9eefb443f34abf986f238a5c5dce9d6bced9adc8 (patch)
tree5cb94dc58525c79565163d886adcb9e5d1dcb56a
parentc102306c1f4b75984bc9a78c8de77b4988991e42 (diff)
downloadnixpkgs-9eefb443f34abf986f238a5c5dce9d6bced9adc8.tar
nixpkgs-9eefb443f34abf986f238a5c5dce9d6bced9adc8.tar.gz
nixpkgs-9eefb443f34abf986f238a5c5dce9d6bced9adc8.tar.bz2
nixpkgs-9eefb443f34abf986f238a5c5dce9d6bced9adc8.tar.lz
nixpkgs-9eefb443f34abf986f238a5c5dce9d6bced9adc8.tar.xz
nixpkgs-9eefb443f34abf986f238a5c5dce9d6bced9adc8.tar.zst
nixpkgs-9eefb443f34abf986f238a5c5dce9d6bced9adc8.zip
squashfsTools: incorporate 4k-alignment option patch (#49200)
-rw-r--r--pkgs/tools/filesystems/squashfs/default.nix10
-rw-r--r--pkgs/tools/filesystems/squashfs/squashfs-tools-4.3-4k-align.patch92
2 files changed, 99 insertions, 3 deletions
diff --git a/pkgs/tools/filesystems/squashfs/default.nix b/pkgs/tools/filesystems/squashfs/default.nix
index d5bcd912c95..389a614f54b 100644
--- a/pkgs/tools/filesystems/squashfs/default.nix
+++ b/pkgs/tools/filesystems/squashfs/default.nix
@@ -15,13 +15,17 @@ stdenv.mkDerivation rec {
     rev = "9c1db6d13a51a2e009f0027ef336ce03624eac0d";
   };
 
-  # These patches ensures that mksquashfs output is reproducible.
-  # See also https://reproducible-builds.org/docs/system-images/
-  # and https://github.com/NixOS/nixpkgs/issues/40144.
   patches = [
+    # These patches ensures that mksquashfs output is reproducible.
+    # See also https://reproducible-builds.org/docs/system-images/
+    # and https://github.com/NixOS/nixpkgs/issues/40144.
     ./0001-If-SOURCE_DATE_EPOCH-is-set-override-timestamps-with.patch
     ./0002-If-SOURCE_DATE_EPOCH-is-set-also-clamp-content-times.patch
     ./0003-remove-frag-deflator-thread.patch
+
+    # 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
   ] ++ stdenv.lib.optional stdenv.isDarwin ./darwin.patch;
 
   buildInputs = [ zlib xz ]
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
new file mode 100644
index 00000000000..b7c949182e0
--- /dev/null
+++ b/pkgs/tools/filesystems/squashfs/squashfs-tools-4.3-4k-align.patch
@@ -0,0 +1,92 @@
+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 | 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;
++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");
++	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 <pseudo-definition>\tAdd pseudo file "
+ 				"definition\n");
+-- 
+2.14.1.480.gb18f417b89-goog (previously; hand-patched by charles-dyfis-net)