diff options
author | green <green@FreeBSD.org> | 2004-06-21 20:42:03 +0000 |
---|---|---|
committer | green <green@FreeBSD.org> | 2004-06-21 20:42:03 +0000 |
commit | acfb823f3fef562e5f2cf2732b1106007bb2d79b (patch) | |
tree | 62db5a2782a96ab56397e2a678083badd0322e9b /sys/dev/ata/atapi-cd.c | |
parent | d0b578874986cfb52885b64a48be32b826360f9b (diff) | |
download | FreeBSD-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.c | 9 |
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) { |