Module Name:    src
Committed By:   christos
Date:           Tue Dec  8 20:36:15 UTC 2015

Modified Files:
        src/sys/arch/atari/dev: hdfd.c
        src/sys/compat/linux/arch/i386: linux_machdep.c
        src/sys/compat/linux/common: linux_blkio.c linux_hdio.c
        src/sys/compat/netbsd32: netbsd32_ioctl.c netbsd32_ioctl.h
        src/sys/compat/sunos: sunos_ioctl.c
        src/sys/compat/sunos32: sunos32_ioctl.c
        src/sys/dev: ccd.c dksubr.c vnd.c
        src/sys/dev/isa: fd.c
        src/sys/dev/pud: pud_dev.c
        src/sys/dev/qbus: rf.c
        src/sys/dev/raidframe: rf_netbsdkintf.c
        src/sys/kern: init_main.c subr_disk.c subr_disk_open.c
        src/sys/miscfs/specfs: spec_vnops.c
        src/sys/rump/librump/rumpvfs: rumpblk.c
        src/sys/sys: disklabel.h dkio.h param.h

Log Message:
Replace DIOCGPART -> DIOCGPARTINFO which returns the data needed instead of
pointers.


To generate a diff of this commit:
cvs rdiff -u -r1.81 -r1.82 src/sys/arch/atari/dev/hdfd.c
cvs rdiff -u -r1.159 -r1.160 src/sys/compat/linux/arch/i386/linux_machdep.c
cvs rdiff -u -r1.17 -r1.18 src/sys/compat/linux/common/linux_blkio.c
cvs rdiff -u -r1.16 -r1.17 src/sys/compat/linux/common/linux_hdio.c
cvs rdiff -u -r1.82 -r1.83 src/sys/compat/netbsd32/netbsd32_ioctl.c
cvs rdiff -u -r1.52 -r1.53 src/sys/compat/netbsd32/netbsd32_ioctl.h
cvs rdiff -u -r1.63 -r1.64 src/sys/compat/sunos/sunos_ioctl.c
cvs rdiff -u -r1.32 -r1.33 src/sys/compat/sunos32/sunos32_ioctl.c
cvs rdiff -u -r1.165 -r1.166 src/sys/dev/ccd.c
cvs rdiff -u -r1.82 -r1.83 src/sys/dev/dksubr.c
cvs rdiff -u -r1.255 -r1.256 src/sys/dev/vnd.c
cvs rdiff -u -r1.109 -r1.110 src/sys/dev/isa/fd.c
cvs rdiff -u -r1.6 -r1.7 src/sys/dev/pud/pud_dev.c
cvs rdiff -u -r1.32 -r1.33 src/sys/dev/qbus/rf.c
cvs rdiff -u -r1.325 -r1.326 src/sys/dev/raidframe/rf_netbsdkintf.c
cvs rdiff -u -r1.476 -r1.477 src/sys/kern/init_main.c
cvs rdiff -u -r1.114 -r1.115 src/sys/kern/subr_disk.c
cvs rdiff -u -r1.12 -r1.13 src/sys/kern/subr_disk_open.c
cvs rdiff -u -r1.156 -r1.157 src/sys/miscfs/specfs/spec_vnops.c
cvs rdiff -u -r1.60 -r1.61 src/sys/rump/librump/rumpvfs/rumpblk.c
cvs rdiff -u -r1.118 -r1.119 src/sys/sys/disklabel.h
cvs rdiff -u -r1.21 -r1.22 src/sys/sys/dkio.h
cvs rdiff -u -r1.488 -r1.489 src/sys/sys/param.h

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

Modified files:

Index: src/sys/arch/atari/dev/hdfd.c
diff -u src/sys/arch/atari/dev/hdfd.c:1.81 src/sys/arch/atari/dev/hdfd.c:1.82
--- src/sys/arch/atari/dev/hdfd.c:1.81	Sun Apr 26 11:15:19 2015
+++ src/sys/arch/atari/dev/hdfd.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: hdfd.c,v 1.81 2015/04/26 15:15:19 mlelstv Exp $	*/
+/*	$NetBSD: hdfd.c,v 1.82 2015/12/08 20:36:14 christos Exp $	*/
 
 /*-
  * Copyright (c) 1996 Leo Weppelman
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: hdfd.c,v 1.81 2015/04/26 15:15:19 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: hdfd.c,v 1.82 2015/12/08 20:36:14 christos Exp $");
 
 #include "opt_ddb.h"
 
@@ -1306,7 +1306,7 @@ fdioctl(dev_t dev, u_long cmd, void *add
 
 	switch (cmd) {
 	case DIOCGDINFO:
-	case DIOCGPART:
+	case DIOCGPARTINFO:
 		fdgetdisklabel(fd, dev);
 		break;
 	}

Index: src/sys/compat/linux/arch/i386/linux_machdep.c
diff -u src/sys/compat/linux/arch/i386/linux_machdep.c:1.159 src/sys/compat/linux/arch/i386/linux_machdep.c:1.160
--- src/sys/compat/linux/arch/i386/linux_machdep.c:1.159	Sun Nov  9 12:48:07 2014
+++ src/sys/compat/linux/arch/i386/linux_machdep.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_machdep.c,v 1.159 2014/11/09 17:48:07 maxv Exp $	*/
+/*	$NetBSD: linux_machdep.c,v 1.160 2015/12/08 20:36:14 christos Exp $	*/
 
 /*-
  * Copyright (c) 1995, 2000, 2008, 2009 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.159 2014/11/09 17:48:07 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_machdep.c,v 1.160 2015/12/08 20:36:14 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vm86.h"
@@ -936,7 +936,7 @@ linux_machdepioctl(struct lwp *l, const 
 		bip = fd2biosinfo(curproc, fp);
 		ioctlf = fp->f_ops->fo_ioctl;
 		error = ioctlf(fp, DIOCGDEFLABEL, (void *)&label);
-		error1 = ioctlf(fp, DIOCGPART, (void *)&partp);
+		error1 = ioctlf(fp, DIOCGPARTINFO, (void *)&partp);
 		if (error != 0 && error1 != 0) {
 			error = error1;
 			goto out;

Index: src/sys/compat/linux/common/linux_blkio.c
diff -u src/sys/compat/linux/common/linux_blkio.c:1.17 src/sys/compat/linux/common/linux_blkio.c:1.18
--- src/sys/compat/linux/common/linux_blkio.c:1.17	Fri Mar 21 17:54:58 2008
+++ src/sys/compat/linux/common/linux_blkio.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_blkio.c,v 1.17 2008/03/21 21:54:58 ad Exp $	*/
+/*	$NetBSD: linux_blkio.c,v 1.18 2015/12/08 20:36:14 christos Exp $	*/
 
 /*
  * Copyright (c) 2001 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_blkio.c,v 1.17 2008/03/21 21:54:58 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_blkio.c,v 1.18 2015/12/08 20:36:14 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -68,7 +68,7 @@ linux_ioctl_blkio(struct lwp *l, const s
 	int error;
 	file_t *fp;
 	int (*ioctlf)(file_t *, u_long, void *);
-	struct partinfo partp;
+	struct partinfo pi;
 	struct disklabel label;
 
 	if ((fp = fd_getfile(SCARG(uap, fd))) == NULL)
@@ -85,19 +85,19 @@ linux_ioctl_blkio(struct lwp *l, const s
 		 * fails, it may be a disk without label; try to get
 		 * the default label and compute the size from it.
 		 */
