diff options
| author | haad <haad@NetBSD.org> | 2009-08-06 16:00:49 +0000 |
|---|---|---|
| committer | haad <haad@NetBSD.org> | 2009-08-06 16:00:49 +0000 |
| commit | a0a1dfda1bcee7bddfc050e7b74a802948d7b27a (patch) | |
| tree | 7b8dd990cee3e1de1d7e2e018249493cb754f993 /sys | |
| parent | cff0705eb4581ca1b15507c5d84ee3be29fb01e7 (diff) | |
Add support for DIOCGDISKINFO for wedges. This fixes regression after my
DIOCGDISKINFO commit to fsck/partutil.c.
Tested by me and adegroot@.
Diffstat (limited to 'sys')
| -rw-r--r-- | sys/dev/dkwedge/dk.c | 46 |
1 files changed, 43 insertions, 3 deletions
diff --git a/sys/dev/dkwedge/dk.c b/sys/dev/dkwedge/dk.c index 045bad8f5d8..abb2fb213e9 100644 --- a/sys/dev/dkwedge/dk.c +++ b/sys/dev/dkwedge/dk.c @@ -1,4 +1,4 @@ -/* $NetBSD: dk.c,v 1.47 2009/07/21 19:41:00 dyoung Exp $ */ +/* $NetBSD: dk.c,v 1.48 2009/08/06 16:00:49 haad Exp $ */ /*- * Copyright (c) 2004, 2005, 2006, 2007 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.47 2009/07/21 19:41:00 dyoung Exp $"); +__KERNEL_RCSID(0, "$NetBSD: dk.c,v 1.48 2009/08/06 16:00:49 haad Exp $"); #include "opt_dkwedge.h" @@ -221,6 +221,39 @@ dkwedge_array_expand(void) free(oldarray, M_DKWEDGE); } +static void +dkgetproperties(struct disk *disk, struct dkwedge_info *dkw) +{ + prop_dictionary_t disk_info, odisk_info, geom; + + disk_info = prop_dictionary_create(); + + prop_dictionary_set_cstring_nocopy(disk_info, "type", "ESDI"); + + geom = prop_dictionary_create(); + + prop_dictionary_set_uint64(geom, "sectors-per-unit", dkw->dkw_size); + + prop_dictionary_set_uint32(geom, "sector-size", + DEV_BSIZE /* XXX 512? */); + + prop_dictionary_set_uint32(geom, "sectors-per-track", 32); + + prop_dictionary_set_uint32(geom, "tracks-per-cylinder", 64); + + prop_dictionary_set_uint32(geom, "cylinders-per-unit", dkw->dkw_size / 2048); + + prop_dictionary_set(disk_info, "geometry", geom); + prop_object_release(geom); + + odisk_info = disk->dk_info; + + disk->dk_info = disk_info; + + if (odisk_info != NULL) + prop_object_release(odisk_info); +} + /* * dkwedge_add: [exported function] * @@ -396,6 +429,7 @@ dkwedge_add(struct dkwedge_info *dkw) */ disk_init(&sc->sc_dk, device_xname(sc->sc_dev), NULL); + dkgetproperties(&sc->sc_dk, dkw); disk_attach(&sc->sc_dk); /* Disk wedge is ready for use! */ @@ -1265,6 +1299,12 @@ dkioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) if (sc->sc_state != DKW_STATE_RUNNING) return (ENXIO); + error = disk_ioctl(&sc->sc_dk, cmd, data, flag, l); + if (error != EPASSTHROUGH) + return (error); + + error = 0; + switch (cmd) { case DIOCCACHESYNC: /* @@ -1280,7 +1320,7 @@ dkioctl(dev_t dev, u_long cmd, void *data, int flag, struct lwp *l) break; case DIOCGWEDGEINFO: { - struct dkwedge_info *dkw = (void *) data; + struct dkwedge_info *dkw = (void *) data; strlcpy(dkw->dkw_devname, device_xname(sc->sc_dev), sizeof(dkw->dkw_devname)); |
