La structure bufinfo_t représente l'abstraction décrivant une demande d'E/S. Le tampon correspondant à une demande d'E/S est indiqué par args[0] des sondes start, done, wait-start et wait-done. La définition de la structure bufinfo_t est la suivante :
typedef struct bufinfo { int b_flags; /* flags */ size_t b_bcount; /* number of bytes */ caddr_t b_addr; /* buffer address */ uint64_t b_blkno; /* expanded block # on device */ uint64_t b_lblkno; /* block # on device */ size_t b_resid; /* # of bytes not transferred */ size_t b_bufsize; /* size of allocated buffer */ caddr_t b_iodone; /* I/O completion routine */ dev_t b_edev; /* extended device */ } bufinfo_t;
L'élément b_flags indique l'état du tampon d'E/S et comprend des valeurs d'état bitwise ou autres. Les valeurs d'état valides sont indiquées dans Tableau 27–3.
Tableau 27–3 Valeurs de b_flags
B_DONE |
Indique que le transfert de données est terminé. |
B_ERROR |
Indique une erreur de transfert d'E/S. Défini avec le champ b_error. |
B_PAGEIO |
Indique que le tampon est en cours d'utilisation dans une demande d'E/S chargée. Pour plus d'informations, reportez-vous à la description du champ b_addr. |
B_PHYS |
Indique que le tampon est en cours d'utilisation pour des E/S physiques (directes) d'une zone de données utilisateur. |
B_READ |
Indique que les données doivent être lues du périphérique à la mémoire principale. |
B_WRITE |
Indique que les données doivent être transférées de la mémoire principale au périphérique. |
B_ASYNC |
La demande d'E/S est asynchrone et sera mise en attente. Les sondes wait-start et wait-done ne se déclenchent pas pour des demandes d'E/S asynchrones. Notez que B_ASYNC peut ne pas être défini pour certaines E/S conçues pour être asynchrones : le sous-système d'E/S asynchrone peut mettre en œuvre la demande asynchrone en disposant d'un thread distinct pour exécuter une opération d'E/S synchrone. |
Le champ b_bcount représente le nombre d'octets à transférer dans la demande d'E/S.
Le champ b_addr représente l'adresse virtuelle de la demande d'E/S, à moins que B_PAGEIO soit défini. L'adresse est une adresse virtuelle de noyau à moins que B_PHYS soit défini, auquel cas il s'agit d'une adresse virtuelle d'utilisateur. Si B_PAGEIO est défini, le champ b_addr contient des données privées de noyau. Un de B_PHYS et de B_PAGEIO peut être défini, sinon aucun indicateur n'est défini.
Le champ b_lblkno identifie le bloc logique du périphérique auquel accéder. Le mappage d'un bloc logique avec un bloc physique (comme le cylindre, la piste, etc.) est défini par le périphérique.
Le champ b_resid est défini sur le nombre d'octets non transférés en raison d'une erreur.
Le champ b_bufsize contient la taille du tampon affecté.
Le champ b_iodone identifie une routine spécifique dans le noyau appelée à la fin de l'E/S.
Le champ b_error peut contenir un code d'erreur renvoyé par le périphérique en cas d'erreur d'E/S. b_error est défini avec le bit B_ERROR défini dans le membre b_flags.
Le champ b_edev contient les numéros supérieur et inférieur de périphériques du périphérique accessible. Les clients peuvent utiliser les sous-routines D getmajor() et getminor() pour extraire les numéros supérieur et inférieur de périphériques du champ b_edev.