Можно создать не более 32767 подкаталогов. Попытка снять ограничение.Каталоги создавались CMS'кой очень крупного сайта. И исправить CMS нет возможности - одна версия обслуживает около сотни сайтов. На линуксе все решалось переходом на reiserfs. Но во фре reiserfs только на чтение.
Поисковики ничего толкового не предоставили. Кое где речь шла о перекомпиляции ядра, но что нужно было изменить не говорилось.
Ограничение в 32767 наводило на мысль, что для хранения использовалось двухбайтовое, но знаковое число. Изменив тип двухбайтового числа на беззнаковое и увеличив лимит, теоритически можно было бы обойти ограничение.
Покопавшись в исходниках ядра FreeBSD, нашел ограничение задаваемое константой LINK_MAX.
Далее в /usr/sys/ufs были найдены переменные, сравниваемые с LINK_MAX. Так же пришлось изменить тип числа в исходниках ext2fs - компилятор ругнулся.
/usr/src/sys/sys/syslimits.h:57
before
#define LINK_MAX 32768 /* max file link count */
after
#define LINK_MAX 65000 /* max file link count */
/usr/src/sys/ufs/inode.h:98
before:
int16_t i_nlink; /* File link count */
after:
u_int16_t i_nlink; /* File link count */
/usr/src/sys/ufs/dinode.h:127
before:
int16_t di_nlink; /* 2: File link count. */
after:
u_int16_t di_nlink; /* 2: File link count. */
/usr/src/sys/ufs/dinode.h:168
before:
int16_t di_nlink; /* 2: File link count. */
after:
u_int16_t di_nlink; /* 2: File link count. */
/usr/src/sys/gnu/fs/ext2fs/inode.h:90
before:
int16_t i_nlink; /* File link count */
after:
u_int16_t i_nlink; /* File link count */
На виртуальной машине компиляция выполнилось успешно и простенький скрипт насоздавал 64999 каталогов.
#!/bin/sh
a=1
while [ $a -lt 65005 ]
do
echo "$a"
a='expr $a + 1'
mkdir $a
done
Проверка раздела при помощи fsck ошибок не выявило. Но создав еще каталог и запустив там скриптик, исчерпал количество доступных инодов. Так что со снятием ограничения нужно позаботится и о достаточном количестве inode.
Просьба к знатокам и гуру - на какие грабли можно напороться, реализовав эти исправления?
Не просто так ограничение существовало. К сожалению, я недостаточно хорошо знаю английский, чтобы запросить в список рассылки FreeBSD.