Change the way in which zero stripesize is handled. Instead of reporting

zero stripeoffset in such case (as if device has no stripes), report offset
from the beginning of the media (as if device has single infinite stripe).

This gives partitioning tools information, required to guess better
partition alignment, in case if hardware doesn't report it's stripe size.
For example, it should give disklabel info about odd offset made by fdisk.
This commit is contained in:
Alexander Motin 2010-01-06 13:14:37 +00:00
parent 7edea21b22
commit 0c8fd0c8ac
3 changed files with 10 additions and 13 deletions

View File

@ -393,10 +393,10 @@ g_slice_config(struct g_geom *gp, u_int idx, int how, off_t offset, off_t length
pp = g_new_providerf(gp, sbuf_data(sb));
pp2 = LIST_FIRST(&gp->consumer)->provider;
pp->flags = pp2->flags & G_PF_CANDELETE;
if (pp2->stripesize > 0) {
pp->stripesize = pp2->stripesize;
pp->stripeoffset = (pp2->stripeoffset + offset) % pp->stripesize;
}
pp->stripesize = pp2->stripesize;
pp->stripeoffset = pp2->stripeoffset + offset;
if (pp->stripesize > 0)
pp->stripeoffset %= pp->stripesize;
if (0 && bootverbose)
printf("GEOM: Configure %s, start %jd length %jd end %jd\n",
pp->name, (intmax_t)offset, (intmax_t)length,

View File

@ -288,11 +288,10 @@ g_part_new_provider(struct g_geom *gp, struct g_part_table *table,
entry->gpe_pp->mediasize -= entry->gpe_offset - offset;
entry->gpe_pp->sectorsize = pp->sectorsize;
entry->gpe_pp->flags = pp->flags & G_PF_CANDELETE;
if (pp->stripesize > 0) {
entry->gpe_pp->stripesize = pp->stripesize;
entry->gpe_pp->stripeoffset = (pp->stripeoffset +
entry->gpe_offset) % pp->stripesize;
}
entry->gpe_pp->stripesize = pp->stripesize;
entry->gpe_pp->stripeoffset = pp->stripeoffset + entry->gpe_offset;
if (pp->stripesize > 0)
entry->gpe_pp->stripeoffset %= pp->stripesize;
g_error_provider(entry->gpe_pp, 0);
}

View File

@ -467,10 +467,8 @@ g_uzip_taste(struct g_class *mp, struct g_provider *pp, int flags)
pp2->sectorsize = 512;
pp2->mediasize = (off_t)sc->nblocks * sc->blksz;
pp2->flags = pp->flags & G_PF_CANDELETE;
if (pp->stripesize > 0) {
pp2->stripesize = pp->stripesize;
pp2->stripeoffset = pp->stripeoffset;
}
pp2->stripesize = pp->stripesize;
pp2->stripeoffset = pp->stripeoffset;
g_error_provider(pp2, 0);
g_access(cp, -1, 0, 0);