Функция HDIO_GETGEO
ioctl
возвращает количество цилиндров в поле длиной 16 бит.
Это означает, что если у вас более 65535 цилиндров, то эта цифра
будет урезана, и (для обычного случая настройки SCSI с 1 МиБ цилиндрами)
80 ГиБ диск будет выглядеть как диск на 16 ГиБ.
Если вы распознали эту проблему, то вы можете легко от неё избавиться.
Диски больше чем 33.8 ГБ не будут работать с ядрами младше 2.3.21. Детали этой проблемы приведены ниже. Предположим, что вы приобрели новый диск - IBM-DPTA-373420, емкостью 66835440 сектора (34.2 ГБ). Ядра более поздних версий , чем 2.3.21, будут сообщать что размер диска равен 769*16*63 = 775152 секторов (0.4 ГБ), что, согласитесь не совсем приятно. Задание параметров в командной строке(например:hdc=4160,255,63) не поможет,они будут игнорироваться. Что происходит? Процедура idedisk_setup() получает сведения о геометрии от диска (16383/16/63) и записывает эти данные поверх данных полученных от пользователя в командной строке,поэтому данные пользователя используются только для BIOS геометрии. Процедура current_capacity() или idedisk_capacity() пересчитывает количество цилиндров как 66835440/(16*63)=66305, но , так как поле имеет длину всего 16 бит,это число превращается в 769. Т.к lba_capacity_is_ok() разрушила id->cyls, каждый следующий её вызов будет возвращать неверные данные, поэтому емкость диска получается равна 769*16*63. Для нескольких версий ядер доступен патч. Патч для 2.0.38 можно взять на ftp.kernel.org. Патч для 2.2.12 на : www.uwsg.indiana.edu. Ядра 2.2.14pre поддерживают такие диски. В серии ядер 2.3.* , поддержка таких дисков есть в версиях начиная с 2.3.21. Решить проблему можно также путем настройки диска с помощью перемычек на емкость 33.8 ГБ. Во многих случаях может помочь Обновление BIOS ,это необходимо если вы хотите загружаться с диска.