Fix MBR creation.
authorCarl Hetherington <cth@carlh.net>
Thu, 12 Jan 2017 13:44:04 +0000 (13:44 +0000)
committerCarl Hetherington <cth@carlh.net>
Thu, 12 Jan 2017 13:44:04 +0000 (13:44 +0000)
Read parent->part_size after ext4_block_init() so that it has been
initialized, and write the partition size in sectors rather than bytes.

src/ext4_mbr.c

index 482ccc4bab74ba430b53e39bf217ce553b2ac495..d1f463fabf44c19dd0f33befad3bfda478d49674 100644 (file)
@@ -129,7 +129,6 @@ int ext4_mbr_scan(struct ext4_blockdev *parent, struct ext4_mbr_bdevs *bdevs)
 int ext4_mbr_write(struct ext4_blockdev *parent, struct ext4_mbr_parts *parts)
 {
        int r;
-       uint64_t disk_size = parent->part_size;
        uint32_t division_sum = parts->division[0] + parts->division[1] +
                                parts->division[2] + parts->division[3];
 
@@ -141,6 +140,10 @@ int ext4_mbr_write(struct ext4_blockdev *parent, struct ext4_mbr_parts *parts)
        if (r != EOK)
                return r;
 
+       /* carl: must be after ext4_block_init or the device isn't yet open */
+       /* disk_size is disk size in bytes */
+       uint64_t const disk_size = parent->part_size;
+
        /*Calculate CHS*/
        uint32_t k = 16;
        while ((k < 256) && ((disk_size / k / 63) > 1024))
@@ -162,6 +165,7 @@ int ext4_mbr_write(struct ext4_blockdev *parent, struct ext4_mbr_parts *parts)
                if (!cyl_part)
                        continue;
 
+               /* Partition start and size in bytes */
                uint32_t part_start = cyl_it * cyl_size;
                uint32_t part_size = cyl_part * cyl_size;
 
@@ -182,7 +186,7 @@ int ext4_mbr_write(struct ext4_blockdev *parent, struct ext4_mbr_parts *parts)
                mbr->part_entry[i].chs2[2] = cyl_end;
 
                mbr->part_entry[i].first_lba = part_start;
-               mbr->part_entry[i].sectors = part_size;
+               mbr->part_entry[i].sectors = part_size / parent->bdif->ph_bsize;
 
                cyl_it += cyl_part;
        }
@@ -201,4 +205,3 @@ int ext4_mbr_write(struct ext4_blockdev *parent, struct ext4_mbr_parts *parts)
 /**
  * @}
  */
-