Fix rounding error when generating .map files.
am: 4445cd175e

Change-Id: Ic64ec3f39c07cafcb3a2da017236584c4ad01e49
diff --git a/squashfs-tools/mksquashfs.c b/squashfs-tools/mksquashfs.c
index a91fd9e..936ae05 100644
--- a/squashfs-tools/mksquashfs.c
+++ b/squashfs-tools/mksquashfs.c
@@ -863,11 +863,29 @@
 
 /* ANDROID CHANGES START*/
 #ifdef ANDROID
+
+/* Round up the passed |n| value to the smallest multiple of 4096 greater or
+ * equal than |n| and return the 4K-block number for that value. */
+static unsigned long long round_up_block(unsigned long long n) {
+	const unsigned long long kMapBlockSize = 4096;
+	return (n + kMapBlockSize - 1) / kMapBlockSize;
+}
+
 static inline void write_block_map_entry(char *sub_path, unsigned long long start_block, unsigned long long total_size,
 		char * mount_point, FILE *block_map_file) {
 	if (block_map_file) {
-		unsigned long long round_start = (start_block + (1 << 12) - 1) >> 12;
-		unsigned long long round_end = ((start_block + total_size) >> 12) - 1;
+		/* We assign each 4K block based on what file the first byte of the block
+		 * belongs to. The current file consists of the chunk of bytes in the
+		 * interval [start_block, start_block + total_size), (closed on the left end
+		 * and open on the right end). We then compute the first block whose first
+		 * byte is equal to or greater than start_block as |round_start| and then
+		 * the first block whose first byte is *past* this interval, as
+		 * |round_end + 1|. This means that the blocks that should be assigned to
+		 * the current file are in the interval [round_start, round_end + 1), or
+		 * simply [round_start, round_end].
+		 */
+		unsigned long long round_start = round_up_block(start_block);
+		unsigned long long round_end = round_up_block(start_block + total_size) - 1;
 		if (round_start && total_size && round_start <= round_end) {
 			fprintf(block_map_file, "/%s", mount_point);
 			if (sub_path[0] != '/') fprintf(block_map_file, "/");