Subject: Re: Pain about disklabel...
To: None <current-users@NetBSD.ORG>
From: der Mouse <mouse@Collatz.McRCIM.McGill.EDU>
List: current-users
Date: 01/20/1996 07:54:01
> dd if=/dev/zero of=rootfs.image bs=1M count=2
> vnconfig -c /dev/vnd0c rootfs.image
> newfs /dev/vnd0c

> but newfs insisted to get a disk with a disk label.

Yeah, I know.  I believe it's a bug.  Here's the PR I generated about
this, which as you can see attracted an addendum but no action.  You
may find the patch useful, though.  (Personally, I agree with thorpej
that vnds should support disk labels, but I also don't think newfs
should require a disklabel if you give -s, -t, and -u, because it
doesn't use anything from it in that case.)

					der Mouse

			    mouse@collatz.mcrcim.mcgill.edu

>Number:         1367
>Category:       bin
>Synopsis:       [dM] can't newfs non-disks
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    bin-bug-people (Utility Bug People)
>State:          open
>Class:          change-request
>Submitter-Id:   net
>Arrival-Date:   Thu Aug 17 15:05:01 1995
>Last-Modified:  
>Originator:     der Mouse
>Organization:
	Dis-
>Release:        -current as of this morning's sup (17 Aug '95)
>Environment:
	SPARC IPC, but it's irrelevant
>Description:
	newfs absolutely refuses to create filesystems on things that
	don't support the DIOCGDINFO ioctl (unless built with COMPAT,
	and then it requires a disk type name).  However, if -s, -t,
	and -u are given, newfs does not need the label for anything.
	This problem makes it much more difficult to use vnd devices,
	since one can't create a filesystem on one de novo.
>How-To-Repeat:
	Try to newfs a vnd device.  Or a file (trying to make it
	contain a filesystem image).  Or anything else....
>Fix:
	Here's the patch I'm using.  There are other problems I haven't
	corrected; for example, the "can't figure out file system
	partition" error, which really shouldn't be a fatal error.

diff -b -c -r /sources/latest-usr-src/sbin/newfs/mkfs.c /usr/src/sbin/newfs/mkfs.c
*** /sources/latest-usr-src/sbin/newfs/mkfs.c	Tue Jun 20 06:37:44 1995
--- /usr/src/sbin/newfs/mkfs.c	Thu Aug 17 14:44:58 1995
***************
*** 627,636 ****
--- 627,638 ----
  	 * Update information about this partion in pack
  	 * label, to that it may be updated on disk.
  	 */
+ 	if (pp) {
  		pp->p_fstype = FS_BSDFFS;
  		pp->p_fsize = sblock.fs_fsize;
  		pp->p_frag = sblock.fs_frag;
  		pp->p_cpg = sblock.fs_cpg;
+ 	}
  	/*
  	 * Notify parent process of success.
  	 * Dissociate from session and tty.
diff -b -c -r /sources/latest-usr-src/sbin/newfs/newfs.c /usr/src/sbin/newfs/newfs.c
*** /sources/latest-usr-src/sbin/newfs/newfs.c	Wed Jun 28 03:04:24 1995
--- /usr/src/sbin/newfs/newfs.c	Thu Aug 17 14:49:22 1995
***************
*** 428,433 ****
--- 428,435 ----
  			disktype = argv[1];
  #endif
  		lp = getdisklabel(special, fsi);
+ 		pp = 0;
+ 		if (lp) {
  			if (isdigit(*cp))
  				pp = &lp->d_partitions[0];
  			else
***************
*** 439,448 ****
  			fatal("%s: `%c' partition overlaps boot program",
  			      argv[0], *cp);
  	}
  havelabel:
  	if (fssize == 0)
  		fssize = pp->p_size;
! 	if (fssize > pp->p_size && !mfs)
  	       fatal("%s: maximum file system size on the `%c' partition is %d",
  			argv[0], *cp, pp->p_size);
  	if (rpm == 0) {
--- 441,465 ----
  				fatal("%s: `%c' partition overlaps boot program",
  				      argv[0], *cp);
  		}
+ 	}
  havelabel:
+ 	if (! pp) {
+ 		if ( (fssize == 0) ||
+ 		     (ntracks == 0) ||
+ 		     (nsectors == 0) )
+ 			fatal("%s: no label; must specify -s, -t, and -u",argv[0]);
+ 		if (sectorsize == 0) sectorsize = 512;
+ 		if (rpm == 0) rpm = 3600;
+ 		if (trackskew < 0) trackskew = 0;
+ 		if (interleave == 0) interleave = 1;
+ 		if (fsize == 0) fsize = DFL_FRAGSIZE;
+ 		if (bsize == 0) bsize = DFL_BLKSIZE;
+ 		if (trackspares < 0) trackspares = 0;
+ 		if (cylspares < 0) cylspares = 0;
+ 	}
  	if (fssize == 0)
  		fssize = pp->p_size;
! 	if (pp && fssize > pp->p_size && !mfs)
  	       fatal("%s: maximum file system size on the `%c' partition is %d",
  			argv[0], *cp, pp->p_size);
  	if (rpm == 0) {
***************
*** 512,530 ****
  			cylspares = 0;
  	}
  	secpercyl = nsectors * ntracks - cylspares;
! 	if (secpercyl != lp->d_secpercyl)
  		fprintf(stderr, "%s (%d) %s (%lu)\n",
  			"Warning: calculated sectors per cylinder", secpercyl,
  			"disagrees with disk label", lp->d_secpercyl);
  	if (maxbpg == 0)
  		maxbpg = MAXBLKPG(bsize);
! 	headswitch = lp->d_headswitch;
! 	trackseek = lp->d_trkseek;
  #ifdef notdef /* label may be 0 if faked up by kernel */
  	bbsize = lp->d_bbsize;
  	sbsize = lp->d_sbsize;
  #endif
