svn commit: r189112 - head/sbin/newfs_msdos

[ Available lists | Index of svn-src-all | Month of Feb 2009 | Week of 27 Feb 2009 | Raw email | View thread | Wrap long lines | Reply | Tag ]
From
Andriy Gapon <avg@FreeBSD.org>
Date
27 Feb 2009 17:29:49
Subject
svn commit: r189112 - head/sbin/newfs_msdos
Message-ID
200902271729.n1RHTmlG076315@svn.freebsd.org


[ Hide this part ]
Author: avg
Date: Fri Feb 27 17:29:48 2009
New Revision: 189112
URL: http://svn.freebsd.org/changeset/base/189112

Log:
newfs_msdos: allow to work with media that doesn't have any CHS params

Either use parameters provided by user or make them up.
The code for faking CHS params is borrowed from disklabel code.
The logic for using user-provided and auto-guessed parameters is not
perfect, so to speak.

PR: bin/121182
Approved by: jhb (mentor)

Modified:
head/sbin/newfs_msdos/newfs_msdos.c

Modified: head/sbin/newfs_msdos/newfs_msdos.c
==============================================================================
--- head/sbin/newfs_msdos/newfs_msdos.c Fri Feb 27 17:29:31 2009 (r189111)
+++ head/sbin/newfs_msdos/newfs_msdos.c Fri Feb 27 17:29:48 2009 (r189112)
@@ -793,13 +793,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;


Elapsed time: 0.070 seconds