RELENG_7 geom_ioctl funktioniert nicht

Kamikaze

Warrior of Sunlight
Staff member
Ich habe in src/sys/dev/ata/atapi-cd.c eine device_printf() eingefügt und bin zu dem Schluss gekommen, dass acd_geom_ioctl() nie aufgerufen wird. Darin sehe ich den Grund dafür, dass geom keine CD-Wechsel mitbekommt.

Ich frage mich ob die Funktionalität in geom noch nicht implementiert ist, oder ob es sich dabei um einen Bug handelt

Ich habe auch eine Mail an freebsd-stable geschrieben.
 
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/.
 
Danke erst mal. Ich habe es geschafft mit cdcontrol acd_geom_ioctl() aufzurufen. Du hast also Recht, dass ich an der volkommen falschen stelle ansetze. Ich muss herausfinden, wo der Kernel die Klappe öffnet und schließt und von dort ein acd_geom_attach/detach in die geom queue schieben.
 
Back
Top