Refusign cylinder alignment if it is impossible to do it exactly.
This commit is contained in:
parent
43eae7502b
commit
2caf527f67
@ -844,13 +844,12 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
|
|||||||
int sa_type, ret, always_align;
|
int sa_type, ret, always_align;
|
||||||
uint32_t img_blocks;
|
uint32_t img_blocks;
|
||||||
off_t imgsize, cylsize = 0, frac;
|
off_t imgsize, cylsize = 0, frac;
|
||||||
|
char msg[160];
|
||||||
|
|
||||||
sa_type = (t->system_area_options >> 2) & 0x3f;
|
sa_type = (t->system_area_options >> 2) & 0x3f;
|
||||||
if (sa_type != 0)
|
if (sa_type != 0)
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
always_align = (t->system_area_options >> 8) & 3;
|
always_align = (t->system_area_options >> 8) & 3;
|
||||||
if (always_align >= 2)
|
|
||||||
return ISO_SUCCESS;
|
|
||||||
|
|
||||||
img_blocks = t->curblock;
|
img_blocks = t->curblock;
|
||||||
imgsize = ((off_t) img_blocks) * (off_t) 2048;
|
imgsize = ((off_t) img_blocks) * (off_t) 2048;
|
||||||
@ -871,12 +870,15 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
|
|||||||
}
|
}
|
||||||
cylsize = t->partition_heads_per_cyl * t->partition_secs_per_head *512;
|
cylsize = t->partition_heads_per_cyl * t->partition_secs_per_head *512;
|
||||||
frac = imgsize % cylsize;
|
frac = imgsize % cylsize;
|
||||||
iso_msg_debug(t->image->id,
|
sprintf(msg, "Automatically adjusted MBR geometry to %d/%d/%d",
|
||||||
"Automatically adjusted MBR geometry to %d/%d/%d",
|
|
||||||
(int) (imgsize / cylsize + !!frac),
|
(int) (imgsize / cylsize + !!frac),
|
||||||
t->partition_heads_per_cyl, t->partition_secs_per_head);
|
t->partition_heads_per_cyl, t->partition_secs_per_head);
|
||||||
|
iso_msgs_submit(0, msg, 0, "NOTE", 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (always_align >= 2)
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
|
||||||
cylsize = 0;
|
cylsize = 0;
|
||||||
if (t->catalog != NULL &&
|
if (t->catalog != NULL &&
|
||||||
(t->catalog->bootimages[0]->isolinux_options & 0x0a) == 0x02) {
|
(t->catalog->bootimages[0]->isolinux_options & 0x0a) == 0x02) {
|
||||||
@ -899,6 +901,12 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
|
|||||||
}
|
}
|
||||||
if (cylsize == 0)
|
if (cylsize == 0)
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
|
if (((double) imgsize) / (double) cylsize > 1024.0) {
|
||||||
|
iso_msgs_submit(0,
|
||||||
|
"Image size exceeds 1024 cylinders. Cannot align partition.",
|
||||||
|
0, "WARNING", 0);
|
||||||
|
return ISO_SUCCESS;
|
||||||
|
}
|
||||||
|
|
||||||
frac = imgsize % cylsize;
|
frac = imgsize % cylsize;
|
||||||
imgsize += (frac > 0 ? cylsize - frac : 0);
|
imgsize += (frac > 0 ? cylsize - frac : 0);
|
||||||
@ -906,6 +914,13 @@ int iso_align_isohybrid(Ecma119Image *t, int flag)
|
|||||||
frac = imgsize - ((off_t) img_blocks) * (off_t) 2048;
|
frac = imgsize - ((off_t) img_blocks) * (off_t) 2048;
|
||||||
if (frac == 0)
|
if (frac == 0)
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
t->tail_blocks += frac / 2048 + !!(frac % 2048);
|
if (frac % 2048) {
|
||||||
|
sprintf(msg,
|
||||||
|
"Cylinder size %d not divisible by 2048. Cannot align partition.",
|
||||||
|
(int) cylsize);
|
||||||
|
iso_msgs_submit(0, msg, 0, "WARNING", 0);
|
||||||
|
} else {
|
||||||
|
t->tail_blocks += frac / 2048;
|
||||||
|
}
|
||||||
return ISO_SUCCESS;
|
return ISO_SUCCESS;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user