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 **);