/* ARGSUSED */ void dk_getdisklabel(struct dk_softc *dksc, dev_t dev) { const struct dkdriver *dkd = dksc->sc_dkdev.dk_driver; struct disklabel *lp = dksc->sc_dkdev.dk_label; struct cpu_disklabel *clp = dksc->sc_dkdev.dk_cpulabel; struct disk_geom *dg = &dksc->sc_dkdev.dk_geom; struct partition *pp; int i; const char *errstring; memset(clp, 0x0, sizeof(*clp)); dk_getdefaultlabel(dksc, lp); errstring = readdisklabel(DKLABELDEV(dev), dkd->d_strategy, dksc->sc_dkdev.dk_label, dksc->sc_dkdev.dk_cpulabel); if (errstring) { dk_makedisklabel(dksc); if (dksc->sc_flags & DKF_WARNLABEL) printf("%s: %s\n", dksc->sc_xname, errstring); return; } if ((dksc->sc_flags & DKF_LABELSANITY) == 0) return; /* Sanity check */ if (lp->d_secperunit < UINT32_MAX ? lp->d_secperunit != dg->dg_secperunit : lp->d_secperunit > dg->dg_secperunit) printf("WARNING: %s: total sector size in disklabel (%ju) " "!= the size of %s (%ju)\n", dksc->sc_xname, (uintmax_t)lp->d_secperunit, dksc->sc_xname, (uintmax_t)dg->dg_secperunit); for (i=0; i < lp->d_npartitions; i++) { pp = &lp->d_partitions[i]; if (pp->p_offset + pp->p_size > dg->dg_secperunit) printf("WARNING: %s: end of partition `%c' exceeds " "the size of %s (%ju)\n", dksc->sc_xname, 'a' + i, dksc->sc_xname, (uintmax_t)dg->dg_secperunit); } }
/* ARGSUSED */ void dk_getdisklabel(struct dk_intf *di, struct dk_softc *dksc, dev_t dev) { struct disklabel *lp = dksc->sc_dkdev.dk_label; struct cpu_disklabel *clp = dksc->sc_dkdev.dk_cpulabel; struct partition *pp; int i; const char *errstring; memset(clp, 0x0, sizeof(*clp)); dk_getdefaultlabel(di, dksc, lp); errstring = readdisklabel(DKLABELDEV(dev), di->di_strategy, dksc->sc_dkdev.dk_label, dksc->sc_dkdev.dk_cpulabel); if (errstring) { dk_makedisklabel(di, dksc); if (dksc->sc_flags & DKF_WARNLABEL) printf("%s: %s\n", dksc->sc_xname, errstring); return; } if ((dksc->sc_flags & DKF_LABELSANITY) == 0) return; /* Sanity check */ if (lp->d_secperunit != dksc->sc_size) printf("WARNING: %s: total sector size in disklabel (%d) " "!= the size of %s (%lu)\n", dksc->sc_xname, lp->d_secperunit, di->di_dkname, (u_long)dksc->sc_size); for (i=0; i < lp->d_npartitions; i++) { pp = &lp->d_partitions[i]; if (pp->p_offset + pp->p_size > dksc->sc_size) printf("WARNING: %s: end of partition `%c' exceeds " "the size of %s (%lu)\n", dksc->sc_xname, 'a' + i, di->di_dkname, (u_long)dksc->sc_size); } }