NetBSD Problem Report #55187

From www@netbsd.org  Mon Apr 20 12:50:16 2020
Return-Path: <www@netbsd.org>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits))
	(Client CN "mail.NetBSD.org", Issuer "mail.NetBSD.org CA" (not verified))
	by mollari.NetBSD.org (Postfix) with ESMTPS id 561191A9213
	for <gnats-bugs@gnats.NetBSD.org>; Mon, 20 Apr 2020 12:50:16 +0000 (UTC)
Message-Id: <20200420125015.41FAB1A924D@mollari.NetBSD.org>
Date: Mon, 20 Apr 2020 12:50:15 +0000 (UTC)
From: isaki@pastel-flower.jp
Reply-To: isaki@pastel-flower.jp
To: gnats-bugs@NetBSD.org
Subject: sysinst partition editor fails on x68k/9.0
X-Send-Pr-Version: www-1.0

>Number:         55187
>Category:       install
>Synopsis:       sysinst partition editor fails on x68k/9.0
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    martin
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Mon Apr 20 12:55:00 +0000 2020
>Last-Modified:  Tue Jun 30 18:25:01 +0000 2020
>Originator:     Tetsuya Isaki
>Release:        NetBSD 9.0
>Organization:
>Environment:
NetBSD 9.0/x68k
>Description:
On 9.0/x68k, sysinst partition editor fails if the target disk
has no Human68k partitions nor BSD disklabels.  Similar PR
(install/54921) which has already been closed is about if the
target disk has Human68k partitions but no BSD disklabels.

>How-To-Repeat:
Initialize harddisk by Human68k genuine FORMAT.X command
(and create no Human68k partitions) beforehand.
That is, there are no Human68k partitions nor BSD disklabels.

Boot from netbsd-9 (or -HEAD) sysinst.

Choose "a: Install NetBSD to hard disk".
Choose "b: Yes".
Choose "a: sd0 (512M)"
Choose "a: Set sizes of NetBSD partitions"
Then it displays the following partition table. (hand-copied)

| You can now change the sizes for the system partitions. ...
|
| Free space will be added to the partition marked with a '+'.
|
|     Size (sec)                            Filesystem
|     ----------------------------------- - --------------
| >a: 622592 (537919487)                  + /
|  b: 0                                     <swap>
|  c: 0                                     /tmp (mfs)
|  d: 0                                     /usr
|  e: 0                                     /var
|     ----------------------------------- - --------------
|  g: Add a user defined partition
|  h: Clone external partition(s)
|  i: Change input units (sectors/cylinders/MB/GB)
|  x: Go on.  Free space 537296895 sec.

As above, the size is strange.
537296895 of free space is 0x20067fff.  I found that this was
calculated by
     0x100000 (from partition[2].size by DIOCGDINFO)
 + 0x1fffffff (from partition[0].size by DIOCGDINFO)
 -    0x98000 (from pset->infos[0].size in bsddisklabel.c).

0x100000 is correct total number of sectors for this disk.  This
diskimage which I used was created by "dd count=512 bs=1m".
0x1fffffff is returned by readdisklabel() in
sys/arch/x68k/x68k/disksubr.c.

sd0 part of dmesg shows:
 sd0: fabricating a geometry
 sd0: 512 MB, 512 cyl, 64 head, 32 sec, 512 bytes/sect x 1048576 sectors
 sd0: async, 8-bit transfer

"disklabel -r sd0" shows:
 disklabel: could not read existing label


By the way, FYI, when I choose (forcely) "x: Go on" in this menu,
it displays following.  And it will naturally fail.

| We now have your disklabel partitions for sd0 below. ...
|
| Flags: (I)nstall, (N)ewfs.  Total size: 512M, free: 0B
|
|     Start (sec)    End (sec)   Size (sec)  FS type Flag Filesystem
|    ------------ ------------ ------------ -------- ---- -----------
| a:            0    536870910    536870911   unused N
| b:            0      1048575      1048576 Whole disk
| c:            0      1048575      1048576   4.2BSD
|    ------------ ------------ ------------ -------- ---- -----------
| e: Change input units (sectors/cylinders/MB/GB)
| f: Edit name fo the disk
| g: Clone external partition(s)
| h: Cancel
|>x: Partition sizes ok


On the other hand, sysinst on netbsd-8 (or before) does as following:

Choose "a: Install NetBSD to hard disk".
Choose "b: Yes".
Choose "a: sd0 (512M, ...)".
Choose "a: Set sizes of NetBSD partitions".
Then,

| You can now change the sizes for the system partitions. ...
|
| Free space will be added to the partition marked with a '+'.
|
|      MB         Cylinders   Sectors   Filesystem
| >a:    146   (383)       146    299008 + /
|  b:    128               128    262144   swap
|  c:      0                 0         0   /tmp (mfs)
|  d:      0                 0         0   /usr
|  e:      0                 0         0   /var
|  f:      0                 0         0   /home
|  g: Add a user defined partition
|  h: Change input units (sectors/cylinders/MB)
|  x: Accept partition sizes.  Free space 237 MB, 5 free partitions.