-		error = ioctlf(fp, DIOCGPART, &partp);
+		error = ioctlf(fp, DIOCGPARTINFO, &pi);
 		if (error != 0) {
-			error = ioctlf(fp, DIOCGDEFLABEL, &label);
+			error = ioctlf(fp, DIOCGDINFO, &label);
 			if (error != 0)
 				break;
 			size = label.d_nsectors * label.d_ntracks *
 			    label.d_ncylinders;
 		} else
-			size = partp.part->p_size;
+			size = pi.pi_size;
 		error = copyout(&size, SCARG(uap, data), sizeof size);
 		break;
 	case LINUX_BLKSECTGET:
-		error = ioctlf(fp, DIOCGDEFLABEL, &label);
+		error = ioctlf(fp, DIOCGDINFO, &label);
 		if (error != 0)
 			break;
 		error = copyout(&label.d_secsize, SCARG(uap, data),

Index: src/sys/compat/linux/common/linux_hdio.c
diff -u src/sys/compat/linux/common/linux_hdio.c:1.16 src/sys/compat/linux/common/linux_hdio.c:1.17
--- src/sys/compat/linux/common/linux_hdio.c:1.16	Fri Mar 21 17:54:58 2008
+++ src/sys/compat/linux/common/linux_hdio.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: linux_hdio.c,v 1.16 2008/03/21 21:54:58 ad Exp $	*/
+/*	$NetBSD: linux_hdio.c,v 1.17 2015/12/08 20:36:14 christos Exp $	*/
 
 /*
  * Copyright (c) 2000 Wasabi Systems, Inc.
@@ -36,7 +36,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: linux_hdio.c,v 1.16 2008/03/21 21:54:58 ad Exp $");
+__KERNEL_RCSID(0, "$NetBSD: linux_hdio.c,v 1.17 2015/12/08 20:36:14 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -72,8 +72,8 @@ linux_ioctl_hdio(struct lwp *l, const st
 	struct file *fp;
 	int (*ioctlf)(struct file *, u_long, void *);
 	struct atareq req;
-	struct disklabel label, *labp;
-	struct partinfo partp;
+	struct disklabel label;
+	struct partinfo pi;
 	struct linux_hd_geometry hdg;
 	struct linux_hd_big_geometry hdg_big;
 
@@ -107,17 +107,16 @@ linux_ioctl_hdio(struct lwp *l, const st
 		error = linux_machdepioctl(l, uap, retval);
 		if (error == 0)
 			break;
-		error = ioctlf(fp, DIOCGDEFLABEL, &label);
-		error1 = ioctlf(fp, DIOCGPART, &partp);
+		error = ioctlf(fp, DIOCGDINFO, &label);
+		error1 = ioctlf(fp, DIOCGPARTINFO, &pi);
 		if (error != 0 && error1 != 0) {
 			error = error1;
 			break;
 		}
-		labp = error != 0 ? &label : partp.disklab;
-		hdg.start = error1 != 0 ? partp.part->p_offset : 0;
-		hdg.heads = labp->d_ntracks;
-		hdg.cylinders = labp->d_ncylinders;
-		hdg.sectors = labp->d_nsectors;
+		hdg.start = error1 != 0 ? pi.pi_offset : 0;
+		hdg.heads = label.d_ntracks;
+		hdg.cylinders = label.d_ncylinders;
+		hdg.sectors = label.d_nsectors;
 		error = copyout(&hdg, SCARG(uap, data), sizeof hdg);
 		break;
 	case LINUX_HDIO_GETGEO_BIG:
@@ -125,17 +124,16 @@ linux_ioctl_hdio(struct lwp *l, const st
 		if (error == 0)
 			break;
 	case LINUX_HDIO_GETGEO_BIG_RAW:
-		error = ioctlf(fp, DIOCGDEFLABEL, &label);
-		error1 = ioctlf(fp, DIOCGPART, &partp);
+		error = ioctlf(fp, DIOCGDINFO, &label);
+		error1 = ioctlf(fp, DIOCGPARTINFO, &pi);
 		if (error != 0 && error1 != 0) {
 			error = error1;
 			break;
 		}
-		labp = error != 0 ? &label : partp.disklab;
-		hdg_big.start = error1 != 0 ? partp.part->p_offset : 0;
-		hdg_big.heads = labp->d_ntracks;
-		hdg_big.cylinders = labp->d_ncylinders;
-		hdg_big.sectors = labp->d_nsectors;
+		hdg_big.start = error1 != 0 ? pi.pi_offset : 0;
+		hdg_big.heads = label.d_ntracks;
+		hdg_big.cylinders = label.d_ncylinders;
+		hdg_big.sectors = label.d_nsectors;
 		error = copyout(&hdg_big, SCARG(uap, data), sizeof hdg_big);
 		break;
 	case LINUX_HDIO_GET_UNMASKINTR:

Index: src/sys/compat/netbsd32/netbsd32_ioctl.c
diff -u src/sys/compat/netbsd32/netbsd32_ioctl.c:1.82 src/sys/compat/netbsd32/netbsd32_ioctl.c:1.83
--- src/sys/compat/netbsd32/netbsd32_ioctl.c:1.82	Sun Aug  2 03:37:57 2015
+++ src/sys/compat/netbsd32/netbsd32_ioctl.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_ioctl.c,v 1.82 2015/08/02 07:37:57 maxv Exp $	*/
+/*	$NetBSD: netbsd32_ioctl.c,v 1.83 2015/12/08 20:36:14 christos Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -31,7 +31,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.82 2015/08/02 07:37:57 maxv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: netbsd32_ioctl.c,v 1.83 2015/12/08 20:36:14 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -87,14 +87,6 @@ __KERNEL_RCSID(0, "$NetBSD: netbsd32_ioc
 
 /* convert to/from different structures */
 
-static inline void
-netbsd32_to_partinfo(struct netbsd32_partinfo *s32p, struct partinfo *p, u_long cmd)
-{
-
-	p->disklab = (struct disklabel *)NETBSD32PTR64(s32p->disklab);
-	p->part = (struct partition *)NETBSD32PTR64(s32p->part);
-}
-
 #if 0
 static inline void
 netbsd32_to_format_op(struct netbsd32_format_op *s32p, struct format_op *p, u_long cmd)
@@ -487,14 +479,6 @@ netbsd32_to_npf_ioctl_table(
  * handle ioctl conversions from 64-bit kernel -> netbsd32
  */
 
-static inline void
-netbsd32_from_partinfo(struct partinfo *p, struct netbsd32_partinfo *s32p, u_long cmd)
-{
-
-	NETBSD32PTR32(s32p->disklab, p->disklab);
-	NETBSD32PTR32(s32p->part, p->part);
-}
-
 #if 0
 static inline void
 netbsd32_from_format_op(struct format_op *p, struct netbsd32_format_op *s32p, u_long cmd)
@@ -1066,8 +1050,6 @@ netbsd32_ioctl(struct lwp *l, const stru
 	case AUDIO_WSEEK32:
 		IOCTL_CONV_TO(AUDIO_WSEEK, u_long);
 
-	case DIOCGPART32:
-		IOCTL_STRUCT_CONV_TO(DIOCGPART, partinfo);
 #if 0	/* not implemented by anything */
 	case DIOCRFORMAT32:
 		IOCTL_STRUCT_CONV_TO(DIOCRFORMAT, format_op);

Index: src/sys/compat/netbsd32/netbsd32_ioctl.h
diff -u src/sys/compat/netbsd32/netbsd32_ioctl.h:1.52 src/sys/compat/netbsd32/netbsd32_ioctl.h:1.53
--- src/sys/compat/netbsd32/netbsd32_ioctl.h:1.52	Mon Jun  1 12:07:27 2015
+++ src/sys/compat/netbsd32/netbsd32_ioctl.h	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: netbsd32_ioctl.h,v 1.52 2015/06/01 16:07:27 roy Exp $	*/
+/*	$NetBSD: netbsd32_ioctl.h,v 1.53 2015/12/08 20:36:14 christos Exp $	*/
 
 /*
  * Copyright (c) 1998, 2001 Matthew R. Green
@@ -71,13 +71,6 @@
 /* from <sys/dkio.h> */
 typedef netbsd32_pointer_t netbsd32_disklabel_tp_t;
 typedef netbsd32_pointer_t netbsd32_partition_tp_t;
-struct netbsd32_partinfo {
-	netbsd32_disklabel_tp_t disklab;
-	netbsd32_partition_tp_t part;
-};
-#if 1
-#define DIOCGPART32	_IOW('d', 104, struct netbsd32_partinfo)	/* get partition */
-#endif
 
 #if 0	/* not implemented by anything */
 struct netbsd32_format_op {

Index: src/sys/compat/sunos/sunos_ioctl.c
diff -u src/sys/compat/sunos/sunos_ioctl.c:1.63 src/sys/compat/sunos/sunos_ioctl.c:1.64
--- src/sys/compat/sunos/sunos_ioctl.c:1.63	Sat Sep 26 00:13:39 2015
+++ src/sys/compat/sunos/sunos_ioctl.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos_ioctl.c,v 1.63 2015/09/26 04:13:39 christos Exp $	*/
+/*	$NetBSD: sunos_ioctl.c,v 1.64 2015/12/08 20:36:14 christos Exp $	*/
 
 /*
  * Copyright (c) 1993 Markus Wild.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos_ioctl.c,v 1.63 2015/09/26 04:13:39 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos_ioctl.c,v 1.64 2015/12/08 20:36:14 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -871,8 +871,12 @@ sunos_sys_ioctl(struct lwp *l, const str
 	case SUN_DKIOCGPART:
             {
 		struct partinfo pi;
+		struct disklabel label;
 
-		error = (*ctl)(fp, DIOCGPART, &pi);
+		error = (*ctl)(fp, DIOCGDINFO, &label);
+		if (error)
+			break;
+		error = (*ctl)(fp, DIOCGPARTINFO, &pi);
 		if (error)
 			break;
 
@@ -880,14 +884,14 @@ sunos_sys_ioctl(struct lwp *l, const str
 			error = ERANGE;	/* XXX */
 			break;
 		}
-		if (pi.part->p_offset % pi.disklab->d_secpercyl != 0) {
+		if (pi.pi_offset % label.d_secpercyl != 0) {
 			error = ERANGE;	/* XXX */
 			break;
 		}
 
 #define datapart	((struct sun_dkpart *)SCARG(uap, data))
-		datapart->sdkp_cyloffset = pi.part->p_offset / pi.disklab->d_secpercyl;
-		datapart->sdkp_nsectors = pi.part->p_size;
+		datapart->sdkp_cyloffset = pi.pi_offset / label.d_secpercyl;
+		datapart->sdkp_nsectors = pi.pi_size;
 #undef datapart
 		break;
 	    }

Index: src/sys/compat/sunos32/sunos32_ioctl.c
diff -u src/sys/compat/sunos32/sunos32_ioctl.c:1.32 src/sys/compat/sunos32/sunos32_ioctl.c:1.33
--- src/sys/compat/sunos32/sunos32_ioctl.c:1.32	Sat Sep 26 00:13:39 2015
+++ src/sys/compat/sunos32/sunos32_ioctl.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: sunos32_ioctl.c,v 1.32 2015/09/26 04:13:39 christos Exp $	*/
+/*	$NetBSD: sunos32_ioctl.c,v 1.33 2015/12/08 20:36:14 christos Exp $	*/
 /* from: NetBSD: sunos_ioctl.c,v 1.35 2001/02/03 22:20:02 mrg Exp 	*/
 
 /*
@@ -54,7 +54,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: sunos32_ioctl.c,v 1.32 2015/09/26 04:13:39 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: sunos32_ioctl.c,v 1.33 2015/12/08 20:36:14 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd32.h"
@@ -899,19 +899,24 @@ sunos32_sys_ioctl(struct lwp *l, const s
 	case SUN_DKIOCGPART:
             {
 		struct partinfo pi;
+		struct disklabel label;
+		int fd = SCARG(&bsd_ua, fd);
 
-		error = sunos32_do_ioctl(SCARG(&bsd_ua, fd), DIOCGPART, &pi, l);
+		error = sunos32_do_ioctl(fd, DIOCGPARTINFO, &pi, l);
 		if (error)
-			return (error);
+			return error;
+		error = sunos32_do_ioctl(fd, DIOCGDINFO, &label, l);
+		if (error)
+			return error;
 
-		if (pi.disklab->d_secpercyl == 0)
-			return (ERANGE);	/* XXX */
-		if (pi.part->p_offset % pi.disklab->d_secpercyl != 0)
-			return (ERANGE);	/* XXX */
+		if (label.d_secpercyl == 0)
+			return ERANGE;	/* XXX */
+		if (pi.pi_offset % label.d_secpercyl != 0)
+			return ERANGE;	/* XXX */
 		/* XXX can't do direct writes to a user address (dsl) */
 #define datapart	((struct sun_dkpart *)SCARG_P32(uap, data))
-		datapart->sdkp_cyloffset = pi.part->p_offset / pi.disklab->d_secpercyl;
-		datapart->sdkp_nsectors = pi.part->p_size;
+		datapart->sdkp_cyloffset = pi.pi_offset / label.d_secpercyl;
+		datapart->sdkp_nsectors = pi.pi_size;
 #undef datapart
 	    }
 

Index: src/sys/dev/ccd.c
diff -u src/sys/dev/ccd.c:1.165 src/sys/dev/ccd.c:1.166
--- src/sys/dev/ccd.c:1.165	Thu Aug 20 10:40:17 2015
+++ src/sys/dev/ccd.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: ccd.c,v 1.165 2015/08/20 14:40:17 christos Exp $	*/
+/*	$NetBSD: ccd.c,v 1.166 2015/12/08 20:36:14 christos Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 1999, 2007, 2009 The NetBSD Foundation, Inc.
@@ -88,7 +88,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.165 2015/08/20 14:40:17 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: ccd.c,v 1.166 2015/12/08 20:36:14 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_compat_netbsd.h"
@@ -1182,7 +1182,7 @@ ccdioctl(dev_t dev, u_long cmd, void *da
 	case DIOCMWEDGES:
 	case DIOCSDINFO:
 	case DIOCWDINFO:
-	case DIOCGPART:
+	case DIOCGPARTINFO:
 	case DIOCWLABEL:
 	case DIOCKLABEL:
 	case DIOCGDEFLABEL:

Index: src/sys/dev/dksubr.c
diff -u src/sys/dev/dksubr.c:1.82 src/sys/dev/dksubr.c:1.83
--- src/sys/dev/dksubr.c:1.82	Sat Nov 28 09:37:49 2015
+++ src/sys/dev/dksubr.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/* $NetBSD: dksubr.c,v 1.82 2015/11/28 14:37:49 mlelstv Exp $ */
+/* $NetBSD: dksubr.c,v 1.83 2015/12/08 20:36:14 christos Exp $ */
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 1999, 2002, 2008 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.82 2015/11/28 14:37:49 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.83 2015/12/08 20:36:14 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -509,7 +509,7 @@ dk_ioctl(struct dk_softc *dksc, dev_t de
 	case DIOCGDINFO:
 	case DIOCSDINFO:
 	case DIOCWDINFO:
-	case DIOCGPART:
+	case DIOCGPARTINFO:
 	case DIOCKLABEL:
 	case DIOCWLABEL:
 	case DIOCGDEFLABEL:

Index: src/sys/dev/vnd.c
diff -u src/sys/dev/vnd.c:1.255 src/sys/dev/vnd.c:1.256
--- src/sys/dev/vnd.c:1.255	Mon Nov 30 01:04:47 2015
+++ src/sys/dev/vnd.c	Tue Dec  8 15:36:14 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: vnd.c,v 1.255 2015/11/30 06:04:47 mlelstv Exp $	*/
+/*	$NetBSD: vnd.c,v 1.256 2015/12/08 20:36:14 christos Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2008 The NetBSD Foundation, Inc.
@@ -91,7 +91,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.255 2015/11/30 06:04:47 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vnd.c,v 1.256 2015/12/08 20:36:14 christos Exp $");
 
 #if defined(_KERNEL_OPT)
 #include "opt_vnd.h"
@@ -1205,7 +1205,7 @@ vndioctl(dev_t dev, u_long cmd, void *da
 	case DIOCGDINFO:
 	case DIOCSDINFO:
 	case DIOCWDINFO:
-	case DIOCGPART:
+	case DIOCGPARTINFO:
 	case DIOCKLABEL:
 	case DIOCWLABEL:
 	case DIOCGDEFLABEL:

Index: src/sys/dev/isa/fd.c
diff -u src/sys/dev/isa/fd.c:1.109 src/sys/dev/isa/fd.c:1.110
--- src/sys/dev/isa/fd.c:1.109	Sun Apr 26 11:15:20 2015
+++ src/sys/dev/isa/fd.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: fd.c,v 1.109 2015/04/26 15:15:20 mlelstv Exp $	*/
+/*	$NetBSD: fd.c,v 1.110 2015/12/08 20:36:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1998, 2003, 2008 The NetBSD Foundation, Inc.
@@ -81,7 +81,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.109 2015/04/26 15:15:20 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: fd.c,v 1.110 2015/12/08 20:36:15 christos Exp $");
 
 #include "opt_ddb.h"
 
@@ -1411,7 +1411,7 @@ fdioctl(dev_t dev, u_long cmd, void *add
 #endif
 
 	switch (cmd) {
-	case DIOCGPART:
+	case DIOCGPARTINFO:
 	case DIOCGDINFO:
 #ifdef __HAVE_OLD_DISKLABEL
 	case ODIOCGDINFO:

Index: src/sys/dev/pud/pud_dev.c
diff -u src/sys/dev/pud/pud_dev.c:1.6 src/sys/dev/pud/pud_dev.c:1.7
--- src/sys/dev/pud/pud_dev.c:1.6	Tue Dec 22 12:32:03 2009
+++ src/sys/dev/pud/pud_dev.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: pud_dev.c,v 1.6 2009/12/22 17:32:03 pooka Exp $	*/
+/*	$NetBSD: pud_dev.c,v 1.7 2015/12/08 20:36:15 christos Exp $	*/
 
 /*
  * Copyright (c) 2007  Antti Kantee.  All Rights Reserved.
@@ -29,7 +29,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pud_dev.c,v 1.6 2009/12/22 17:32:03 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pud_dev.c,v 1.7 2015/12/08 20:36:15 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -58,36 +58,13 @@ doopenclose(dev_t dev, int flags, int fm
 }
 
 #include <sys/disklabel.h>
-/*
- * XXX: this is not "reentrant".  But then again, partinfo isn't
- * exactly safe in any case.
- */
-static struct disklabel dl_partinfo;
-
 static int
 doioctl(dev_t dev, u_long cmd, void *data, int flag, int class, int type)
 {
 	struct pud_req_ioctl *pc_ioctl;
 	size_t dlen, allocsize;
-	u_long origcmd = cmd;
-	void *origdata = NULL; /* XXXgcc */
 	int error;
 
-	/*
-	 * XXX: kludge.  This is a horrible abstraction violation, but
-	 * then again DIOCGPART is a horrible ioctl (even more horrible
-	 * than the generic ioctl).  We handle it specially here since
-	 * the server in userspace has no chance to handle it.  And it's
-	 * a common operation used by most file systems.  But really, it
-	 * should be replaced by something a bit more ... transactional.
-	 */
-	if (cmd == DIOCGPART) {
-		cmd = DIOCGDINFO;
-		origdata = data;
-		flag = 0;
-		data = &dl_partinfo;
-	}
-
 	dlen = IOCPARM_LEN(cmd);
 	allocsize = sizeof(struct pud_req_ioctl) + dlen;
 	pc_ioctl = kmem_zalloc(allocsize, KM_SLEEP);
@@ -103,39 +80,6 @@ doioctl(dev_t dev, u_long cmd, void *dat
 	if (cmd & IOC_OUT)
 		memcpy(data, pc_ioctl->pm_data, dlen);
 
-	/*
-	 * In case doing the infamous DIOCGPART, issue the real
-	 * ioctl and do pointer arithmetic to figure out the right
-	 * partition.  We could use DISKPART() too, but this seems
-	 * "better".
-	 */
-	if (origcmd == DIOCGPART) {
-		struct partinfo *pi, *pi_user;
-		int labidx;
-
-		CTASSERT(sizeof(struct partinfo) <= sizeof(struct disklabel));
-
-		pc_ioctl->pm_iocmd = DIOCGPART;
-		pc_ioctl->pm_flag = 0;
-
-		error = pud_request(dev, pc_ioctl, allocsize, class, type);
-		if (error)
-			goto out;
-
-		pi_user = (struct partinfo *)pc_ioctl->pm_data;
-		labidx = pi_user->part - &pi_user->disklab->d_partitions[0];
-		/* userspace error, but punish caller, since we have no infra */
-		if (labidx >= MAXPARTITIONS) {
-			error = E2BIG;
-			goto out;
-		}
-
-		pi = origdata;
-		pi->disklab = &dl_partinfo;
-		pi->part = &dl_partinfo.d_partitions[labidx];
-
-	}
-
  out:
 	kmem_free(pc_ioctl, allocsize);
 	return error;

Index: src/sys/dev/qbus/rf.c
diff -u src/sys/dev/qbus/rf.c:1.32 src/sys/dev/qbus/rf.c:1.33
--- src/sys/dev/qbus/rf.c:1.32	Sun Apr 26 11:15:20 2015
+++ src/sys/dev/qbus/rf.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf.c,v 1.32 2015/04/26 15:15:20 mlelstv Exp $	*/
+/*	$NetBSD: rf.c,v 1.33 2015/12/08 20:36:15 christos Exp $	*/
 /*
  * Copyright (c) 2002 Jochen Kunz.
  * All rights reserved.
@@ -36,7 +36,7 @@ TODO:
 */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf.c,v 1.32 2015/04/26 15:15:20 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf.c,v 1.33 2015/12/08 20:36:15 christos Exp $");
 
 /* autoconfig stuff */
 #include <sys/param.h>
@@ -1101,7 +1101,7 @@ rfioctl(dev_t dev, u_long cmd, void *dat
 		return error;
 
 	switch (cmd) {
-	/* get and set disklabel; DIOCGPART used internally */
+	/* get and set disklabel; DIOCGPARTINFO used internally */
 	case DIOCSDINFO: /* set */
 		return(0);
 	case DIOCWDINFO: /* set, update disk */

Index: src/sys/dev/raidframe/rf_netbsdkintf.c
diff -u src/sys/dev/raidframe/rf_netbsdkintf.c:1.325 src/sys/dev/raidframe/rf_netbsdkintf.c:1.326
--- src/sys/dev/raidframe/rf_netbsdkintf.c:1.325	Thu Aug 20 10:40:18 2015
+++ src/sys/dev/raidframe/rf_netbsdkintf.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: rf_netbsdkintf.c,v 1.325 2015/08/20 14:40:18 christos Exp $	*/
+/*	$NetBSD: rf_netbsdkintf.c,v 1.326 2015/12/08 20:36:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1998, 2008-2011 The NetBSD Foundation, Inc.
@@ -101,7 +101,7 @@
  ***********************************************************/
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.325 2015/08/20 14:40:18 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rf_netbsdkintf.c,v 1.326 2015/12/08 20:36:15 christos Exp $");
 
 #ifdef _KERNEL_OPT
 #include "opt_compat_netbsd.h"
@@ -1114,7 +1114,7 @@ raidioctl(dev_t dev, u_long cmd, void *d
 	case ODIOCSDINFO:
 	case ODIOCGDEFLABEL:
 #endif
-	case DIOCGPART:
+	case DIOCGPARTINFO:
 	case DIOCWLABEL:
 	case DIOCGDEFLABEL:
 	case DIOCAWEDGE:

Index: src/sys/kern/init_main.c
diff -u src/sys/kern/init_main.c:1.476 src/sys/kern/init_main.c:1.477
--- src/sys/kern/init_main.c:1.476	Mon Dec  7 06:38:46 2015
+++ src/sys/kern/init_main.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: init_main.c,v 1.476 2015/12/07 11:38:46 pgoyette Exp $	*/
+/*	$NetBSD: init_main.c,v 1.477 2015/12/08 20:36:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008, 2009 The NetBSD Foundation, Inc.
@@ -97,7 +97,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.476 2015/12/07 11:38:46 pgoyette Exp $");
+__KERNEL_RCSID(0, "$NetBSD: init_main.c,v 1.477 2015/12/08 20:36:15 christos Exp $");
 
 #include "opt_ddb.h"
 #include "opt_inet.h"
@@ -794,7 +794,7 @@ configure3(void)
 static void
 rootconf_handle_wedges(void)
 {
-	struct partinfo dpart;
+	struct disklabel label;
 	struct partition *p;
 	struct vnode *vp;
 	daddr_t startblk;
@@ -827,7 +827,7 @@ rootconf_handle_wedges(void)
 		if (vp == NULL)
 			return;
 
-		error = VOP_IOCTL(vp, DIOCGPART, &dpart, FREAD, NOCRED);
+		error = VOP_IOCTL(vp, DIOCGDINFO, &label, FREAD, NOCRED);
 		VOP_CLOSE(vp, FREAD, NOCRED);
 		vput(vp);
 		if (error)
@@ -836,7 +836,7 @@ rootconf_handle_wedges(void)
 		KASSERT(booted_partition >= 0
 			&& booted_partition < MAXPARTITIONS);
 
-		p = &dpart.disklab->d_partitions[booted_partition];
+		p = &label.d_partitions[booted_partition];
 
 		dev      = booted_device;
 		startblk = p->p_offset;

Index: src/sys/kern/subr_disk.c
diff -u src/sys/kern/subr_disk.c:1.114 src/sys/kern/subr_disk.c:1.115
--- src/sys/kern/subr_disk.c:1.114	Sat Nov 28 09:36:00 2015
+++ src/sys/kern/subr_disk.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_disk.c,v 1.114 2015/11/28 14:36:00 mlelstv Exp $	*/
+/*	$NetBSD: subr_disk.c,v 1.115 2015/12/08 20:36:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1996, 1997, 1999, 2000, 2009 The NetBSD Foundation, Inc.
@@ -67,7 +67,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.114 2015/11/28 14:36:00 mlelstv Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_disk.c,v 1.115 2015/12/08 20:36:15 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/kernel.h>
@@ -502,7 +502,8 @@ disk_ioctl(struct disk *dk, dev_t dev, u
     struct lwp *l)
 {
 	struct dkwedge_info *dkw;
-	struct partinfo *pt;
+	struct partinfo *pi;
+	struct partition *dp;
 #ifdef __HAVE_OLD_DISKLABEL
 	struct disklabel newlabel;
 #endif
@@ -531,11 +532,15 @@ disk_ioctl(struct disk *dk, dev_t dev, u
 	/* The following should be moved to dk_ioctl */
 	switch (cmd) {
 	case DIOCGDINFO:
+		if (dk->dk_label == NULL)
+			return EBUSY;
 		memcpy(data, dk->dk_label, sizeof (*dk->dk_label));
 		return 0;
 
 #ifdef __HAVE_OLD_DISKLABEL
 	case ODIOCGDINFO:
+		if (dk->dk_label == NULL)
+			return EBUSY;
 		memcpy(&newlabel, dk->dk_label, sizeof(newlabel));
 		if (newlabel.d_npartitions > OLDMAXPARTITIONS)
 			return ENOTTY;
@@ -543,12 +548,46 @@ disk_ioctl(struct disk *dk, dev_t dev, u
 		return 0;
 #endif
 
-	case DIOCGPART:
+	case DIOCGPARTINFO:
+		pi = data;
+		memset(pi, 0, sizeof(*pi));
+		pi->pi_secsize = dk->dk_geom.dg_secsize;
+		pi->pi_bsize = BLKDEV_IOSIZE;
+
+		if (DISKPART(dev) == RAW_PART) {
+			pi->pi_size = dk->dk_geom.dg_secperunit;
+			return 0;
+		}
+
 		if (dk->dk_label == NULL)
 			return EBUSY;
-		pt = data;
-		pt->disklab = dk->dk_label;
-		pt->part = &dk->dk_label->d_partitions[DISKPART(dev)];
+
+		dp = &dk->dk_label->d_partitions[DISKPART(dev)];
+		pi->pi_offset = dp->p_offset;
+		pi->pi_size = dp->p_size;
+
+		pi->pi_fstype = dp->p_fstype;
+		pi->pi_frag = dp->p_frag;
+		pi->pi_fsize = dp->p_fsize;
+		pi->pi_cpg = dp->p_cpg;
+		
+		/*
+		 * dholland 20130616: XXX this logic should not be
+		 * here. It is here because the old buffer cache
+		 * demands that all accesses to the same blocks need
+		 * to be the same size; but it only works for FFS and
+		 * nowadays I think it'll fail silently if the size
+		 * info in the disklabel is wrong. (Or missing.) The
+		 * buffer cache needs to be smarter; or failing that
+		 * we need a reliable way here to get the right block
+		 * size; or a reliable way to guarantee that (a) the
+		 * fs is not mounted when we get here and (b) any
+		 * buffers generated here will get purged when the fs
+		 * does get mounted.
+		 */
+		if (dp->p_fstype == FS_BSDFFS &&
+		    dp->p_frag != 0 && dp->p_fsize != 0)
+			pi->pi_bsize = dp->p_frag * dp->p_fsize;
 		return 0;
 
 	case DIOCAWEDGE:

Index: src/sys/kern/subr_disk_open.c
diff -u src/sys/kern/subr_disk_open.c:1.12 src/sys/kern/subr_disk_open.c:1.13
--- src/sys/kern/subr_disk_open.c:1.12	Wed Dec 31 14:50:14 2014
+++ src/sys/kern/subr_disk_open.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: subr_disk_open.c,v 1.12 2014/12/31 19:50:14 christos Exp $	*/
+/*	$NetBSD: subr_disk_open.c,v 1.13 2015/12/08 20:36:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2006 The NetBSD Foundation, Inc.
@@ -27,7 +27,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: subr_disk_open.c,v 1.12 2014/12/31 19:50:14 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: subr_disk_open.c,v 1.13 2015/12/08 20:36:15 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/conf.h>
@@ -91,7 +91,7 @@ opendisk(device_t dv)
 int
 getdisksize(struct vnode *vp, uint64_t *numsecp, unsigned int *secsizep)
 {
-	struct partinfo dpart;
+	struct partinfo pi;
 	struct dkwedge_info dkw;
 	struct disk *pdk;
 	unsigned int secsize;
@@ -113,10 +113,10 @@ getdisksize(struct vnode *vp, uint64_t *
 	}
 
 	if (error) {
-		error = VOP_IOCTL(vp, DIOCGPART, &dpart, FREAD, NOCRED);
+		error = VOP_IOCTL(vp, DIOCGPARTINFO, &pi, FREAD, NOCRED);
 		if (error == 0) {
-			secsize = dpart.disklab->d_secsize;
-			numsec  = dpart.part->p_size;
+			secsize = pi.pi_secsize;
+			numsec  = pi.pi_size;
 		}
 	}
 
@@ -143,14 +143,14 @@ getdisksize(struct vnode *vp, uint64_t *
 int
 getdiskinfo(struct vnode *vp, struct dkwedge_info *dkw)
 {
-	struct partinfo dpart;
+	struct partinfo pi;
 	int error;
 	dev_t dev = vp->v_specnode->sn_rdev;
 
 	if (VOP_IOCTL(vp, DIOCGWEDGEINFO, dkw, FREAD, NOCRED) == 0)
 		return 0;
 	
-	if ((error = VOP_IOCTL(vp, DIOCGPART, &dpart, FREAD, NOCRED)) != 0)
+	if ((error = VOP_IOCTL(vp, DIOCGPARTINFO, &pi, FREAD, NOCRED)) != 0)
 		return error;
 
 	snprintf(dkw->dkw_devname, sizeof(dkw->dkw_devname), "%s%" PRId32 "%c",
@@ -161,10 +161,9 @@ getdiskinfo(struct vnode *vp, struct dkw
 
 	strlcpy(dkw->dkw_parent, dkw->dkw_devname, sizeof(dkw->dkw_parent));
 
-	dkw->dkw_size = dpart.part->p_size;
-	dkw->dkw_offset = dpart.part->p_offset;
-
-	strlcpy(dkw->dkw_ptype, getfstypename(dpart.part->p_fstype),
+	dkw->dkw_size = pi.pi_size;
+	dkw->dkw_offset = pi.pi_offset;
+	strlcpy(dkw->dkw_ptype, getfstypename(pi.pi_fstype),
 	    sizeof(dkw->dkw_ptype));
 
 	return 0;

Index: src/sys/miscfs/specfs/spec_vnops.c
diff -u src/sys/miscfs/specfs/spec_vnops.c:1.156 src/sys/miscfs/specfs/spec_vnops.c:1.157
--- src/sys/miscfs/specfs/spec_vnops.c:1.156	Mon Dec  7 20:57:13 2015
+++ src/sys/miscfs/specfs/spec_vnops.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: spec_vnops.c,v 1.156 2015/12/08 01:57:13 christos Exp $	*/
+/*	$NetBSD: spec_vnops.c,v 1.157 2015/12/08 20:36:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 2008 The NetBSD Foundation, Inc.
@@ -58,7 +58,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.156 2015/12/08 01:57:13 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: spec_vnops.c,v 1.157 2015/12/08 20:36:15 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/proc.h>
@@ -502,9 +502,9 @@ spec_open(void *v)
 	specnode_t *sn;
 	specdev_t *sd;
 	spec_ioctl_t ioctl;
-	off_t off;
 	u_int gen;
 	const char *name;
+	struct partinfo pi;
 	
 	l = curlwp;
 	vp = ap->a_vp;
@@ -660,29 +660,9 @@ spec_open(void *v)
 
 	
 	ioctl = vp->v_type == VCHR ? cdev_ioctl : bdev_ioctl;
-
-	// XXX: DIOCGPART is not 64 bit friendly so we avoid it fot the
-	// raw partition
-	if (DISKPART(vp->v_rdev) == RAW_PART)
-		error = (*ioctl)(vp->v_rdev, DIOCGMEDIASIZE,
-		    &off, FREAD, curlwp);
-	else
-		error = EINVAL;
-	if (error) {
-		struct partinfo pi;
-		error = (*ioctl)(vp->v_rdev, DIOCGPART, &pi, FREAD, curlwp);
-		if (error == 0) {
-			off = (off_t)pi.disklab->d_secsize * pi.part->p_size;
-#ifdef DIAGNOSTIC
-			if (pi.disklab->d_secsize == UINT_MAX)
-				printf("overflow in DIOCGPART dev=%jx\n",
-				    (uintmax_t)vp->v_rdev);
-#endif
-		}
-	}
-
+	error = (*ioctl)(vp->v_rdev, DIOCGPARTINFO, &pi, FREAD, curlwp);
 	if (error == 0)
-		uvm_vnp_setsize(vp, (voff_t)off);
+		uvm_vnp_setsize(vp, (voff_t)pi.pi_secsize * pi.pi_size);
 
 	return 0;
 }
@@ -706,7 +686,7 @@ spec_read(void *v)
 	struct buf *bp;
 	daddr_t bn;
 	int bsize, bscale;
-	struct partinfo dpart;
+	struct partinfo pi;
 	int n, on;
 	int error = 0;
 
@@ -732,28 +712,11 @@ spec_read(void *v)
 		KASSERT(vp == vp->v_specnode->sn_dev->sd_bdevvp);
 		if (uio->uio_offset < 0)
 			return (EINVAL);
-		bsize = BLKDEV_IOSIZE;
 
-		/*
-		 * dholland 20130616: XXX this logic should not be
-		 * here. It is here because the old buffer cache
-		 * demands that all accesses to the same blocks need
-		 * to be the same size; but it only works for FFS and
-		 * nowadays I think it'll fail silently if the size
-		 * info in the disklabel is wrong. (Or missing.) The
-		 * buffer cache needs to be smarter; or failing that
-		 * we need a reliable way here to get the right block
-		 * size; or a reliable way to guarantee that (a) the
-		 * fs is not mounted when we get here and (b) any
-		 * buffers generated here will get purged when the fs
-		 * does get mounted.
-		 */
-		if (bdev_ioctl(vp->v_rdev, DIOCGPART, &dpart, FREAD, l) == 0) {
-			if (dpart.part->p_fstype == FS_BSDFFS &&
-			    dpart.part->p_frag != 0 && dpart.part->p_fsize != 0)
-				bsize = dpart.part->p_frag *
-				    dpart.part->p_fsize;
-		}
+		if (bdev_ioctl(vp->v_rdev, DIOCGPARTINFO, &pi, FREAD, l) == 0)
+			bsize = pi.pi_bsize;
+		else
+			bsize = BLKDEV_IOSIZE;
 
 		bscale = bsize >> DEV_BSHIFT;
 		do {
@@ -795,7 +758,7 @@ spec_write(void *v)
 	struct buf *bp;
 	daddr_t bn;
 	int bsize, bscale;
-	struct partinfo dpart;
+	struct partinfo pi;
 	int n, on;
 	int error = 0;
 
@@ -821,13 +784,12 @@ spec_write(void *v)
 			return (0);
 		if (uio->uio_offset < 0)
 			return (EINVAL);
-		bsize = BLKDEV_IOSIZE;
-		if (bdev_ioctl(vp->v_rdev, DIOCGPART, &dpart, FREAD, l) == 0) {
-			if (dpart.part->p_fstype == FS_BSDFFS &&
-			    dpart.part->p_frag != 0 && dpart.part->p_fsize != 0)
-				bsize = dpart.part->p_frag *
-				    dpart.part->p_fsize;
-		}
+
+		if (bdev_ioctl(vp->v_rdev, DIOCGPARTINFO, &pi, FREAD, l) == 0)
+			bsize = pi.pi_bsize;
+		else
+			bsize = BLKDEV_IOSIZE;
+
 		bscale = bsize >> DEV_BSHIFT;
 		do {
 			bn = (uio->uio_offset >> DEV_BSHIFT) &~ (bscale - 1);

Index: src/sys/rump/librump/rumpvfs/rumpblk.c
diff -u src/sys/rump/librump/rumpvfs/rumpblk.c:1.60 src/sys/rump/librump/rumpvfs/rumpblk.c:1.61
--- src/sys/rump/librump/rumpvfs/rumpblk.c:1.60	Tue May 26 12:48:05 2015
+++ src/sys/rump/librump/rumpvfs/rumpblk.c	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: rumpblk.c,v 1.60 2015/05/26 16:48:05 pooka Exp $	*/
+/*	$NetBSD: rumpblk.c,v 1.61 2015/12/08 20:36:15 christos Exp $	*/
 
 /*
  * Copyright (c) 2009 Antti Kantee.  All Rights Reserved.
@@ -37,7 +37,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: rumpblk.c,v 1.60 2015/05/26 16:48:05 pooka Exp $");
+__KERNEL_RCSID(0, "$NetBSD: rumpblk.c,v 1.61 2015/12/08 20:36:15 christos Exp $");
 
 #include <sys/param.h>
 #include <sys/buf.h>
@@ -421,6 +421,7 @@ rumpblk_ioctl(dev_t dev, u_long xfer, vo
 	devminor_t dmin = minor(dev);
 	struct rblkdev *rblk = &minors[dmin];
 	struct partinfo *pi;
+	struct diskpart *dp;
 	int error = 0;
 
 	/* well, me should support a few more, but we don't for now */
@@ -429,10 +430,17 @@ rumpblk_ioctl(dev_t dev, u_long xfer, vo
 		*(struct disklabel *)addr = rblk->rblk_label;
 		break;
 
-	case DIOCGPART:
+	case DIOCGPARTINFO:
+		dp = &rblk->rblk_label.d_partitions[DISKPART(dmin)];
 		pi = addr;
-		pi->part = &rblk->rblk_label.d_partitions[DISKPART(dmin)];
-		pi->disklab = &rblk->rblk_label;
+		pi->pi_offset = dp->p_offset;
+		pi->pi_size = dp->p_size;
+		pi->pi_secsize = rblk->rblk_label.d_secsize;
+		pi->pi_bsize = BLKDEV_IOSIZE;
+		pi->pi_fstype = dp->p_fstype;
+		pi->pi_fsize = dp->p_fsize;
+		pi->pi_frag = dp->p_frag;
+		pi->pi_cpg = dp->p_cpg;
 		break;
 
 	/* it's synced enough along the write path */

Index: src/sys/sys/disklabel.h
diff -u src/sys/sys/disklabel.h:1.118 src/sys/sys/disklabel.h:1.119
--- src/sys/sys/disklabel.h:1.118	Fri Jan  2 14:42:07 2015
+++ src/sys/sys/disklabel.h	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: disklabel.h,v 1.118 2015/01/02 19:42:07 christos Exp $	*/
+/*	$NetBSD: disklabel.h,v 1.119 2015/12/08 20:36:15 christos Exp $	*/
 
 /*
  * Copyright (c) 1987, 1988, 1993
@@ -444,8 +444,14 @@ struct format_op {
  * on a disk.
  */
 struct partinfo {
-	struct disklabel *disklab;
-	struct partition *part;
+	uint64_t pi_offset;
+	uint64_t pi_size;
+	uint32_t pi_secsize;
+	uint32_t pi_bsize;
+	uint8_t	 pi_fstype;
+	uint8_t  pi_frag;
+	uint16_t pi_cpg;
+	uint32_t pi_fsize;
 };
 
 struct disk;

Index: src/sys/sys/dkio.h
diff -u src/sys/sys/dkio.h:1.21 src/sys/sys/dkio.h:1.22
--- src/sys/sys/dkio.h:1.21	Mon Dec 29 13:41:20 2014
+++ src/sys/sys/dkio.h	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: dkio.h,v 1.21 2014/12/29 18:41:20 mlelstv Exp $	*/
+/*	$NetBSD: dkio.h,v 1.22 2015/12/08 20:36:15 christos Exp $	*/
 
 /*
  * Copyright (c) 1987, 1988, 1993
@@ -38,14 +38,14 @@
 /*
  * Disk-specific ioctls.
  */
-		/* get and set disklabel; DIOCGPART used internally */
+		/* get and set disklabel; DIOCGPARTINFO used internally */
 #define DIOCGDINFO	_IOR('d', 101, struct disklabel)/* get */
 #define DIOCSDINFO	_IOW('d', 102, struct disklabel)/* set */
 #define DIOCWDINFO	_IOW('d', 103, struct disklabel)/* set, update disk */
 
 #ifdef _KERNEL
 #define DIOCGDINFO32	(DIOCGDINFO - (sizeof(uint32_t) << IOCPARM_SHIFT))
-#define DIOCGPART	_IOW('d', 104, struct partinfo)	/* get partition */
+#define DIOCGPARTINFO	_IOW('d', 104, struct partinfo)	/* get partition */
 #endif
 
 #if defined(__HAVE_OLD_DISKLABEL) && defined(_KERNEL)

Index: src/sys/sys/param.h
diff -u src/sys/sys/param.h:1.488 src/sys/sys/param.h:1.489
--- src/sys/sys/param.h:1.488	Mon Nov 30 17:47:19 2015
+++ src/sys/sys/param.h	Tue Dec  8 15:36:15 2015
@@ -1,4 +1,4 @@
-/*	$NetBSD: param.h,v 1.488 2015/11/30 22:47:19 pgoyette Exp $	*/
+/*	$NetBSD: param.h,v 1.489 2015/12/08 20:36:15 christos Exp $	*/
 
 /*-
  * Copyright (c) 1982, 1986, 1989, 1993
@@ -67,7 +67,7 @@
  *	2.99.9		(299000900)
  */
 
-#define	__NetBSD_Version__	799002300	/* NetBSD 7.99.23 */
+#define	__NetBSD_Version__	799002400	/* NetBSD 7.99.24 */
 
 #define __NetBSD_Prereq__(M,m,p) (((((M) * 100000000) + \
     (m) * 1000000) + (p) * 100) <= __NetBSD_Version__)

Reply via email to