version 1.88.2.2, 2012/10/30 18:48:52 |
version 1.89, 2012/01/05 21:29:24 |
Line 113 static int get_mapping(struct mbr_partit |
|
Line 113 static int get_mapping(struct mbr_partit |
|
daddr_t *); |
daddr_t *); |
static void convert_mbr_chs(int, int, int, uint8_t *, uint8_t *, |
static void convert_mbr_chs(int, int, int, uint8_t *, uint8_t *, |
uint8_t *, uint32_t); |
uint8_t *, uint32_t); |
static void get_ptn_alignment(struct mbr_partition *); |
|
|
|
static unsigned int ptn_alignment; |
|
static unsigned int ptn_0_offset; |
|
|
|
/* |
/* |
* Notes on the extended partition editor. |
* Notes on the extended partition editor. |
Line 466 set_mbr_type(menudesc *m, void *arg) |
|
Line 462 set_mbr_type(menudesc *m, void *arg) |
|
return 0; |
return 0; |
mbri->extended = ext; |
mbri->extended = ext; |
ext->sector = mbrp->mbrp_start; |
ext->sector = mbrp->mbrp_start; |
ext->mbr.mbr_parts[0].mbrp_start = ptn_0_offset; |
ext->mbr.mbr_parts[0].mbrp_start = bsec; |
ext->mbr.mbr_parts[0].mbrp_size = |
ext->mbr.mbr_parts[0].mbrp_size = mbrp->mbrp_size - bsec; |
mbrp->mbrp_size - ptn_0_offset; |
|
} |
} |
mbrp->mbrp_type = type; |
mbrp->mbrp_type = type; |
|
|
Line 747 edit_mbr_size(menudesc *m, void *arg) |
|
Line 742 edit_mbr_size(menudesc *m, void *arg) |
|
/* If unchanged, don't re-round size */ |
/* If unchanged, don't re-round size */ |
new = dflt; |
new = dflt; |
else { |
else { |
/* Round end to the partition alignment */ |
/* Round end to cylinder boundary */ |
if (sizemult != 1) { |
if (sizemult != 1) { |
new *= sizemult; |
new *= sizemult; |
new += rounddown(start, ptn_alignment); |
new += rounddown(start, current_cylsize); |
new = roundup(new, ptn_alignment); |
new = roundup(new, current_cylsize); |
new -= start; |
new -= start; |
while (new <= 0) |
while (new <= 0) |
new += ptn_alignment; |
new += current_cylsize; |
} |
} |
} |
} |
if (new > max) |
if (new > max) |
Line 1242 mbr_use_wholedisk(mbr_info_t *mbri) |
|
Line 1237 mbr_use_wholedisk(mbr_info_t *mbri) |
|
memset(&mbri->mbrb, 0, sizeof mbri->mbrb); |
memset(&mbri->mbrb, 0, sizeof mbri->mbrb); |
#endif |
#endif |
part[0].mbrp_type = MBR_PTYPE_NETBSD; |
part[0].mbrp_type = MBR_PTYPE_NETBSD; |
part[0].mbrp_size = dlsize - ptn_0_offset; |
part[0].mbrp_size = dlsize - bsec; |
part[0].mbrp_start = ptn_0_offset; |
part[0].mbrp_start = bsec; |
part[0].mbrp_flag = MBR_PFLAG_ACTIVE; |
part[0].mbrp_flag = MBR_PFLAG_ACTIVE; |
|
|
ptstart = ptn_0_offset; |
ptstart = bsec; |
ptsize = dlsize - ptn_0_offset; |
ptsize = dlsize - bsec; |
return 1; |
return 1; |
} |
} |
|
|
Line 1271 edit_mbr(mbr_info_t *mbri) |
|
Line 1266 edit_mbr(mbr_info_t *mbri) |
|
/* Ask full/part */ |
/* Ask full/part */ |
|
|
part = &mbrs->mbr_parts[0]; |
part = &mbrs->mbr_parts[0]; |
get_ptn_alignment(part); /* update ptn_alignment */ |
|
msg_display(MSG_fullpart, diskdev); |
msg_display(MSG_fullpart, diskdev); |
process_menu(MENU_fullpart, &usefull); |
process_menu(MENU_fullpart, &usefull); |
|
|
Line 1456 read_mbr(const char *disk, mbr_info_t *m |
|
Line 1450 read_mbr(const char *disk, mbr_info_t *m |
|
*/ |
*/ |
if (bsec == 0) |
if (bsec == 0) |
bsec = dlsec; |
bsec = dlsec; |
ptn_0_offset = bsec; |
|
/* use 1MB default offset on large disks as fdisk(8) */ |
|
if (dlsize > 2048 * 1024 * 128) |
|
ptn_0_offset = 2048; |
|
|
|
memset(mbri, 0, sizeof *mbri); |
memset(mbri, 0, sizeof *mbri); |
|
|
Line 1477 read_mbr(const char *disk, mbr_info_t *m |
|
Line 1467 read_mbr(const char *disk, mbr_info_t *m |
|
break; |
break; |
|
|
mbrp = &mbrs->mbr_parts[0]; |
mbrp = &mbrs->mbr_parts[0]; |
if (ext_base == 0) { |
if (ext_base != 0) { |
get_ptn_alignment(mbrp); /* get ptn_0_offset */ |
|
} else { |
|
/* sanity check extended chain */ |
/* sanity check extended chain */ |
if (MBR_IS_EXTENDED(mbrp[0].mbrp_type)) |
if (MBR_IS_EXTENDED(mbrp[0].mbrp_type)) |
break; |
break; |
Line 1559 read_mbr(const char *disk, mbr_info_t *m |
|
Line 1547 read_mbr(const char *disk, mbr_info_t *m |
|
ext->sector = base; |
ext->sector = base; |
ext->mbr.mbr_magic = htole16(MBR_MAGIC); |
ext->mbr.mbr_magic = htole16(MBR_MAGIC); |
ext->mbr.mbr_parts[1] = mbrp[1]; |
ext->mbr.mbr_parts[1] = mbrp[1]; |
ext->mbr.mbr_parts[0].mbrp_start = ptn_0_offset; |
ext->mbr.mbr_parts[0].mbrp_start = bsec; |
ext->mbr.mbr_parts[0].mbrp_size = |
ext->mbr.mbr_parts[0].mbrp_size = |
ext_base + limit - base - ptn_0_offset; |
ext_base + limit - base - bsec; |
mbrp[1].mbrp_type = MBR_PTYPE_EXT; |
mbrp[1].mbrp_type = MBR_PTYPE_EXT; |
mbrp[1].mbrp_start = base - ext_base; |
mbrp[1].mbrp_start = base - ext_base; |
mbrp[1].mbrp_size = limit - mbrp[1].mbrp_start; |
mbrp[1].mbrp_size = limit - mbrp[1].mbrp_start; |
Line 1862 get_mapping(struct mbr_partition *parts, |
|
Line 1850 get_mapping(struct mbr_partition *parts, |
|
|
|
return 0; |
return 0; |
} |
} |
|
|
/* |
|
* Determine partition boundary alignment as fdisk(8) does. |
|
*/ |
|
static void |
|
get_ptn_alignment(struct mbr_partition *mbrp0) |
|
{ |
|
uint32_t ptn_0_base, ptn_0_limit; |
|
|
|
/* Default to using 'traditional' cylinder alignment */ |
|
ptn_alignment = bhead * bsec; |
|
ptn_0_offset = bsec; |
|
|
|
if (mbrp0->mbrp_type != 0) { |
|
/* Try to copy offset of first partition */ |
|
ptn_0_base = le32toh(mbrp0->mbrp_start); |
|
ptn_0_limit = ptn_0_base + le32toh(mbrp0->mbrp_size); |
|
if (!(ptn_0_limit & 2047)) { |
|
/* Partition ends on a 1MB boundary, align to 1MB */ |
|
ptn_alignment = 2048; |
|
if (ptn_0_base <= 2048 |
|
&& !(ptn_0_base & (ptn_0_base - 1))) { |
|
/* ptn_base is a power of 2, use it */ |
|
ptn_0_offset = ptn_0_base; |
|
} |
|
} |
|
} else { |
|
/* Use 1MB offset for large (>128GB) disks */ |
|
if (dlsize > 2048 * 1024 * 128) |
|
ptn_alignment = 2048; |
|
ptn_0_offset = 2048; |
|
} |
|
} |
|