Определение PATH_MAX для файловой системы? - PullRequest
21 голосов
/ 24 июля 2010

Я сейчас пишу файловую систему.Структуры statvfs (и даже statfs) содержат поле, указывающее максимальную длину имени в этом пути.Поскольку PATH_MAX определено в справочной странице pathconf (getconf), это означает, что она определяется для каждого каталога (и, следовательно, определяется базовой файловой системой).).Как указать это значение?

Ответы [ 6 ]

3 голосов
/ 11 сентября 2010

PATH_MAX в основном ведет себя как свойство интерфейса вызова функции файловой системы, поэтому я не думаю, что имеет смысл менять его в разных каталогах.

Например, переименование или перемещение каталога с большими деревьями каталогов в нем может сделать длинный абсолютный путь длиннее, и его будет сложно и неэффективно ограничить.

Вместо этого PATH_MAX служит для того, чтобы позволить ядру копировать переданные имена путей во временную невыгружаемую память, которая затем может обрабатываться без необходимости ошибки страницы при каждом доступе. Выделение огромного количества такой памяти может блокировать большинство других действий, выполняемых ядром, или даже вызывать панику ядра.

2 голосов
/ 07 июня 2013

POSIX позволяет _PC_PATH_MAX варьироваться в зависимости от текущего каталога, но это не означает, что системы, которые не отличаются, не соответствуют.

Настоящая причина существования PATH_MAX заключается в том, что ядро ​​копирует путь в пространство ядра перед выполнением какой-либо реальной работы с ним.

Ваше утверждение о наличии PATH_MAX связанного поля в statvfs просто неверно. Это связано с NAME_MAX, а это совсем другое.

2 голосов
/ 07 июня 2013

В 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.

1 голос
/ 03 января 2018

Поскольку этот вопрос помечен как «FUSE» ...

Я только что столкнулся с этой проблемой, работая над файловой системой FUSE.Я написал электронное письмо разработчикам FUSE с просьбой дать разъяснения.Ответ от текущего libfuse сопровождающего (январь 2018 года): невозможно указать максимальную длину пути в файловой системе FUSE [драйвер].

Есть ли способ дляФайловая система FUSE для информирования программного обеспечения, работающего поверх нее, о правильной максимальной длине пути?

В данный момент нет.

Если нет, то должно ли быть?

Вероятно, да.Патчи приветствуются: -)

Для справки: Полная ветка электронной почты

0 голосов
/ 12 октября 2011

Мне мало о других ОС, но 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 */
}
0 голосов
/ 24 июля 2010

PATH_MAX является общесистемной настройкой и обычно определяется в pathmax.h как:

define PATH_MAX (pathconf ("/", _PC_PATH_MAX) < 1 ? 1024 \
            : pathconf ("/", _PC_PATH_MAX))
...