Тема с не полностью вычитанным сектором из буфера HDD возымела небольшое продолжение. На тест-драйве, при копировании кучи файлов, посреди процесса случился затык - типа ошибка чтения очередного файла. Повтор считывания прошёл успешно. Далее ещё несколько таких затыков (первый раз ошибка, повтор успешно). Далее замечаю, что эффект 100% стабилен, т.е. в одних и тех же местах. Более того, в другом подкаталоге на том же наборе файлов ровно то же самое. Причём, что характерно, эффект проявляется только на конкретной модели винчестера: Фуджик МПЕ3102АТ с микропрограммой версии 0028. На Фуджике МПЕ3084АЕ высечь эффект не удалось.
Расследование показало, что после чтения "проблемного" файла, первым сектором на следующем запросе читается "мусор", причём этот мусор представляет собой содержимое сектора, следующего за последним "проблемного" файла. Хотя команды чтения этого сектора в принципе не поступает. Вероятно, это механизм look-ahead чтения "на всякий пожарный". А вот почему его результат "винт" отдаёт по следующему запросу - х/з, видать особенность (или бага?) конкретной микропрограммы.
Фиг с ним, начал думать как побороть. Первая мысля была - после неполного чтения последнего сектора выдать не NOP, а команду рекалибровки (переход на 0-ю дорожку), она-то уж точно должна всё сбросить. Не прокатило! Головки щёлкают в начало, но предиктивный мусор "винт" по-прежнему отдаёт на следующем запросе.
Как ни странно, помогла прерванная команда "Чтение буфера". Хотя странно, ведь по факту я ничего не читаю, разумеется. Тем не менее, факт: ReadBuffer + NOP решили вопрос. По скорости это быстрее холостого вычитывания ненужного остатка сектора, и по объёму кода меньше.
Вот такие костыли