! 	oldpartition = *pp;
  #ifdef tahoe
  	realsectorsize = sectorsize;
  	if (sectorsize != DEV_BSIZE) {		/* XXX */
--- 529,547 ----
  			cylspares = 0;
  	}
  	secpercyl = nsectors * ntracks - cylspares;
! 	if (lp && (secpercyl != lp->d_secpercyl))
  		fprintf(stderr, "%s (%d) %s (%lu)\n",
  			"Warning: calculated sectors per cylinder", secpercyl,
  			"disagrees with disk label", lp->d_secpercyl);
  	if (maxbpg == 0)
  		maxbpg = MAXBLKPG(bsize);
! 	headswitch = lp ? lp->d_headswitch : 0; /* XXX should have flag */
! 	trackseek = lp ? lp->d_trkseek : 0; /* XXX should have flag */
  #ifdef notdef /* label may be 0 if faked up by kernel */
  	bbsize = lp->d_bbsize;
  	sbsize = lp->d_sbsize;
  #endif
! 	if (pp) oldpartition = *pp;
  #ifdef tahoe
  	realsectorsize = sectorsize;
  	if (sectorsize != DEV_BSIZE) {		/* XXX */
***************
*** 535,549 ****
  		nphyssectors /= secperblk;
  		secpercyl /= secperblk;
  		fssize /= secperblk;
! 		pp->p_size /= secperblk;
  	}
  #endif
  	mkfs(pp, special, fsi, fso);
  #ifdef tahoe
! 	if (realsectorsize != DEV_BSIZE)
  		pp->p_size *= DEV_BSIZE / realsectorsize;
  #endif
! 	if (!Nflag && memcmp(pp, &oldpartition, sizeof(oldpartition)))
  		rewritelabel(special, fso, lp);
  	if (!Nflag)
  		close(fso);
--- 552,566 ----
  		nphyssectors /= secperblk;
  		secpercyl /= secperblk;
  		fssize /= secperblk;
! 		if (pp) pp->p_size /= secperblk;
  	}
  #endif
  	mkfs(pp, special, fsi, fso);
  #ifdef tahoe
! 	if (pp && (realsectorsize != DEV_BSIZE))
  		pp->p_size *= DEV_BSIZE / realsectorsize;
  #endif
! 	if (!Nflag && pp && memcmp(pp, &oldpartition, sizeof(oldpartition)))
  		rewritelabel(special, fso, lp);
  	if (!Nflag)
  		close(fso);
***************
*** 594,600 ****
  		}
  #endif
  		warn("ioctl (GDINFO)");
! 		fatal(lmsg, s);
  	}
  	return (&lab);
  }
--- 611,617 ----
  		}
  #endif
  		warn("ioctl (GDINFO)");
! 		return(0);
  	}
  	return (&lab);
  }

					der Mouse

			    mouse@collatz.mcrcim.mcgill.edu
>Audit-Trail:

From: Jason Thorpe <thorpej@nas.nasa.gov>
To: mouse@collatz.mcrcim.mcgill.edu
Cc: gnats-bugs@gnats.netbsd.org
Subject: Re: bin/1367: [dM] can't newfs non-disks 
Date: Thu, 17 Aug 1995 13:40:11 -0700

 On Thu, 17 Aug 1995 15:01:47 -0400 
  der Mouse <mouse@Collatz.McRCIM.McGill.EDU> wrote:
 
  > >Synopsis:       [dM] can't newfs non-disks
  > >Description:
  > 	newfs absolutely refuses to create filesystems on things that
  > 	don't support the DIOCGDINFO ioctl (unless built with COMPAT,
  > 	and then it requires a disk type name).  However, if -s, -t,
  > 	and -u are given, newfs does not need the label for anything.
  > 	This problem makes it much more difficult to use vnd devices,
  > 	since one can't create a filesystem on one de novo.
  > >How-To-Repeat:
  > 	Try to newfs a vnd device.  Or a file (trying to make it
  > 	contain a filesystem image).  Or anything else....
 
 Actually, it seems to me that the `correct' thing to do is to make, for 
 example, the vnd support the disklabel-related ioctls, and if one can't 
 be found, a fake label generated.  Then, one could write a disklabel to 
 the vnd (with, for example, identical geometry of the target disk) and 
 use it for all further operations.
 
 --------------------------------------------------------------------------
 Jason R. Thorpe                                       thorpej@nas.nasa.gov
 NASA Ames Research Center                               Home: 408.866.1912
 NAS: M/S 258-6                                          Work: 415.604.0935
 Moffett Field, CA 94035                                Pager: 415.428.6939
>Unformatted: