2015-09-23 2 views
0

J'essaye de déboguer un problème où le standard CDROMEJECT de Linux renvoie une erreur même si le disque éjecté.Fonction CDROM - où va le pointeur de fonction?

Commande d'éjection standard utilisée.

ioctl(FP,CDROMEJECT) 

Quand je regarde le cdrom.c je peux voir la fonction d'éjection et les erreurs (par exemple: http://lxr.free-electrons.com/source/drivers/cdrom/cdrom.c#L2303). Je suis très bien avec où les codes d'erreur sont renvoyés, mais vous avez aussi des lignes comme ceci:

cdi->ops->lock_door(cdi, 0) 

maintenant lock_door est un pointeur de fonction (voir fichier d'en-tête here). Mon problème est que je ne peux pas pour la vie-de-moi comprendre quelle fonction le pointeur lock_door pointe à! Je m'attendrais à ce que cela pointe vers une fonction qui envoie ensuite une commande SCSI au lecteur de CD/DVD.

Je soupçonne que je manque un peu fondamental mais vraiment pas sûr de quoi! Toute idée où je trouve où les pointeurs de fonction dans struct cdrom_device_ops pointent vers?

Répondre

1

Si vous faites un LXR "Freetext Recherche" pour ".lock_door" you can see étant fixé pour la scsi driver here et si vous cliquez sur sr_lock_door vous trouvez qu'il est défini dans sr_ioctl.c:

int sr_lock_door(struct cdrom_device_info *cdi, int lock) { 
     Scsi_CD *cd = cdi->handle; 
     return scsi_set_medium_removal(cd->device, lock ? 
         SCSI_REMOVAL_PREVENT : SCSI_REMOVAL_ALLOW); 
} 
+0

Merci. Ce que je ne comprends pas entièrement, c'est comment sont liés le cdrom.c et le pilote scsi (sr.c). Par exemple: si j'appelle ioctl (fp, CDROMEJECT), alors comment est invoqué le code dans sr.c? – SimpleOne

+0

C'est probablement l'inverse. Votre ioctl commence dans [sr.c] (http://lxr.free-electrons.com/source/drivers/scsi/sr.c#L542) sr_block_ioctl() qui [appelle] (http: //lxr.free- electrons.com/source/drivers/scsi/sr.c#L568) cdrom_ioctl() qui appelle cdrom_ioctl_eject() qui appelle lock_door(). Les opérations semblent être définies [ici] (http://lxr.free-electrons.com/source/drivers/scsi/sr.c#L701) à la sonde. – meuh