NetBSD Problem Report #56890

From tsutsui@ceres.dti.ne.jp  Thu Jun 16 15:43:09 2022
Return-Path: <tsutsui@ceres.dti.ne.jp>
Received: from mail.netbsd.org (mail.netbsd.org [199.233.217.200])
	(using TLSv1.3 with cipher TLS_AES_256_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 E53D21A921F
	for <gnats-bugs@gnats.NetBSD.org>; Thu, 16 Jun 2022 15:43:09 +0000 (UTC)
Message-Id: <202206161542.25GFgx6T025001@ceres.dti.ne.jp>
Date: Fri, 17 Jun 2022 00:42:59 +0900 (JST)
From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
Reply-To: tsutsui@ceres.dti.ne.jp
To: gnats-bugs@NetBSD.org
Cc: tsutsui@ceres.dti.ne.jp
Subject: sysinst should ignore default label even in DISKLABEL_NO_ONDISK_VERIFY case
X-Send-Pr-Version: 3.95

>Number:         56890
>Category:       install
>Synopsis:       sysinst should ignore default label even in DISKLABEL_NO_ONDISK_VERIFY case
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    install-manager
>State:          closed
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Thu Jun 16 15:45:03 +0000 2022
>Closed-Date:    Tue Jan 10 17:31:18 +0000 2023
>Last-Modified:  Tue Jan 10 17:31:18 +0000 2023
>Originator:     Izumi Tsutsui
>Release:        NetBSD 9.99.97 202206111130Z snapshot
>Organization:
>Environment:
System: NetBSD 9.99.97 INSTALL
Architecture: m68k
Machine: x68k, maybe also amiga and some other ports
>Description:
In PR install 54582 https://gnats.netbsd.org/54582 MD
DISKLABEL_NO_ONDISK_VERIFY definitions were introduced to
disable on-disk presence verification of "real" disklabels
for ports that didn't have BSD disklabel but used MD
disk partition information.

However, in that case we should disable "disklabel -r" call
but should still check if the disklabel information returend
by DIOCGDINFO ioctl(2) is the default one, i.e. the target disk
doesn't have vaild label. Otherwise the inner (disklabel) partition
editor mis-detect pertitions per the default one, at least on x68k.

On x68k readdisklabel(9) via DIOCGDINFO returns as following data:
---
# disklabel sd0
# /dev/rsd0:
type: SCSI
disk: FIREBALL1024S
label: default label
flags:
bytes/sector: 512
sectors/track: 32
tracks/cylinder: 64
sectors/cylinder: 2048
cylinders: 1024
total sectors: 2097152
rpm: 3600
interleave: 1
trackskew: 0
cylinderskew: 0
headswitch: 0           # microseconds
track-to-track seek: 0  # microseconds
drivedata: 0

3 partitions:
#        size    offset     fstype [fsize bsize cpg/sgs]
 a:   2097152         0     unused      0     0        # (Cly.      0 -    1023)
 c:   2097152         0     unused      0     0        # (Cly.      0 -    1023)
disklabel: boot block size 0
disklabel: super block size 0
# 
---

then sysinst inner (disklabel) editor shows:

---
We now have your disklabel partitions for sd0 below.  This is your last chance to change
them.

Flags: (I)nstall, (N)ewfs.  Total size: 1024M, free: 32M

    Start (sec)    End (sec)   Size (sec)  FS type Flag Filesystem
   ------------ ------------ ------------ -------- ---- ----------------
a:            0     2097151       2097152   unused
b:            0     2097151       2097151 Whole disk
c:           64     2031679       2031616   4.2BSD IN   /
   ------------ ------------ ------------ -------- ---- ----------------
e: Add a partition
f: Change input units (sectors/cylinders/MB/GB)
g: Edit name of the disk
h: Clone external partition(s)
i: Cancel
x: Partition sizes ok
---

So the default label info should be ignored even on typical installation.

>How-To-Repeat:
See above.

>Fix:
Unfortunately it seems there is no MI way to detect whether the MD
readdisklabel(9) via DIOCGDINFO ioctl(2) returns the on-disk label
or the "default" one in case that the disk has no valid label.

For workaround, we can check possilbe default label values per
MD readdisklabel(9) implementation and perform existing "faked"
label code.

---

Index: usr.sbin/sysinst/disklabel.c
===================================================================
RCS file: /cvsroot/src/usr.sbin/sysinst/disklabel.c,v
retrieving revision 1.44
diff -u -p -d -r1.44 disklabel.c
--- usr.sbin/sysinst/disklabel.c	8 Aug 2021 21:50:10 -0000	1.44
+++ usr.sbin/sysinst/disklabel.c	15 Jun 2022 16:31:13 -0000
@@ -198,16 +198,7 @@ disklabel_parts_read(const char *disk, d
 	int fd;
 	char diskpath[MAXPATHLEN];
 	uint flags;
-#ifndef DISKLABEL_NO_ONDISK_VERIFY
-	bool have_raw_label = false;
-
-	/*
-	 * Verify we really have a disklabel.
-	 */
-	if (run_program(RUN_SILENT | RUN_ERROR_OK,
-	    "disklabel -r %s", disk) == 0)
-		have_raw_label = true;
-#endif
+	bool have_ondisk_label;

 	/* read partitions */

@@ -304,8 +295,52 @@ disklabel_parts_read(const char *disk, d
 	}
 	close(fd);

+	/*
+	 * Verify we really have a disklabel on the target disk.
+	 */
 #ifndef DISKLABEL_NO_ONDISK_VERIFY
-	if (!have_raw_label) {
+	have_ondisk_label = false;
+	if (run_program(RUN_SILENT | RUN_ERROR_OK,
+	    "disklabel -r %s", disk) == 0)
+		have_ondisk_label = true;
+#else
+	/*
+	 * disklabel(8) -r checks a native disklabel at LABELOFFSET sector,
+	 * but several ports don't have a native label and use emulated one
+	 * translated from port specific MD disk partition information.
+	 * Unfortunately, there is no MI way to check whether the disk has
+	 * a native BSD disklabel by readdisklabel(9) via DIOCGDINFO.
+	 * So check if returned label looks defaults set by readdisklabel(9).
+	 *
+	 * XXX these should be checked in MD hook functions.
+	 */
+
+	/* assume we have a label by default */
+	have_ondisk_label = true;
+
+	/* check default values on amiga */
+	if (parts->l.d_npartitions == RAW_PART + 1 &&
+	    parts->l.d_partitions[RAW_PART].p_size == 0x1fffffff &&
+	    parts->l.d_partitions[0].p_size ==
+	     parts->l.d_partitions[RAW_PART].p_size &&
+	    parts->l.d_partitions[0].p_offset == 0 &&
+	    parts->l.d_partitions[0].p_fstype == FS_BSDFFS) {
+		have_ondisk_label = false;
+	}
+
+	/* XXX maybe we should also check mac68k with Apple Partition Map */
+
+	/* check default values on x68k */
+	if (parts->l.d_npartitions == RAW_PART + 1 &&
+	    parts->l.d_partitions[0].p_size ==
+	     parts->l.d_partitions[RAW_PART].p_size &&
+	    parts->l.d_partitions[0].p_fstype == FS_UNUSED &&
+	    parts->l.d_bbsize == 0 && parts->l.d_sbsize == 0) {
+		have_ondisk_label = false;
+	}
+#endif
+
+	if (!have_ondisk_label) {
 		bool found_real_part = false;

 		if (parts->l.d_npartitions <= RAW_PART ||
@@ -338,7 +373,6 @@ no_valid_label:
 			return NULL;
 		}
 	}
-#endif

 	return &parts->dp;
 }

---

As noted in the above patch, MD checks should be implemented
in port speicifc md.c, but currently disklabel.c has no MD hooks.

Another possible workaround is to modify all MD readdisklabel(9)
(at least on amiga) to set non-zero "sbsize" and "bbsize" values
if the target disk has valid MD native label converted to the
BSD disklabel, and make sysinst check sbsize and bbsize, as
disklabel(8) already does.

---
Izumi Tsutsui

>Release-Note:

>Audit-Trail:
From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: 
Subject: Re: install/56890: sysinst should ignore default label even in
 DISKLABEL_NO_ONDISK_VERIFY case
Date: Thu, 16 Jun 2022 18:12:05 +0200

 On Thu, Jun 16, 2022 at 03:45:03PM +0000, Izumi Tsutsui wrote:
 > However, in that case we should disable "disklabel -r" call
 > but should still check if the disklabel information returend
 > by DIOCGDINFO ioctl(2) is the default one, i.e. the target disk
 > doesn't have vaild label.

 Yes, that would be preferable. But I have not found a good way to tell
 a default label from a non default one, the details differ from driver
 to driver. Im all open for suggestions.

 We can probably improve the current heuristic to deal with the x68k case
 better.

 Martin

From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: martin@duskware.de
Cc: gnats-bugs@netbsd.org, tsutsui@ceres.dti.ne.jp
Subject: Re: install/56890: sysinst should ignore default label even inDISKLABEL_NO_ONDISK_VERIFY
	 case
Date: Fri, 17 Jun 2022 02:32:20 +0900

 >  We can probably improve the current heuristic to deal with the x68k case
 >  better.

 Did you see patch in the PR?

 It looks the real problem is the "current heuristic" is never called
 if DISKLABEL_NO_ONDISK_VERIFY is defined.

 ---
 Izumi Tsutsui

From: Martin Husemann <martin@duskware.de>
To: gnats-bugs@netbsd.org
Cc: tsutsui@ceres.dti.ne.jp
Subject: Re: install/56890: sysinst should ignore default label even
 inDISKLABEL_NO_ONDISK_VERIFY case
Date: Sun, 19 Jun 2022 18:52:48 +0200

 On Thu, Jun 16, 2022 at 05:35:02PM +0000, Izumi Tsutsui wrote:
 >  Did you see patch in the PR?

 Sorry, no, had only quickly reacted on the PR in a hurry, but now had
 time to look at the issue in detail again.

 I like the patch, but would actually do the MD hooks change you proposed.
 How about documenting that if DISKLABEL_NO_ONDISK_VERIFY is defined, the
 MD code has to provide something like:

 	bool md_disklabel_is_default(const struct disklabel*);

 and move the two tests you implemented (for the two architectures currently
 defining DISKLABEL_NO_ONDISK_VERIFY) into their arch/md.c?

 FWIW: I have full amiga RDB and mac68k APM support on my post-10 todo
 list. The "clone partitions" support was supposed to help with that,
 e.g. to clone full driver, HFS or similar partitions to a new disk (w/o
 being able to create them from scratch natively).

 Martin

From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: gnats-bugs@netbsd.org
Cc: martin@duskware.de, tsutsui@ceres.dti.ne.jp
Subject: Re: install/56890: sysinst should ignore default label eveninDISKLABEL_NO_ONDISK_VERIFY
	 case
Date: Fri, 24 Jun 2022 00:26:24 +0900

 >  I like the patch, but would actually do the MD hooks change you proposed.
 >  How about documenting that if DISKLABEL_NO_ONDISK_VERIFY is defined, the
 >  MD code has to provide something like:
 >  
 >  	bool md_disklabel_is_default(const struct disklabel*);
 >  
 >  and move the two tests you implemented (for the two architectures currently
 >  defining DISKLABEL_NO_ONDISK_VERIFY) into their arch/md.c?

 Here is a dump one:
 ---

 Index: defs.h
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/sysinst/defs.h,v
 retrieving revision 1.84
 diff -u -p -d -r1.84 defs.h
 --- defs.h	19 Jun 2022 12:08:31 -0000	1.84
 +++ defs.h	23 Jun 2022 01:46:36 -0000
 @@ -667,6 +667,7 @@ bool	md_gpt_post_write(struct disk_parti
   */
  bool	md_pre_disklabel(struct install_partition_desc*, struct disk_partitions*);
  bool	md_post_disklabel(struct install_partition_desc*, struct disk_partitions*);
 +bool	md_disklabel_is_default(const struct disklabel *);
  int	md_pre_mount(struct install_partition_desc*, size_t);
  int	md_post_newfs(struct install_partition_desc*);
  int	md_post_extract(struct install_partition_desc*, bool upgrade);
 Index: disklabel.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/sysinst/disklabel.c,v
 retrieving revision 1.48
 diff -u -p -d -r1.48 disklabel.c
 --- disklabel.c	21 Jun 2022 16:08:25 -0000	1.48
 +++ disklabel.c	23 Jun 2022 01:46:36 -0000
 @@ -198,16 +198,7 @@ disklabel_parts_read(const char *disk, d
  	int fd;
  	char diskpath[MAXPATHLEN];
  	uint flags;
 -#ifndef DISKLABEL_NO_ONDISK_VERIFY
 -	bool have_raw_label = false;
 -
 -	/*
 -	 * Verify we really have a disklabel.
 -	 */
 -	if (run_program(RUN_SILENT | RUN_ERROR_OK,
 -	    "disklabel -r %s", disk) == 0)
 -		have_raw_label = true;
 -#endif
 +	bool have_own_label = false;

  	/* read partitions */

 @@ -304,8 +295,30 @@ disklabel_parts_read(const char *disk, d
  	}
  	close(fd);

 -#ifndef DISKLABEL_NO_ONDISK_VERIFY
 -	if (!have_raw_label) {
 +	/*
 +	 * Verify we really have a disklabel on the target disk.
 +	 */
 +	if (run_program(RUN_SILENT | RUN_ERROR_OK,
 +	    "disklabel -r %s", disk) == 0) {
 +		have_own_label = true;
 +	}
 +#ifdef DISKLABEL_NO_ONDISK_VERIFY
 +	else {
 +		/*
 +		 * disklabel(8) with -r checks a native disklabel at
 +		 * LABELOFFSET sector, but several ports don't have
 +		 * a native label and use emulated one translated from
 +		 * port specific MD disk partition information.
 +		 * Unfortunately, there is no MI way to check whether
 +		 * the disk has a native BSD disklabel by readdisklabel(9)
 +		 * via DIOCGDINFO.  So check if returned label looks
 +		 * defaults set by readdisklabel(9) per MD way.
 +		 */
 +		have_own_label = !md_disklabel_is_default(&parts->l);
 +	}
 +#endif
 +
 +	if (!have_own_label) {
  		bool found_real_part = false;

  		if (parts->l.d_npartitions <= RAW_PART ||
 @@ -338,7 +351,6 @@ no_valid_label:
  			return NULL;
  		}
  	}
 -#endif

  	return &parts->dp;
  }
 Index: arch/amiga/md.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/sysinst/arch/amiga/md.c,v
 retrieving revision 1.7
 diff -u -p -d -r1.7 md.c
 --- arch/amiga/md.c	29 Jan 2022 16:01:16 -0000	1.7
 +++ arch/amiga/md.c	23 Jun 2022 01:46:36 -0000
 @@ -100,6 +100,25 @@ md_post_disklabel(struct install_partiti
  	return true;
  }

 +#ifdef DISKLABEL_NO_ONDISK_VERIFY
 +/*
 + * hook to check if disklabel returned by readdisklabel(9) via DIOCGDINFO
 + * seems the default one, on ports that have no BSD disklabel on disks.
 + */
 +bool
 +md_disklabel_is_default(const struct disklabel *lp)
 +{
 +	bool maybe_default =
 +	    lp->d_npartitions == RAW_PART + 1 &&
 +	    lp->d_partitions[RAW_PART].p_size == 0x1fffffff &&
 +	    lp->d_partitions[0].p_size == lp->d_partitions[RAW_PART].p_size &&
 +	    lp->d_partitions[0].p_offset == 0;
 +	    lp->d_partitions[0].p_fstype == FS_BSDFFS;
 +
 +	return maybe_default;
 +}
 +#endif
 +
  /*
   * hook called after upgrade() or install() has finished setting
   * up the target disk but immediately before the user is given the
 Index: arch/x68k/md.c
 ===================================================================
 RCS file: /cvsroot/src/usr.sbin/sysinst/arch/x68k/md.c,v
 retrieving revision 1.12
 diff -u -p -d -r1.12 md.c
 --- arch/x68k/md.c	29 Jan 2022 16:01:21 -0000	1.12
 +++ arch/x68k/md.c	23 Jun 2022 01:46:36 -0000
 @@ -264,6 +264,25 @@ md_post_disklabel(struct install_partiti
  	return true;
  }

 +#ifdef DISKLABEL_NO_ONDISK_VERIFY
 +/*
 + * hook to check if disklabel returned by readdisklabel(9) via DIOCGDINFO
 + * seems the default one, on ports that have no BSD disklabel on disks.
 + */
 +bool
 +md_disklabel_is_default(const struct disklabel *lp)
 +{
 +	bool maybe_default =
 +	    lp->d_npartitions == RAW_PART + 1 &&
 +	    lp->d_partitions[0].p_size == lp->d_partitions[RAW_PART].p_size &&
 +	    lp->d_partitions[0].p_fstype == FS_UNUSED &&
 +	    lp->d_bbsize == 0 &&
 +	    lp->d_sbsize == 0;
 +
 +	return maybe_default;
 +}
 +#endif
 +
  /*
   * hook called after upgrade() or install() has finished setting
   * up the target disk but immediately before the user is given the

 ---

 Note several ports (including x68k) support both a BSD disklabel
 and port specific native OS derived label, so a check by disklabel -r
 might still be worth to try even in DISKLABEL_NO_ONDISK_VERIFY case.

 ---
 Izumi Tsutsui

From: Martin Husemann <martin@duskware.de>
To: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
Cc: gnats-bugs@netbsd.org
Subject: Re: install/56890: sysinst should ignore default label
 eveninDISKLABEL_NO_ONDISK_VERIFY case
Date: Thu, 23 Jun 2022 18:17:49 +0200

 On Fri, Jun 24, 2022 at 12:26:24AM +0900, Izumi Tsutsui wrote:
 > Here is a dump one:

 Looks good to me!

 > Note several ports (including x68k) support both a BSD disklabel
 > and port specific native OS derived label, so a check by disklabel -r
 > might still be worth to try even in DISKLABEL_NO_ONDISK_VERIFY case.

 Doesn't the kernel deal with both cases then? What would the additional
 "disklabel -r" return code buy us?

 Martin

From: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
To: martin@duskware.de
Cc: gnats-bugs@netbsd.org, tsutsui@ceres.dti.ne.jp
Subject: Re: install/56890: sysinst should ignore default labeleveninDISKLABEL_NO_ONDISK_VERIFY
	 case
Date: Fri, 24 Jun 2022 01:39:26 +0900

 > > Note several ports (including x68k) support both a BSD disklabel
 > > and port specific native OS derived label, so a check by disklabel -r
 > > might still be worth to try even in DISKLABEL_NO_ONDISK_VERIFY case.
 > 
 > Doesn't the kernel deal with both cases then? What would the additional
 > "disklabel -r" return code buy us?

 I'm not sure what's your point, but

 - disklabel(8) -r doesn't use ioctl(2) but just try to read BSD disklabel
   at LABELSECTOR directly via opendisk(3)
    https://nxr.netbsd.org/xref/src/sbin/disklabel/main.c?r=1.57#1208

 - x68k readdisklabel(9) via DIOCGDINFO checks BSD disklabel at LABELSECTOR
   first and if not found then checks Human68k partition
    https://nxr.netbsd.org/xref/src/sys/arch/x68k/x68k/disksubr.c?r=1.36#63

 So the former could return success (and could also fail) on x68k and
 we don't have to bother to check the latter ("looks like the default")
 if the former is valid.

 ---
 Izumi Tsutsui

From: Martin Husemann <martin@duskware.de>
To: Izumi Tsutsui <tsutsui@ceres.dti.ne.jp>
Cc: gnats-bugs@netbsd.org
Subject: Re: install/56890: sysinst should ignore default
 labeleveninDISKLABEL_NO_ONDISK_VERIFY case
Date: Thu, 23 Jun 2022 18:46:47 +0200

 On Fri, Jun 24, 2022 at 01:39:26AM +0900, Izumi Tsutsui wrote:
 > So the former could return success (and could also fail) on x68k and
 > we don't have to bother to check the latter ("looks like the default")
 > if the former is valid.

 I see - yes, good point.

 Martin

From: "Izumi Tsutsui" <tsutsui@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/56890 CVS commit: src/usr.sbin/sysinst
Date: Fri, 24 Jun 2022 22:28:11 +0000

 Module Name:	src
 Committed By:	tsutsui
 Date:		Fri Jun 24 22:28:11 UTC 2022

 Modified Files:
 	src/usr.sbin/sysinst: defs.h disklabel.c
 	src/usr.sbin/sysinst/arch/amiga: md.c
 	src/usr.sbin/sysinst/arch/x68k: md.c

 Log Message:
 Check on-disk disklabel properly even on ports without raw BSD disklabel.

 Fixes PR install/56890.


 To generate a diff of this commit:
 cvs rdiff -u -r1.84 -r1.85 src/usr.sbin/sysinst/defs.h
 cvs rdiff -u -r1.48 -r1.49 src/usr.sbin/sysinst/disklabel.c
 cvs rdiff -u -r1.7 -r1.8 src/usr.sbin/sysinst/arch/amiga/md.c
 cvs rdiff -u -r1.12 -r1.13 src/usr.sbin/sysinst/arch/x68k/md.c

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

State-Changed-From-To: open->needs-pullups
State-Changed-By: tsutsui@NetBSD.org
State-Changed-When: Thu, 29 Dec 2022 20:57:04 +0000
State-Changed-Why:
netbsd-9 affected


State-Changed-From-To: needs-pullups->pending-pullups
State-Changed-By: tsutsui@NetBSD.org
State-Changed-When: Sat, 31 Dec 2022 06:00:27 +0000
State-Changed-Why:
[pullup-9 #1559]


From: "Martin Husemann" <martin@netbsd.org>
To: gnats-bugs@gnats.NetBSD.org
Cc: 
Subject: PR/56890 CVS commit: [netbsd-9] src/usr.sbin/sysinst
Date: Mon, 2 Jan 2023 10:13:31 +0000

 Module Name:	src
 Committed By:	martin
 Date:		Mon Jan  2 10:13:31 UTC 2023

 Modified Files:
 	src/usr.sbin/sysinst [netbsd-9]: defs.h disklabel.c
 	src/usr.sbin/sysinst/arch/amiga [netbsd-9]: md.c
 	src/usr.sbin/sysinst/arch/x68k [netbsd-9]: md.c

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

 	usr.sbin/sysinst/arch/x68k/md.c: revision 1.13
 	usr.sbin/sysinst/disklabel.c: revision 1.49
 	usr.sbin/sysinst/defs.h: revision 1.85
 	usr.sbin/sysinst/arch/amiga/md.c: revision 1.8
 	usr.sbin/sysinst/arch/amiga/md.c: revision 1.9

 Check on-disk disklabel properly even on ports without raw BSD disklabel.
 Fixes PR install/56890.

 Fix typo


 To generate a diff of this commit:
 cvs rdiff -u -r1.42.2.11 -r1.42.2.12 src/usr.sbin/sysinst/defs.h
 cvs rdiff -u -r1.10.2.11 -r1.10.2.12 src/usr.sbin/sysinst/disklabel.c
 cvs rdiff -u -r1.5.2.3 -r1.5.2.4 src/usr.sbin/sysinst/arch/amiga/md.c
 cvs rdiff -u -r1.8.2.4 -r1.8.2.5 src/usr.sbin/sysinst/arch/x68k/md.c

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

State-Changed-From-To: pending-pullups->closed
State-Changed-By: tsutsui@NetBSD.org
State-Changed-When: Tue, 10 Jan 2023 17:31:18 +0000
State-Changed-Why:
Pulled up.


>Unformatted:

NetBSD Home
NetBSD PR Database Search

(Contact us) $NetBSD: query-full-pr,v 1.47 2022/09/11 19:34:41 kim Exp $
$NetBSD: gnats_config.sh,v 1.9 2014/08/02 14:16:04 spz Exp $
Copyright © 1994-2023 The NetBSD Foundation, Inc. ALL RIGHTS RESERVED.