Определение PATH_MAX для файловой системы?
Я сейчас пишу файловую систему. statvfs
(и даже statfs
) структуры содержат поле, определяющее максимальную длину имени в этом пути. Как PATH_MAX
определяется в pathconf
manpage (getconf
), это означает, что он определяется для каждого каталога (и, следовательно, определяется базовой файловой системой). Как определить это значение?
6 ответов
Поскольку этот вопрос помечен как "FUSE" ...
Я только столкнулся с этой проблемой, работая над файловой системой FUSE. Я написал электронное письмо разработчикам FUSE с просьбой дать разъяснения. Ответ от текущего libfuse
сопровождающий (январь 2018 г.): невозможно указать максимальную длину пути в файловой системе FUSE [драйвер].
Есть ли способ для файловой системы FUSE сообщить программному обеспечению, работающему на ней, о правильной максимальной длине пути?
Не сейчас, нет.
Если нет, должно ли быть?
Вероятно, да. Патчи приветствуются:-)
Для справки: Полная электронная почта
PATH_MAX
в основном ведет себя как свойство интерфейса вызова функций файловой системы, поэтому я не думаю, что имеет смысл менять его в разных каталогах.
Например, переименование или перемещение каталога с большими деревьями каталогов в нем может сделать длинный абсолютный путь длиннее, и его будет сложно и неэффективно ограничить.
Вместо, PATH_MAX
служит для того, чтобы позволить ядру копировать переданные имена путей во временную невыгружаемую память, которая затем может обрабатываться без необходимости ошибки страницы при каждом доступе. Выделение огромного количества такой памяти может заблокировать большинство других вещей, которые делает ядро, или даже вызвать панику ядра.
В Linux реализация glibc pathconf
возвращает значение константы времени компиляции PATH_MAX, поэтому нет волшебной среды выполнения FUSE или кто-либо другой может выполнить ее настройку. (См. Sysdeps/unix/sysv/linux/pathconf.c, который переходит к sysdeps/posix/pathconf.c.) Ответ на ваш вопрос "Как мне указать PATH_MAX моей файловой системы?" это "Вы не можете. Glibc не позволяет вам, а FUSE просто посланник".
Конечный результат - неприятная ситуация. Вот запись в блоге, в которой обсуждается код, который заботится о PATH_MAX и не заботится о нем. Программное обеспечение, которое использует пути не более PATH_MAX, давно было взломано другими файловыми системами, поэтому вы можете игнорировать PATH_MAX.
В MacOS X (и, возможно, других BSD): реализация pathconf
полностью в ядре и может быть заменено на файловую систему. OSXFUSE включает в себя NOOP-версию pathconf, которая должна возвращать обычные константы времени компиляции. Тем не менее, в моих тестах кажется, что по ходу дела ловит другую функцию NOOP, которая возвращает ENXIO, и я не могу заставить работать pathconf.
Бонус: для NAME_MAX внедрите statfs и установите f_namemax.
POSIX позволяет _PC_PATH_MAX
изменяться в зависимости от текущего каталога, но это не означает, что системы, которые не меняются, не соответствуют требованиям.
Настоящая причина PATH_MAX
существует то, что ядро копирует путь в пространство ядра перед тем, как приступить к работе с ним.
Ваше утверждение, что есть PATH_MAX
поле в statvfs
это просто неправильно. Это связано с NAME_MAX
, это другое дело.
Мне мало о других ОС, но imho это общесистемный параметр как минимум во FreeBSD 5.2.1
PATH_MAX находится в #62 sys/syslimits.h
Так как static int ufs_pathconf()
который возвращает PATHCONF
информация для UFS FS, использует эту переменную в указанном вами порядке.
/*
* Return POSIX pathconf information applicable to ufs filesystems.
*/
int
ufs_pathconf(ap)
struct vop_pathconf_args /* {
struct vnode *a_vp;
int a_name;
int *a_retval;
} */ *ap;
{
switch (ap->a_name) {
.
.
.
.
case _PC_PATH_MAX:
*ap->a_retval = PATH_MAX;
return (0);
.
.
.
.
default:
return (EINVAL);
}
/* NOTREACHED */
}
PATH_MAX является общесистемной настройкой и обычно определяется в pathmax.h как:
define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
: pathconf ("/", _PC_PATH_MAX))