Проблема оказалась несколько глубже, кросс-компиляторы, вплоть до последнего рабочего, который мне попался gcc-4.2.4-uclibc-0.9.30 не в состоянии реализовать функцию posix_fallocate.
Так что я решил просто дописать функцию захвата и заполнения файла нулями в саму библиотеку rtorrent'a.
К сообщению приложено 2 пропатченых библиотеки libtorrent_0.12.6 : с TEXT PADDING и ZERO PADDING. Библиотека c TEXT PADDING вместо нулей вписывает текст NO MORE FRAGMENTATION, по этому тексту удобно наблюдать за заполнением файла и вы уверенны что он создан и rtorrent работает как надо.
Библиотека c ZERO PADDING рекомендуется для настроенного rtorrent'a - заполнение нулями даёт возможность предварительного прослушивания/просмотра недокачанных файлов плеерами.
Дамп области файла, где хорошо видно границу закачанного блока данных в зарезервированное пространство: http://img6.imageshack.us/img6/9757/...ionpadding.jpg
Как пользоваться простому юзеру:
Обновиться до rtorrent 0.8.6 (libtorrent 0.12.6), сейчас для этого достаточно набрать, предварительно остановив программу:
ipkg update
ipkg upgrade rtorrent
ipkg upgrade libtorrent (если это не произойдёт автоматически)
Подменить библиотеку libtorrent скачанной отсюда с архива, обычно достаточно заменить только файл: /opt/lib/libtorrent.so.11.0.6, это должен быть файл около мегабайта размером, не симлинк. У Вас путь может быть другим.
Не забудьте добавить в rtorrent.conf строчку system.file_allocate.set = yes
Если кому интересно код патча с ZERO PADDING:
Code:
root@darkstar:/wl500g/optware/oleg/builds/libtorrent/src/data# cat socket_file.cc.diff
114,135c114
< //return !posix_fallocate(m_fd, offset, length);
< {
< bool success;
< char buf[ 4 * 1024 ] = {0};
< uint64_t len;
< uint64_t sb = sizeof( buf );
<
< if (offset > length) throw internal_error("SocketFile::posix_fallocate()incorrect offset");
<
< len = length-offset;
< success = 1;
< lseek(m_fd, offset, SEEK_SET);
< while ( len > 0 && success )
< {
< if (len < sb) sb = len;
< len -= sb;
< success = write( m_fd, buf, sb );
< }//while
<
< lseek(m_fd, offset, SEEK_SET);
< return true;
< }//block
---
> return !posix_fallocate(m_fd, offset, length);
Код патча с TEXT PADDING:
Code:
root@darkstar:/wl500g/optware/oleg/builds/libtorrent/src/data# cat socket_file.cc.text_padding.diff
114,147c114
< //return !posix_fallocate(m_fd, offset, length);
< {
< bool success;
< char buf[ 4 * 1024 ] = {0};
< uint64_t len;
< uint64_t sb = sizeof( buf );
< uint64_t i;
<
< if (offset > length) throw internal_error("SocketFile::posix_fallocate()incorrect offset");
< //return false;
<
< //fill in padding buffer
<
< //printf("sb = %i \r\n", sb);
< for (i=0;i<sb-27;i+=32) {
< strncpy(&buf[i]," -~+= NO MORE FRAGMENTATION =+~- ",32);
< }
<
< len = length-offset;
< success = 1;
< lseek(m_fd, offset, SEEK_SET);
< while ( len > 0 && success )
< {
< if (len < sb) sb = len;
< len -= sb;
< success = write( m_fd, buf, sb );
< // printf("success = %i, len = %i,", success, len );
< // printf(" sb = %i \r\n", sb );
<
< }//while
<
< lseek(m_fd, offset, SEEK_SET);
< return true;
< }//block
---
> return !posix_fallocate(m_fd, offset, length);
Тестирование работоспособности:
до патча:
root# filefrag Ferry_143.mp3
Ferry_143.mp3: 1282 extents found, perfection would be 1 extent
после патча:
root# filefrag Ferry_140.mp3
Ferry_140.mp3: 1 extent found
Не забывайте, что для захвата пространства на диске роутеру может потребоваться значительное время, ведь максимальная скорость работы с диском колеблется в пределах 3.5МБайт/сек. Тоесть для первичного создания файла в таком режиме потребуется примерно столько же времени, сколько на перехеширование. Клиент на это время блокируется.
Прошу отписаться тех, кто скачал и потестировал пропатченную библиотеку.