Even in this case, disklabel (and dmesg) is the same as above.
>Fix:
Sorry, I don't have.

>Release-Note:

>Audit-Trail:

Responsible-Changed-From-To: install-manager->martin
Responsible-Changed-By: martin@NetBSD.org
Responsible-Changed-When: Mon, 20 Apr 2020 17:26:35 +0000
Responsible-Changed-Why:
take


From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@netbsd.org
Cc: tsutsui@ceres.dti.ne.jp
Subject: Re: install/55187: sysinst partition editor fails on x68k/9.0
Date: Sat, 13 Jun 2020 08:51:41 +0900

 This seems to work around the problem.

 Index: disklabel.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/sysinst/disklabel.c,v
 retrieving revision 1.10.2.9
 diff -u -p -d -r1.10.2.9 disklabel.c
 --- disklabel.c	10 Feb 2020 21:39:37 -0000	1.10.2.9
 +++ disklabel.c	12 Jun 2020 23:22:10 -0000
 @@ -265,6 +265,19 @@ disklabel_parts_read(const char *disk, d
  		    && parts->l.d_partitions[part].p_size == 0)
  			continue;

 +		/*
 +		 * Some traditional MD readdisklabel(9) implementation
 +		 * could set p_size = 0x1fffffff for partition a
 +		 * if there is no valid disklabel.
 +		 * Ignore and reset such a bogus partition size.
 +		 */
 +		if (parts->l.d_partitions[part].p_fstype == FS_UNUSED &&
 +		    (parts->l.d_partitions[part].p_size >
 +		     parts->l.d_partitions[RAW_PART].p_size)) {
 +			parts->l.d_partitions[part].p_size = 0;
 +			continue;
 +		}
 +
  		parts->dp.num_part++;
  		if (parts->l.d_partitions[part].p_fstype == FS_UNUSED)
  			continue;

 ---

 c.f.
  http://cvsweb.netbsd.org/bsdweb.cgi/src/sys/arch/i386/i386/Attic/disksubr.c?annotate=1.4

 ---
 % grep '\[0\].*0x1fffffff' sys/arch/*/*/disksubr.c 
 sys/arch/pmax/pmax/disksubr.c:		lp->d_partitions[0].p_size = 0x1fffffff;
 sys/arch/x68k/x68k/disksubr.c:		lp->d_partitions[0].p_size = 0x1fffffff;
 ---

 Maybe we should also check explicit (p_size == 0x1fffffff)
 for possible larger disks?

 Note size of swap partition is set to zero due to
 PR/55375 because size of the target disk is
 512MB (smaller than DEFUSRSIZE (1024MB)).

 ---
 Izumi Tsutsui

From: "Izumi Tsutsui" <tsutsui@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/55187 CVS commit: src/sys/arch/x68k/x68k
Date: Thu, 18 Jun 2020 19:54:08 +0000

 Module Name:	src
 Committed By:	tsutsui
 Date:		Thu Jun 18 19:54:08 UTC 2020

 Modified Files:
 	src/sys/arch/x68k/x68k: disksubr.c

 Log Message:
 Use a sane default for size of partition a: rather than odd 0x1fffffff.

 The latter one seems derived from 386BSD (and 4.4BSD),
 but it could confuse sysinst as noted in PR/55187.
 Sync with most other modern ports that use secperunit
 as well as RAW_PART.


 To generate a diff of this commit:
 cvs rdiff -u -r1.35 -r1.36 src/sys/arch/x68k/x68k/disksubr.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/55187 CVS commit: [netbsd-9] src/sys/arch/x68k/x68k
Date: Tue, 30 Jun 2020 18:20:54 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Tue Jun 30 18:20:54 UTC 2020

 Modified Files:
 	src/sys/arch/x68k/x68k [netbsd-9]: disksubr.c

 Log Message:
 Pull up following revision(s) (requested by tsutsui in ticket #973):

 	sys/arch/x68k/x68k/disksubr.c: revision 1.36

 Use a sane default for size of partition a: rather than odd 0x1fffffff.

 The latter one seems derived from 386BSD (and 4.4BSD),
 but it could confuse sysinst as noted in PR/55187.

 Sync with most other modern ports that use secperunit
 as well as RAW_PART.


 To generate a diff of this commit:
 cvs rdiff -u -r1.35 -r1.35.4.1 src/sys/arch/x68k/x68k/disksubr.c

 Please note that diffs are not public domain; they are subject to the
 copyright notices on the relevant files.

>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.46 2020/01/03 16:35:01 leot Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2020 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.