From eebf77ccef537379110a3ee5ef5d19fa3db520ae Mon Sep 17 00:00:00 2001 From: Marcel Moolenaar Date: Sun, 21 Jun 2015 01:44:27 +0000 Subject: [PATCH] Microsoft Azure demands that fixed VHD images are a whole number of megabytes. This is on top of having the image rounded to the matching geometry of the image size. By rounding up to the next MB after rounding to the geometry, we lost idempotency. Subsequent calls to resize the image will keep increasing the image size. Tested by: gjb@ --- usr.bin/mkimg/vhd.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/usr.bin/mkimg/vhd.c b/usr.bin/mkimg/vhd.c index 6860c1687b47..404075225f82 100644 --- a/usr.bin/mkimg/vhd.c +++ b/usr.bin/mkimg/vhd.c @@ -365,6 +365,11 @@ vhd_fix_resize(lba_t imgsz) struct vhd_geom geom; int64_t imagesz; + /* + * Round the image size to the pre-determined geometry that + * matches the image size. This circular dependency implies + * that we need to loop to handle boundary conditions. + */ imgsz *= secsz; imagesz = imgsz; while (1) { @@ -375,6 +380,10 @@ vhd_fix_resize(lba_t imgsz) break; imagesz += geom.heads * geom.sectors * VHD_SECTOR_SIZE; } + /* + * Azure demands that images are a whole number of megabytes. + */ + imagesz = (imagesz + 0xfffffULL) & ~0xfffffULL; return (image_set_size(imagesz / secsz)); }