Module Name: src
Committed By: elric
Date: Fri May 25 10:53:46 UTC 2012
Modified Files:
src/sys/dev: cgd.c cgdvar.h dksubr.c dkvar.h
Log Message:
Modify dksubr.c to add a function that sets the disk properties in
the drvctl framework. And call this new functionality from cgd(4),
the consumer of dksubr.c. We do this to allow gpt(8) to be able
to label cgd(4) disks. We also add in some DIOCGSECTORSIZE logic
and we ensure that the WEDGE ioctls are not called on either
uninitialised disks or disks which have not been opened for write
access.
To generate a diff of this commit:
cvs rdiff -u -r1.76 -r1.77 src/sys/dev/cgd.c
cvs rdiff -u -r1.14 -r1.15 src/sys/dev/cgdvar.h
cvs rdiff -u -r1.42 -r1.43 src/sys/dev/dksubr.c
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/dkvar.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/dev/cgd.c
diff -u src/sys/dev/cgd.c:1.76 src/sys/dev/cgd.c:1.77
--- src/sys/dev/cgd.c:1.76 Sun Nov 13 23:03:24 2011
+++ src/sys/dev/cgd.c Fri May 25 10:53:46 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cgd.c,v 1.76 2011/11/13 23:03:24 christos Exp $ */
+/* $NetBSD: cgd.c,v 1.77 2012/05/25 10:53:46 elric Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -30,7 +30,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.76 2011/11/13 23:03:24 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: cgd.c,v 1.77 2012/05/25 10:53:46 elric Exp $");
#include <sys/types.h>
#include <sys/param.h>
@@ -185,9 +185,9 @@ cgd_attach(device_t parent, device_t sel
{
struct cgd_softc *sc = device_private(self);
- sc->sc_dev = self;
simple_lock_init(&sc->sc_slock);
- dk_sc_init(&sc->sc_dksc, sc, device_xname(sc->sc_dev));
+ dk_sc_init(&sc->sc_dksc, device_xname(self));
+ sc->sc_dksc.sc_dev = self;
disk_init(&sc->sc_dksc.sc_dkdev, sc->sc_dksc.sc_xname, &cgddkdriver);
if (!pmf_device_register(self, NULL, NULL))
@@ -278,8 +278,8 @@ cgdclose(dev_t dev, int flags, int fmt,
return error;
if ((dksc->sc_flags & DKF_INITED) == 0) {
- if ((error = cgd_destroy(cs->sc_dev)) != 0) {
- aprint_error_dev(cs->sc_dev,
+ if ((error = cgd_destroy(cs->sc_dksc.sc_dev)) != 0) {
+ aprint_error_dev(dksc->sc_dev,
"unable to detach instance\n");
return error;
}
@@ -336,7 +336,7 @@ cgdsize(dev_t dev)
static void *
cgd_getdata(struct dk_softc *dksc, unsigned long size)
{
- struct cgd_softc *cs =dksc->sc_osc;
+ struct cgd_softc *cs = (struct cgd_softc *)dksc;
void * data = NULL;
simple_lock(&cs->sc_slock);
@@ -355,7 +355,7 @@ cgd_getdata(struct dk_softc *dksc, unsig
static void
cgd_putdata(struct dk_softc *dksc, void *data)
{
- struct cgd_softc *cs =dksc->sc_osc;
+ struct cgd_softc *cs = (struct cgd_softc *)dksc;
if (data == cs->sc_data) {
simple_lock(&cs->sc_slock);
@@ -369,7 +369,7 @@ cgd_putdata(struct dk_softc *dksc, void
static int
cgdstart(struct dk_softc *dksc, struct buf *bp)
{
- struct cgd_softc *cs = dksc->sc_osc;
+ struct cgd_softc *cs = (struct cgd_softc *)dksc;
struct buf *nbp;
void * addr;
void * newaddr;
@@ -681,6 +681,8 @@ cgd_ioctl_set(struct cgd_softc *cs, void
cs->sc_dksc.sc_flags |= DKF_INITED;
+ dk_set_properties(di, &cs->sc_dksc);
+
/* Attach the disk. */
disk_attach(&cs->sc_dksc.sc_dkdev);
Index: src/sys/dev/cgdvar.h
diff -u src/sys/dev/cgdvar.h:1.14 src/sys/dev/cgdvar.h:1.15
--- src/sys/dev/cgdvar.h:1.14 Tue Jan 12 21:08:09 2010
+++ src/sys/dev/cgdvar.h Fri May 25 10:53:46 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: cgdvar.h,v 1.14 2010/01/12 21:08:09 dyoung Exp $ */
+/* $NetBSD: cgdvar.h,v 1.15 2012/05/25 10:53:46 elric Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -69,7 +69,6 @@ struct cryptdata {
};
struct cgd_softc {
- device_t sc_dev;
struct dk_softc sc_dksc; /* generic disk interface */
struct cryptinfo *sc_crypt; /* the alg/key/etc */
struct vnode *sc_tvn; /* target device's vnode */
Index: src/sys/dev/dksubr.c
diff -u src/sys/dev/dksubr.c:1.42 src/sys/dev/dksubr.c:1.43
--- src/sys/dev/dksubr.c:1.42 Fri Nov 19 06:44:39 2010
+++ src/sys/dev/dksubr.c Fri May 25 10:53:46 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: dksubr.c,v 1.42 2010/11/19 06:44:39 dholland Exp $ */
+/* $NetBSD: dksubr.c,v 1.43 2012/05/25 10:53:46 elric 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.42 2010/11/19 06:44:39 dholland Exp $");
+__KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1.43 2012/05/25 10:53:46 elric Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -48,7 +48,9 @@ __KERNEL_RCSID(0, "$NetBSD: dksubr.c,v 1
#include <dev/dkvar.h>
-int dkdebug = 0;
+int dkdebug = 0xff;
+
+#define DEBUG 1
#ifdef DEBUG
#define DKDB_FOLLOW 0x1
@@ -70,11 +72,10 @@ int dkdebug = 0;
static void dk_makedisklabel(struct dk_intf *, struct dk_softc *);
void
-dk_sc_init(struct dk_softc *dksc, void *osc, const char *xname)
+dk_sc_init(struct dk_softc *dksc, const char *xname)
{
memset(dksc, 0x0, sizeof(*dksc));
- dksc->sc_osc = osc;
strncpy(dksc->sc_xname, xname, DK_XNAME_SIZE);
dksc->sc_dkdev.dk_name = dksc->sc_xname;
}
@@ -306,18 +307,28 @@ dk_ioctl(struct dk_intf *di, struct dk_s
case ODIOCWDINFO:
#endif
case DIOCWLABEL:
+ case DIOCAWEDGE:
+ case DIOCDWEDGE:
if ((flag & FWRITE) == 0)
return EBADF;
}
/* ensure that the pseudo-disk is initialized for these */
switch (cmd) {
+#ifdef DIOCGSECTORSIZE
+ case DIOCGSECTORSIZE:
+ case DIOCGMEDIASIZE:
+#endif
case DIOCGDINFO:
case DIOCSDINFO:
case DIOCWDINFO:
case DIOCGPART:
case DIOCWLABEL:
case DIOCGDEFLABEL:
+ case DIOCAWEDGE:
+ case DIOCDWEDGE:
+ case DIOCLWEDGES:
+ case DIOCCACHESYNC:
#ifdef __HAVE_OLD_DISKLABEL
case ODIOCGDINFO:
case ODIOCSDINFO:
@@ -329,6 +340,17 @@ dk_ioctl(struct dk_intf *di, struct dk_s
}
switch (cmd) {
+#ifdef DIOCGSECTORSIZE
+ case DIOCGSECTORSIZE:
+ *(u_int *)data = dksc->sc_geom.pdg_secsize;
+ return 0;
+ case DIOCGMEDIASIZE:
+ *(off_t *)data =
+ (off_t)dksc->sc_geom.pdg_secsize *
+ dksc->sc_geom.pdg_nsectors;
+ return 0;
+#endif
+
case DIOCGDINFO:
*(struct disklabel *)data = *(dksc->sc_dkdev.dk_label);
break;
@@ -606,6 +628,48 @@ dk_makedisklabel(struct dk_intf *di, str
lp->d_checksum = dkcksum(lp);
}
+void
+dk_set_properties(struct dk_intf *di, struct dk_softc *dksc)
+{
+ prop_dictionary_t disk_info, odisk_info, geom;
+
+ disk_info = prop_dictionary_create();
+
+ geom = prop_dictionary_create();
+
+ prop_dictionary_set_uint64(geom, "sectors-per-unit",
+ dksc->sc_geom.pdg_nsectors * dksc->sc_geom.pdg_ntracks *
+ dksc->sc_geom.pdg_ncylinders);
+
+ prop_dictionary_set_uint32(geom, "sector-size",
+ dksc->sc_geom.pdg_secsize);
+
+ prop_dictionary_set_uint16(geom, "sectors-per-track",
+ dksc->sc_geom.pdg_nsectors);
+
+ prop_dictionary_set_uint16(geom, "tracks-per-cylinder",
+ dksc->sc_geom.pdg_ntracks);
+
+ prop_dictionary_set_uint64(geom, "cylinders-per-unit",
+ dksc->sc_geom.pdg_ncylinders);
+
+ prop_dictionary_set(disk_info, "geometry", geom);
+ prop_object_release(geom);
+
+ prop_dictionary_set(device_properties(dksc->sc_dev),
+ "disk-info", disk_info);
+
+ /*
+ * Don't release disk_info here; we keep a reference to it.
+ * disk_detach() will release it when we go away.
+ */
+
+ odisk_info = dksc->sc_dkdev.dk_info;
+ dksc->sc_dkdev.dk_info = disk_info;
+ if (odisk_info)
+ prop_object_release(odisk_info);
+}
+
/* This function is taken from ccd.c:1.76 --rcd */
/*
Index: src/sys/dev/dkvar.h
diff -u src/sys/dev/dkvar.h:1.15 src/sys/dev/dkvar.h:1.16
--- src/sys/dev/dkvar.h:1.15 Fri Nov 19 06:44:39 2010
+++ src/sys/dev/dkvar.h Fri May 25 10:53:46 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: dkvar.h,v 1.15 2010/11/19 06:44:39 dholland Exp $ */
+/* $NetBSD: dkvar.h,v 1.16 2012/05/25 10:53:46 elric Exp $ */
/*-
* Copyright (c) 2002 The NetBSD Foundation, Inc.
@@ -47,8 +47,7 @@ struct dk_geom {
* are common to each of the pseudo-disk drivers.
*/
struct dk_softc {
- void *sc_osc; /* the softc of the underlying
- * driver */
+ device_t sc_dev;
u_int32_t sc_flags; /* flags */
size_t sc_size; /* size of disk */
struct dk_geom sc_geom; /* geometry info */
@@ -96,7 +95,7 @@ struct dk_intf {
* Functions that are exported to the pseudo disk implementations:
*/
-void dk_sc_init(struct dk_softc *, void *, const char *);
+void dk_sc_init(struct dk_softc *, const char *);
int dk_open(struct dk_intf *, struct dk_softc *, dev_t,
int, int, struct lwp *);
@@ -113,5 +112,6 @@ int dk_dump(struct dk_intf *, struct dk_
void dk_getdisklabel(struct dk_intf *, struct dk_softc *, dev_t);
void dk_getdefaultlabel(struct dk_intf *, struct dk_softc *,
struct disklabel *);
+void dk_set_properties(struct dk_intf *, struct dk_softc *);
int dk_lookup(struct pathbuf *, struct lwp *, struct vnode **);