Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 Aug 2018 19:11:00 +0000 (UTC)
From:      Cy Schubert <cy@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r337271 - head/stand/i386/libi386
Message-ID:  <201808031911.w73JB0WK025164@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: cy
Date: Fri Aug  3 19:11:00 2018
New Revision: 337271
URL: https://svnweb.freebsd.org/changeset/base/337271

Log:
  Some drives report a geometry that is inconsisetent with the total
  number of sectors reported through the BIOS. Cylinders * heads *
  sectors may not necessarily be equal to the total number of sectors
  reported through int13h function 48h.
  
  An example of this is when a Mediasonic HD3-U2B PATA to USB enclosure
  with a 80 GB disk is attached. Loader hangs at line 506 of
  stand/i386/libi386/biosdisk.c while attempting to read sectors beyond
  the end of the disk, sector 156906855. I discovered that the Mediasonic
  enclosure was reporting the disk with 9767 cylinders, 255 heads, 63
  sectors/track. That's 156906855 sectors. However camcontrol and
  Windows 10 both report report the disk having 156301488 sectors, not
  the calculated value. At line 280 biosdisk.c sets the sectors to the
  higher of either bd->bd_sectors or the total calculated at line 276
  (156906855) instead of the lower and correct value of 156301488 reported
  by int 13h 48h.
  
  This was tested on all three of my Mediasonic HD3-U2B PATA to USB
  enclosures.
  
  Instead of using the higher of bd_sectors (returned by int13h) or the
  calculated value, this patch uses the lower and safer of the values.
  
  Reviewed by:	tsoome@
  Differential Revision:	https://reviews.freebsd.org/D16577

Modified:
  head/stand/i386/libi386/biosdisk.c

Modified: head/stand/i386/libi386/biosdisk.c
==============================================================================
--- head/stand/i386/libi386/biosdisk.c	Fri Aug  3 18:52:51 2018	(r337270)
+++ head/stand/i386/libi386/biosdisk.c	Fri Aug  3 19:11:00 2018	(r337271)
@@ -275,7 +275,7 @@ bd_int13probe(struct bdinfo *bd)
 
 		total = (uint64_t)params.cylinders *
 		    params.heads * params.sectors_per_track;
-		if (bd->bd_sectors < total)
+		if (bd->bd_sectors > total)
 			bd->bd_sectors = total;
 
 		ret = 1;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201808031911.w73JB0WK025164>