svn commit: r194032 - stable/7/sbin/newfs_msdos

Andriy Gapon avg at FreeBSD.org
Thu Jun 11 18:15:05 UTC 2009


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;


More information about the svn-src-stable mailing list