Здравствуйте, Murr, Вы писали:
M>Здравствуйте, Аноним, Вы писали:
M>Давно не занимался программированием, так что просьба отнестись к тому, что я буду писать, со здоровым скептицизмом.
M>i_size — это размер данных inode. Все эти generic функции оперируют указателем и концепцией размеров inode, т.е. ты читаешь — указатель перемещается. Больше данных чем есть прочитать нельзя.
Ну обойти это можно просто — напиши в i_size столько сколько нужно, можно написать максимум.
Ну либо писать свой read, который плюет на проверки, связанные с размером (но тогда надо делать cut&paste кучи полезного кода).
M>Насчет 512 Кб странно — надо смотреть
M>А какая хоть ошибка возвращается?
Ни каких ошибок не возвращается.
Просто iobuf->length / blocksize всегда не больше 128 страниц (512К).
Выделяю 256К байт под буффер — всё нормально 64 страницы.
Но если больше, например 1М байт — то страниц 128.
Вообщем то у меня уже всё работает.
Проблема была больше аппаратная.
Дело в том что если устройство не поддерживает в балк в себя,
то при последоватьльной записи в память в\в данных по адрессам,
которые идут друг за другом или в один и тот же адресс, система (PCI) виснит намертво.
Чипсет пытается их как-то упаковать в один пакет и передать за один балк.
А устройство не поддерживает такой передачи в себя — коллизия.
Решается либо интервалами между передачей байт или слов,
либо писать так чтобы адресса не стояли рядом ( сначало в 1 и 3 регистр (адресс в\в) устройства, а потом в 5, 2, 4).
Но это грубо. лучше если устройство поддерживает в себя балк.
Но не все разработчики это делают.