Also data over/under-runs sind Fehler, die eigentlich zu resid != 0 führen sollten (größer oder kleiner 0), aber Linux SCSI ist von der Qualität leider nur Mittelklasse.
Eines der größten Handycaps ist übrigens die Tatsache, daß Linux beim auto-request-sense (welches auf einem Multi-taskting System zwingend notwendig ist) nur 16 Bytes Daten liefert, obwohl der Standard seit ca. 1984 mindestens 18 Bytes vorschreibt. Dadurch sind bestimmte Fehler in Linux nicht interpretierbar.
Gut das ich scg auf SunOS implementiert habe und nicht auf Linux, sonst wäre scg genauso schlecht... aber wen's interessiert: scg ist das weltweit erste SCSI Universalinterface und ich habe es im Sommer 1986 geschrieben (das war übrigens 2 Jahre vor dem 2. vergleichbaren Interface: ASPI von Adaptec). Seit dem ist das Programmierinterface (also die zugrundeliegenden Datenstrukturen) unverändert geblieben.
Wer mal testen will, wie korrekt seine Implementierung ist kann "scgcheck" verwenden. Es testet diverse Fehlersituationen und legt ein Logfile an aus dem man sehen kann was alles korret oder fehlerhaft gemeldet wird.
Übrigens ist dieser Fehler aus Sicht der libscg in der Tat ein Retryable error, weil nicht klar ist, ob es gar keinen Zweck hat es nochmal zu probieren. Nicht "retryable Fehler" sind z.B. Fehler bei denen das Target nicht selektierbar war. Ob ein Fehler im Einzelnen durch Wiederholung heilbar ist, das hängt aber von der Situation ab, die nur das Programm kennt, das das Kommando abgeschickt hat.
Die Geschwindigkeitsberechnung orientiert sich an der Gesamtdatenmenge und mag bei Fehlern nicht stimmen 😉
Achja, nochmal generell etwas zu den Meldungen beim Kompilieren:
* gmake hat Bugs die zu fehlerhaften Fehlermeldungen führen. Diese Bugs habe ich 1988 gemeldet und die wurden damals auch vom Maintainer bestätigt. 18 Jahre scheinen für eine Beseitigung bei diesen Leuten aber nicht auszureichen.
* Debian zerpatcht den gcc, so daß er danach nicht mehr standardkonform ist. Meldungen zu ignorierten Fehlercodes sind die Folge, obwohl mit Hilfe der C Standardkonstruktion (void) angezeigt wurde das der Returncode bewußt ignoriert wird, z.B. weil es unsinnig ist bei einer Fehlerausgabe zu prüfen, ob diese evt. wegen eines Fehlers nicht geklappt hat.
* Darüberhinaus kommen bei einigen GCC Versionen auch bei abgeschalteten erweiterten Warnungen Meldungen zu dem printf() Format "%r", daß von DECCUS und UNOS 1980 eingeführt wurde. Diese Meldungen sind also ein Zeichen für einen zu dummen gcc.
Mit ordentlichen Kompilern kommen keine Warnungen beim Kompilieren. Lustig ist dabei übrigens zu erwähnen, daß der C-kompiler von DEC auf true64 meckert, wenn man dem gcc nachgibt.... Resultat dind dabei Meldungen über doppelt initialisierte Variablen. Der gcc hat einen sehr schlechten Algorithmus zum Erkennen uninitialisierter Variablen.