Date: Sat, 26 Oct 1996 16:06:08 +0100 (BST) From: Barry Alan Scott <barry@scottb.demon.co.uk> To: FreeBSD-gnats-submit@freebsd.org Subject: i386/1893: partition tables not processed correctly to guess geometry Message-ID: <199610261506.QAA00610@scottb.demon.co.uk> Resent-Message-ID: <199610261510.IAA00952@freefall.freebsd.org>
next in thread | raw e-mail | index | archive | help
>Number: 1893
>Category: i386
>Synopsis: partition tables not processed correctly to guess geometry
>Confidential: no
>Severity: critical
>Priority: high
>Responsible: freebsd-bugs
>State: open
>Class: sw-bug
>Submitter-Id: current-users
>Arrival-Date: Sat Oct 26 08:10:01 PDT 1996
>Last-Modified:
>Originator: Barry Alan Scott
>Organization:
None
>Release: FreeBSD 2.1-STABLE i386 and all SNAP's to date
>Environment:
Bug is all FreeBSB since 2.1.5 atleast.
>Description:
John Gumb and myself are experimenting with supporting the Fujitsu
640MB MO drives at the 2048 sector size. We found that FreeBSD does
not process partition tables correctly to size a disk. The following
code at line 253 in diskslice_machdep.c is badly broken. It is
supposed to calculate the max number of cylinders but infact reports
the number of cylinders in the 4th slot.
Old code from diskslice_machdep.c around line 253:
/* Guess the geometry. */
/*
* TODO:
* Perhaps skip entries with 0 size.
* Perhaps only look at entries of type DOSPTYP_386BSD.
*/
max_ncyls = 0;
max_nsectors = 0;
max_ntracks = 0;
for (dospart = 0, dp = dp0; dospart < NDOSPART; dospart++, dp++) {
int nsectors;
int ntracks;
>How-To-Repeat:
Make partition slot 4 describe a small part of the whole disk.
Then the orginal code will get the size of the disk wrong.
>Fix:
See above.
>Audit-Trail:
>Unformatted:
>bug> max_ncyls = DPCYL(dp->dp_ecyl, dp->dp_esect);
>bug> if (max_ncyls < max_ncyls)
>bug> max_ncyls = max_ncyls;
nsectors = DPSECT(dp->dp_esect);
if (max_nsectors < nsectors)
max_nsectors = nsectors;
ntracks = dp->dp_ehd + 1;
if (max_ntracks < ntracks)
max_ntracks = ntracks;
}
The lines maked ">bug>" are clearly intended to read
int ncyls;
ncyls = DPCYL(dp->dp_ecyl, dp->dp_esect);
if (max_ncyls < ncyls)
max_ncyls = ncyls;
We do not know what the full impact of this bug is. Is this
related to the "random" MSDOS problems some people see?
John Gumb can be contacted as john@talisker.demon.co.uk
Barry Scott can be contacted as barry@scottb.demon.co.uk
and as tsbarry@nortel.ca (atleast till 31-dec)
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?199610261506.QAA00610>
