svn commit: r216269 - head/sys/geom/part

Bruce Evans brde at
Fri Dec 10 12:24:43 UTC 2010

On Fri, 10 Dec 2010, Bruce Cran wrote:

> On Fri, 10 Dec 2010 10:12:34 +1100 (EST)
> Bruce Evans <brde at> wrote:
>> The BIOS has little control over the mode.  It can't enforce LBA if
>> the drive supports CHS.  It can't force any particular CHS mode since
>> the driver may set any CHS mode.  ata used to reset the drive in the
>> probe and in reinit.  I think this is a hard reset which restores the
>> default CHS.  I can't see where ata resets now.  It is nicely
>> obfuscated using function pointers.  I think it does less resetting.
>> It also has a soft reset for at least sata, but sata won't be using
>> CHS.  Removing of resets would explain why it now has to use the
>> current CHS (since it doesn't change the CHS back to the default).
> The BIOS does seem to have complete control over the geometry that
> FreeBSD detects.

Not exactly.  Anything that runs before FreeBSD can change the CHS
translation if CHS translation is changable.  Then FreeBSD will only
detect the geometry set by the BIOS (if the BIOS changed the default)
if its initialization doesn't clobber the setting before it is read.
Since FreeBSD doesn't care about the geometry, it is only accidental
if this happens.  It didn't happen between at least 1992 and 2009
in 386BSD or FreeBSD, since the driver always reset the drive first.
Now we care less about the geometry than in 1992.

> Yes we'll use LBA mode if it's available, but what I'm
> talking about is the geometry that gets used for creating disklabels
> and the MBR. Since I saw the change in the BIOS reflected in what
> FreeBSD detected, it appears the BIOS has control over those values
> except when it decides to initially use LBA mode.

The current geometry possibly changed by the BIOS is equally useless to
the default geometry set by the drive.  You cannot know if the BIOS
changed it.  My BIOSes don't seem to change it -- FreeBSD with GEOM has
always reported the default CHS as the "firmware" geometry, but I
mostly use versions of ata with the reset, and might not have noticed
if this changed (I always configure BIOS to "LBA" CHS mode with H=255
and C=63 if possible, but have never seen the CHS make it to the driver).

Newer BIOSes with not-so-old not-so-new drives actually have a better
chance of setting the default translation mode to the fake one used
in partition tables for old OSes and boot loaders than old ones.  First,
they won't be using CHS translation to talk to the drive, so they can
change the current translation to anything without affection their
operation, provided the drive is not so old as to not support changing
the translation and not so new as to not support CHS and/or changing it.
This also depends on the drive being fairly old, else it cannot be
covered by any portable CHS.  Second, they might have dropped support
for old OSes and boot loaders and not really support CHS except for
the limit range that it can cover.  Then all OSes and boot loaders on
the drive must be either not using CHS or be using the limited range
that it can cover.

>> The driver always ignores CHS (except to report it) and uses LBA if
>> possible.  If a manufacturer stops supporting CHS, then the driver
>> shouldn't notice, but the manufacturer's non-support should include
>> setting the obsolete fields to 0 (or possibly other specified magic
>> numbers).  It is then up to utilities whether to report these fields
>> as simply there value or to decrypt their magic values into a CHS-
>> unsupported flag (I don't know of any actual flag for this).  Then
>> there is the "firmware geometry" reported to GEOM.  You could try
>> changing this to 0/0/0 and see what breaks.  CAM for SCSI drives still
>> invents a geometry to avoid seeing evil here, since SCSI drives have
>> only had no geometry for about 30 years now.
> But the problem is that we _do_ use CHS: we use it to create the MBR
> and disklabel. Linux invents a geometry if it can't create one from the
> on-disk data; we don't.

Even if it can't create on from the on-disk data?  FreeBSD doesn't do that
now, but used to.  bsdBSD still does it.  One thing I missed was creating
a better default when there is no on-disk data.  cam_calc_geometry() is
good for that.


More information about the svn-src-all mailing list