Subject: kern/21723: dk_size() fails with no disklabel - should special-case RAW_PART
To: None <gnats-bugs@gnats.netbsd.org>
From: Alan Barrett <apb@cequrux.com>
List: netbsd-bugs
Date: 05/30/2003 23:14:14
>Number:         21723
>Category:       kern
>Synopsis:       dk_size() fails with no disklabel - should special-case RAW_PART
>Confidential:   no
>Severity:       serious
>Priority:       medium
>Responsible:    kern-bug-people
>State:          open
>Class:          sw-bug
>Submitter-Id:   net
>Arrival-Date:   Fri May 30 21:15:00 UTC 2003
>Closed-Date:
>Last-Modified:
>Originator:     Alan Barrett
>Release:        NetBSD 1.6T
>Organization:
Not much
>Environment:
/* $NetBSD: dksubr.c,v 1.7 2003/05/12 00:19:00 atatat Exp $ */
>Description:
The dk_size() function in sys/dev/dksubr.c is apparently intended to
return the size of a disk partition.  It seems reasonable to expect it
to work when passed the raw partition of a disk without a label, but it
fails.

This failure makes it impossible to swap to the raw partition on a "cgd"
device that does not have a disklabel.  I assume that it will also
prevent similar operations on other kinds of devices.

>How-To-Repeat:
0. Decide to use /dev/wd0e as an encrypted swap partition
   via a cgd layer.

1. Create a cgd paramsfile as follows:

	# cgdconfig -g -k random -o /etc/cgd/wd0e aes-cbc 192

2. Configure a cgd layer (cgd0) on top of wd0e using the paramsfile:

	# cgdconfig /dev/cgd0 /dev/wd0e /etc/cgd/wd0e

3. Try to enable /dev/cgd0d as a swap partition.  
   (Note that "d" is teh raw partition in NetBSD/i386.)

	# swapctl -a /dev/cgd0d
	swapctl: /dev/cgd0d: Device not configured

>Fix:
Apply this patch:

--- sys/dev/dksubr.c	12 May 2003 00:19:00 -0000	1.7
+++ sys/dev/dksubr.c	27 May 2003 15:29:41 -0000
@@ -221,6 +221,9 @@
 		return -1;
 
 	part = DISKPART(dev);
+	if (part == RAW_PART)
+		return dksc->sc_size;
+
 	is_open = dksc->sc_dkdev.dk_openmask & (1 << part);
 
 	if (!is_open && di->di_open(dev, 0, S_IFBLK, curproc))
>Release-Note:
>Audit-Trail:
>Unformatted: