Ich bin mir im Moment nicht ganz sicher und kann's jetzt auch nicht weiter überprüfen, aber ich denke, dass Du an der falschen Stelle schaust. Die XXX_ioctl()-Funktionen werden "von oben", d.h. indirekt aus dem Userland aufgerufen um dem Treiber etwas mitzuteilen. Würde mich wundern, wenn das bei GEOM anders wäre. Vermutlich wird die Funktion schon aufgerufen, aber eben nur, wenn ein Programm ein ioctl(2) auf dem entsprechenden Device aufruft.
Wenn ich Dich richtig verstehe, dann erwartest Du, dass das System mitbekommt, wenn Du die CD wechselst, also durch öffnen u. schließen des Trays.
Dafür muss die Hardware den Wechsel signalisieren, typischerweise passiert das durch einen Interrupt. Der muss von einer Interrupt Routine behandelt werden. Die Interrupt Routine kann aber nicht ohne weiteres die ..._ioctl() Funktion verwenden, sondern muss den Interrupt durch andere Mechanismen von unten in die oberen Regionen des Kernels signalisieren. So wie sich's mir im Moment darstellt behandelt ata_interrupt() in sys/dev/ata/ata-all.c den Interrupt und hängt ihn an eine FIFO an, per Aufruf von ata_finish(). Diese FIFO ist in sys/dev/ata/ata-queue.c implementiert. Der ATA Request wird an eine Taskqueue angehängt, so dass die Interrupt Routine beendet werden kann und der tatsächliche Event-Handler asynchron ausgeführt wird. Wie die einzelnen Layer (ATA Bus, CAM, GEOM, etc.) da zusammenspielen und wer jetzt genau wo das Tray-Event behandelt ist mir nicht ganz klar.
Ich denke, Du solltest von der Richtung anfangen zu suchen. Eine nützliche Ressource ist die Kernel Cross Reference
http://fxr.watson.org/.