From owner-freebsd-bugs@FreeBSD.ORG Thu Feb 28 19:40:02 2008 Return-Path: Delivered-To: freebsd-bugs@hub.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 55CBD106567A for ; Thu, 28 Feb 2008 19:40:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (freefall.freebsd.org [IPv6:2001:4f8:fff6::28]) by mx1.freebsd.org (Postfix) with ESMTP id 227758FC23 for ; Thu, 28 Feb 2008 19:40:02 +0000 (UTC) (envelope-from gnats@FreeBSD.org) Received: from freefall.freebsd.org (gnats@localhost [127.0.0.1]) by freefall.freebsd.org (8.14.2/8.14.2) with ESMTP id m1SJe29I073148 for ; Thu, 28 Feb 2008 19:40:02 GMT (envelope-from gnats@freefall.freebsd.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.14.2/8.14.1/Submit) id m1SJe2D0073141; Thu, 28 Feb 2008 19:40:02 GMT (envelope-from gnats) Resent-Date: Thu, 28 Feb 2008 19:40:02 GMT Resent-Message-Id: <200802281940.m1SJe2D0073141@freefall.freebsd.org> Resent-From: FreeBSD-gnats-submit@FreeBSD.org (GNATS Filer) Resent-To: freebsd-bugs@FreeBSD.org Resent-Reply-To: FreeBSD-gnats-submit@FreeBSD.org, Andriy Gapon Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id E585B1065670 for ; Thu, 28 Feb 2008 19:38:47 +0000 (UTC) (envelope-from avg@kiev.net.ua) Received: from hosted.kievnet.com (hosted.kievnet.com [193.138.144.10]) by mx1.freebsd.org (Postfix) with ESMTP id 8F6048FC1B for ; Thu, 28 Feb 2008 19:38:47 +0000 (UTC) (envelope-from avg@kiev.net.ua) Received: from [91.193.172.111] (helo=edge) by hosted.kievnet.com with esmtpa (Exim 4.62) (envelope-from ) id 1JUoab-000DUF-4H for FreeBSD-gnats-submit@freebsd.org; Thu, 28 Feb 2008 21:38:45 +0200 Received: from edge (localhost [127.0.0.1]) by edge (8.14.2/8.14.2) with ESMTP id m1SJccxx020758 for ; Thu, 28 Feb 2008 21:38:38 +0200 (EET) (envelope-from avg@edge) Received: (from avg@localhost) by edge (8.14.2/8.14.2/Submit) id m1SJcbkU020757; Thu, 28 Feb 2008 21:38:37 +0200 (EET) (envelope-from avg) Message-Id: <200802281938.m1SJcbkU020757@edge> Date: Thu, 28 Feb 2008 21:38:37 +0200 (EET) From: Andriy Gapon To: FreeBSD-gnats-submit@FreeBSD.org X-Send-Pr-Version: 3.113 Cc: Subject: bin/121182: newfs_msdos should supports devices without CHS characteristics X-BeenThere: freebsd-bugs@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Bug reports List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 28 Feb 2008 19:40:02 -0000 >Number: 121182 >Category: bin >Synopsis: newfs_msdos should supports devices without CHS characteristics >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Feb 28 19:40:01 UTC 2008 >Closed-Date: >Last-Modified: >Originator: Andriy Gapon >Release: FreeBSD 7.0-RC1 i386 >Organization: >Environment: System: FreeBSD 7.0-RC1 i386 >Description: Currently newfs_msdos strictly requires that a device provides CHS characteristics. And this is the case even if a user provided values for those parameters via command line options. First, in a modern world CHS requirements are no longer valid. Second, user-provided overrides should be honored and undoubted. >How-To-Repeat: Try to format a DVD-RAM disk to FAT, e.g. FAT32: newfs_msdos -F 32 /dev/acd1 >Fix: The logic for faking CHS parameters is borrowed from bsdlabel code. --- newfs-chs.patch begins here --- --- newfs_msdos.c.orig 2008-02-21 21:35:00.000000000 +0200 +++ newfs_msdos.c 2008-02-21 21:56:13.000000000 +0200 @@ -739,13 +739,25 @@ /* 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; --- newfs-chs.patch ends here --- >Release-Note: >Audit-Trail: >Unformatted: