summaryrefslogtreecommitdiffstats
path: root/sys/dev/ata/atapi-cd.c
diff options
context:
space:
mode:
authorgreen <green@FreeBSD.org>2004-06-21 20:42:03 +0000
committergreen <green@FreeBSD.org>2004-06-21 20:42:03 +0000
commitacfb823f3fef562e5f2cf2732b1106007bb2d79b (patch)
tree62db5a2782a96ab56397e2a678083badd0322e9b /sys/dev/ata/atapi-cd.c
parentd0b578874986cfb52885b64a48be32b826360f9b (diff)
downloadFreeBSD-src-acfb823f3fef562e5f2cf2732b1106007bb2d79b.zip
FreeBSD-src-acfb823f3fef562e5f2cf2732b1106007bb2d79b.tar.gz
Call the detach function with g_waitfor_event() so that it can access
the GEOM topology. There are still issues with not detaching from cam correctly such that upon a device detach there's an invalid pointer dereference from the later call to cam_rescan().
Diffstat (limited to 'sys/dev/ata/atapi-cd.c')
-rw-r--r--sys/dev/ata/atapi-cd.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/sys/dev/ata/atapi-cd.c b/sys/dev/ata/atapi-cd.c
index ab1e110..6599f1c 100644
--- a/sys/dev/ata/atapi-cd.c
+++ b/sys/dev/ata/atapi-cd.c
@@ -181,8 +181,9 @@ acd_attach(struct ata_device *atadev)
}
static void
-acd_detach(struct ata_device *atadev)
+acd_geom_detach(void *arg, int flag)
{
+ struct ata_device *atadev = arg;
struct acd_softc *cdp = atadev->softc;
int subdev;
@@ -215,6 +216,12 @@ acd_detach(struct ata_device *atadev)
free(cdp, M_ACD);
}
+static void
+acd_detach(struct ata_device *atadev)
+{
+ g_waitfor_event(acd_geom_detach, atadev, M_WAITOK, NULL);
+}
+
static struct acd_softc *
acd_init_lun(struct ata_device *atadev)
{
OpenPOWER on IntegriCloud