summaryrefslogtreecommitdiff
path: root/sys/dev
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev')
-rw-r--r--sys/dev/ata/wd.c22
1 files changed, 18 insertions, 4 deletions
diff --git a/sys/dev/ata/wd.c b/sys/dev/ata/wd.c
index e7673d82f91..633c0e95581 100644
--- a/sys/dev/ata/wd.c
+++ b/sys/dev/ata/wd.c
@@ -1,4 +1,4 @@
-/* $NetBSD: wd.c,v 1.331 2006/10/12 01:30:55 christos Exp $ */
+/* $NetBSD: wd.c,v 1.332 2006/10/25 04:04:45 thorpej Exp $ */
/*
* Copyright (c) 1998, 2001 Manuel Bouyer. All rights reserved.
@@ -66,7 +66,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.331 2006/10/12 01:30:55 christos Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wd.c,v 1.332 2006/10/25 04:04:45 thorpej Exp $");
#ifndef ATADEBUG
#define ATADEBUG
@@ -410,6 +410,7 @@ wdattach(struct device *parent __unused, struct device *self, void *aux)
*/
wd->sc_dk.dk_driver = &wddkdriver;
wd->sc_dk.dk_name = wd->sc_dev.dv_xname;
+ /* we fill in dk_info later */
disk_attach(&wd->sc_dk);
wd->sc_wdc_bio.lp = wd->sc_dk.dk_label;
wd->sc_sdhook = shutdownhook_establish(wd_shutdown, wd);
@@ -1162,6 +1163,10 @@ wdioctl(dev_t dev, u_long xfer, caddr_t addr, int flag, struct lwp *l)
if ((wd->sc_flags & WDF_LOADED) == 0)
return EIO;
+ error = disk_ioctl(&wd->sc_dk, xfer, addr, flag, l);
+ if (error != EPASSTHROUGH)
+ return (error);
+
switch (xfer) {
#ifdef HAS_BAD144_HANDLING
case DIOCSBAD:
@@ -1679,7 +1684,7 @@ bad144intern(struct wd_softc *wd)
static void
wd_params_to_properties(struct wd_softc *wd, struct ataparams *params __unused)
{
- prop_dictionary_t disk_info, geom;
+ prop_dictionary_t disk_info, odisk_info, geom;
prop_string_t string;
prop_number_t number;
@@ -1726,7 +1731,16 @@ wd_params_to_properties(struct wd_softc *wd, struct ataparams *params __unused)
prop_dictionary_set(device_properties(&wd->sc_dev),
"disk-info", disk_info);
- prop_object_release(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 = wd->sc_dk.dk_info;
+ wd->sc_dk.dk_info = disk_info;
+ if (odisk_info)
+ prop_object_release(odisk_info);
}
int