Index: head/sys/geom/part/g_part_mbr.c =================================================================== --- head/sys/geom/part/g_part_mbr.c (revision 222209) +++ head/sys/geom/part/g_part_mbr.c (working copy) @@ -194,38 +194,22 @@ g_part_mbr_add(struct g_part_table *basetable, str { struct g_part_mbr_entry *entry; struct g_part_mbr_table *table; - uint32_t start, size, sectors; if (gpp->gpp_parms & G_PART_PARM_LABEL) return (EINVAL); - sectors = basetable->gpt_sectors; + if (gpp->gpp_start > UINT_MAX || gpp->gpp_size > UINT_MAX) + return (EINVAL); entry = (struct g_part_mbr_entry *)baseentry; table = (struct g_part_mbr_table *)basetable; - - start = gpp->gpp_start; - size = gpp->gpp_size; - if (size < sectors) - return (EINVAL); - if (start % sectors) { - size = size - sectors + (start % sectors); - start = start - (start % sectors) + sectors; - } - if (size % sectors) - size = size - (size % sectors); - if (size < sectors) - return (EINVAL); - if (baseentry->gpe_deleted) bzero(&entry->ent, sizeof(entry->ent)); - KASSERT(baseentry->gpe_start <= start, ("%s", __func__)); - KASSERT(baseentry->gpe_end >= start + size - 1, ("%s", __func__)); - baseentry->gpe_start = start; - baseentry->gpe_end = start + size - 1; - entry->ent.dp_start = start; - entry->ent.dp_size = size; + baseentry->gpe_start = gpp->gpp_start; + baseentry->gpe_end = gpp->gpp_start + gpp->gpp_size - 1; + entry->ent.dp_start = gpp->gpp_start; + entry->ent.dp_size = gpp->gpp_size; mbr_set_chs(basetable, baseentry->gpe_start, &entry->ent.dp_scyl, &entry->ent.dp_shd, &entry->ent.dp_ssect); mbr_set_chs(basetable, baseentry->gpe_end, &entry->ent.dp_ecyl, @@ -254,17 +238,18 @@ g_part_mbr_create(struct g_part_table *basetable, struct g_consumer *cp; struct g_provider *pp; struct g_part_mbr_table *table; - uint32_t msize; pp = gpp->gpp_provider; cp = LIST_FIRST(&pp->consumers); if (pp->sectorsize < MBRSIZE) return (ENOSPC); + if (pp->sectorsize > 4096) + return (EOPNOTSUPP); - msize = MIN(pp->mediasize / pp->sectorsize, UINT32_MAX); - basetable->gpt_first = basetable->gpt_sectors; - basetable->gpt_last = msize - (msize % basetable->gpt_sectors) - 1; + basetable->gpt_first = 1; + basetable->gpt_last = MIN(pp->mediasize / pp->sectorsize, + 2 * UINT32_MAX); table = (struct g_part_mbr_table *)basetable; le16enc(table->mbr + DOSMAGICOFFSET, DOSMAGIC); @@ -331,21 +316,13 @@ g_part_mbr_resize(struct g_part_table *basetable, struct g_part_entry *baseentry, struct g_part_parms *gpp) { struct g_part_mbr_entry *entry; - uint32_t size, sectors; - sectors = basetable->gpt_sectors; - size = gpp->gpp_size; - - if (size < sectors) + if (gpp->gpp_size > UINT_MAX) return (EINVAL); - if (size % sectors) - size = size - (size % sectors); - if (size < sectors) - return (EINVAL); entry = (struct g_part_mbr_entry *)baseentry; - baseentry->gpe_end = baseentry->gpe_start + size - 1; - entry->ent.dp_size = size; + baseentry->gpe_end = baseentry->gpe_start + gpp->gpp_size - 1; + entry->ent.dp_size = gpp->gpp_size; mbr_set_chs(basetable, baseentry->gpe_end, &entry->ent.dp_ecyl, &entry->ent.dp_ehd, &entry->ent.dp_esect); return (0); @@ -433,7 +410,7 @@ g_part_mbr_read(struct g_part_table *basetable, st pp = cp->provider; table = (struct g_part_mbr_table *)basetable; - msize = MIN(pp->mediasize / pp->sectorsize, UINT32_MAX); + msize = MIN(pp->mediasize / pp->sectorsize, 2 * UINT32_MAX); buf = g_read_data(cp, 0L, pp->sectorsize, &error); if (buf == NULL) @@ -472,8 +449,8 @@ g_part_mbr_read(struct g_part_table *basetable, st } basetable->gpt_entries = NDOSPART; - basetable->gpt_first = basetable->gpt_sectors; - basetable->gpt_last = msize - (msize % basetable->gpt_sectors) - 1; + basetable->gpt_first = 1; + basetable->gpt_last = msize - 1; g_free(buf); return (0);