Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 11 Jun 2009 18:15:04 +0000 (UTC)
From:      Andriy Gapon <avg@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-stable@freebsd.org, svn-src-stable-7@freebsd.org
Subject:   svn commit: r194032 - stable/7/sbin/newfs_msdos
Message-ID:  <200906111815.n5BIF4Ti056347@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: avg
Date: Thu Jun 11 18:15:03 2009
New Revision: 194032
URL: http://svn.freebsd.org/changeset/base/194032

Log:
  MFC r189112: newfs_msdos: work with media that doesn't have any CHS params
  
  Approved by:	jhb (mentor)

Modified:
  stable/7/sbin/newfs_msdos/   (props changed)
  stable/7/sbin/newfs_msdos/newfs_msdos.c

Modified: stable/7/sbin/newfs_msdos/newfs_msdos.c
==============================================================================
--- stable/7/sbin/newfs_msdos/newfs_msdos.c	Thu Jun 11 18:10:17 2009	(r194031)
+++ stable/7/sbin/newfs_msdos/newfs_msdos.c	Thu Jun 11 18:15:03 2009	(r194032)
@@ -739,13 +739,25 @@ getdiskinfo(int fd, const char *fname, c
     /* Maybe it's a fixed drive */
     if (lp == NULL) {
 	if (ioctl(fd, DIOCGDINFO, &dlp) == -1) {
-	    if (ioctl(fd, DIOCGSECTORSIZE, &dlp.d_secsize) == -1)
+	    if (bpb->bps == 0 && ioctl(fd, DIOCGSECTORSIZE, &dlp.d_secsize) == -1)
 		errx(1, "Cannot get sector size, %s", strerror(errno));
-	    if (ioctl(fd, DIOCGFWSECTORS, &dlp.d_nsectors) == -1)
-		errx(1, "Cannot get number of sectors, %s", strerror(errno));
-	    if (ioctl(fd, DIOCGFWHEADS, &dlp.d_ntracks)== -1)
-		errx(1, "Cannot get number of heads, %s", strerror(errno));
+
+	    /* XXX Should we use bpb->bps if it's set? */
 	    dlp.d_secperunit = ms / dlp.d_secsize;
+
+	    if (bpb->spt == 0 && ioctl(fd, DIOCGFWSECTORS, &dlp.d_nsectors) == -1) {
+		warnx("Cannot get number of sectors per track, %s", strerror(errno));
+		dlp.d_nsectors = 63;
+	    }
+	    if (bpb->hds == 0 && ioctl(fd, DIOCGFWHEADS, &dlp.d_ntracks) == -1) {
+		warnx("Cannot get number of heads, %s", strerror(errno));
+		if (dlp.d_secperunit <= 63*1*1024)
+		    dlp.d_ntracks = 1;
+		else if (dlp.d_secperunit <= 63*16*1024)
+		    dlp.d_ntracks = 16;
+		else
+		    dlp.d_ntracks = 255;
+	    }
 	}
 
 	hs = (ms / dlp.d_secsize) - dlp.d_secperunit;



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