Category:

worklog: пока не победил multiple LUN, зато нашёл другую ошибку

В индусской либе, код которой я бессовестно передрал творчески переработал, есть функция SCSI_Verify10.
Очевидно, она долженствует реализовать SCSI команду VERIFY(10) (т.е. запрос VERIFY с блоком параметров длиной 10 байт).
И всё бы хорошо, но эта функция у меня тут всё время фейлила. Мало того, она фейлила и на "стоковом" коде, вызывая отказ устройства при попытке просканировать его, например, chkdsk. Несмотря на то, что в текущей реализации это пустышка, она выдавала ошибку проверки диапазона.

А ларчик раскрывался просто: в индусском коде функция игнорировала переданные ей параметры, проверяя их ПРЕДЫДУЩЕЕ состояние, сохранённое в структуре с данными устройства. А это неправильно, потому что и VERIFY, и тем более WRITE или READ получают настоящие параметры, которые она должны обработать и ответить на них, в нормальных условиях не обращая внимание на предыдущее состояние. Добавил всего две строки, извлекающие параметры из command block - и, о чудо! - дивайс проходит формальную проверку chkdsk (сейчас реально ничего не проверяется, это "на вырост").