+2011-10-28 Vladimir Serbinenko <phcoder@gmail.com>
+
+ Use shifts in squash4.
+
+ * grub-core/fs/squash4.c (grub_squash_data): New field log2_blksz.
+ (squash_mount): Check block size and take logarithm.
+ (direct_read): Use shifts.
+
2011-10-28 Vladimir Serbinenko <phcoder@gmail.com>
Correct befs block counting logic.
struct grub_squash_super sb;
struct grub_squash_cache_inode ino;
grub_uint64_t fragments;
+ int log2_blksz;
};
struct grub_fshelp_node
grub_error (GRUB_ERR_BAD_FS, "not a squash4");
if (err)
return NULL;
- if (grub_le_to_cpu32 (sb.magic) != SQUASH_MAGIC)
+ if (grub_le_to_cpu32 (sb.magic) != SQUASH_MAGIC
+ || grub_le_to_cpu32 (sb.block_size) == 0
+ || ((grub_le_to_cpu32 (sb.block_size) - 1)
+ & grub_le_to_cpu32 (sb.block_size)))
{
grub_error (GRUB_ERR_BAD_FS, "not squash4");
return NULL;
data->disk = disk;
data->fragments = grub_le_to_cpu64 (frag);
+ for (data->log2_blksz = 0;
+ (1U << data->log2_blksz) < grub_le_to_cpu32 (data->sb.block_size);
+ data->log2_blksz++);
+
return data;
}
block_offset = ((char *) &ino->ino.file.block_size
- (char *) &ino->ino);
}
- total_blocks = grub_divmod64 (total_size
- + grub_le_to_cpu32 (data->sb.block_size) - 1,
- grub_le_to_cpu32 (data->sb.block_size),
- 0);
+ total_blocks = ((total_size
+ + grub_le_to_cpu32 (data->sb.block_size) - 1)
+ >> data->log2_blksz);
ino->block_sizes = grub_malloc (total_blocks
* sizeof (ino->block_sizes[0]));
ino->cumulated_block_sizes = grub_malloc (total_blocks
if (a == 0)
a = sizeof (struct grub_squash_super);
- i = grub_divmod64 (off, grub_le_to_cpu32 (data->sb.block_size), 0);
+ i = off >> data->log2_blksz;
cumulated_uncompressed_size = grub_le_to_cpu32 (data->sb.block_size)
* (grub_disk_addr_t) i;
while (cumulated_uncompressed_size < off + len)