que juego filesystem unix filesystems posix fuse

unix - juego - que es fuse



¿Definiendo PATH_MAX para un sistema de archivos? (5)

En Linux, la implementación de pathconf de pathconf devuelve un valor constante en tiempo de compilación de PATH_MAX, por lo que no hay ningún FUSE mágico de tiempo de ejecución ni ninguna otra persona puede realizar el ajuste para ajustarlo. (Consulte sysdeps / unix / sysv / linux / pathconf.c que corresponde a sysdeps / posix / pathconf.c.) La respuesta a su pregunta "¿Cómo especifico mi PATH_MAX de mi sistema de archivos?" es "No se puede. glibc no te permite y FUSE es solo el mensajero".

El resultado final es una situación pegajosa. Aquí hay una publicación de blog que analiza el código que le importa y no le importa PATH_MAX. El software que se basa en rutas que no son más que PATH_MAX se rompió hace mucho tiempo por otros sistemas de archivos, por lo que es seguro ignorar PATH_MAX.

En MacOS X (y probablemente en otros BSD): la implementación de pathconf está completamente en el kernel y puede intercambiarse por sistema de archivos. OSXFUSE incluye una versión de NOOP de pathconf que debe devolver las constantes de tiempo de compilación habituales. Sin embargo, en mis pruebas parece estar capturando otra función de NOOP en el camino que devuelve un ENXIO y no puedo hacer que pathconf funcione.

Bonificación: para NAME_MAX, implementa statfs y establece f_namemax.

Actualmente estoy escribiendo un sistema de archivos. Las statvfs (e incluso las statfs ) contienen un campo que especifica la longitud máxima de un nombre en esa ruta. Como PATH_MAX se define en la página de pathconf ( getconf ), esto significa que se define por directorio (y, por lo tanto, determinado por el sistema de archivos subyacente). ¿Cómo se especifica este valor?


No me basta con otros SO, pero me parece que es una configuración de todo el sistema en al menos FreeBSD 5.2.1

PATH_MAX se encuentra en # 62 sys/syslimits.h


Debido a static int ufs_pathconf() que devuelve la información PATHCONF para UFS FS, utiliza esta variable de la manera especificada.

/* * 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 es una configuración de todo el sistema y generalmente se define en pathmax.h como:

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


POSIX permite que _PC_PATH_MAX varíe según el directorio actual, pero eso no significa que los sistemas que no lo varían no sean compatibles.

La verdadera razón de que PATH_MAX exista es que el kernel copia la ruta en el espacio del kernel antes de realizar cualquier trabajo real con ella.

Su afirmación de que hay un campo relacionado con statvfs en statvfs es simplemente incorrecto. Eso está relacionado con NAME_MAX , que es algo diferente.


PATH_MAX comporta principalmente como una propiedad de la interfaz de llamada a la función del sistema de archivos, por lo que no creo que tenga mucho sentido que varíe según los directorios.

Por ejemplo, cambiar el nombre o mover un directorio con grandes árboles de directorios puede hacer que el nombre de ruta absoluta más largo sea más largo y sería complicado e ineficiente limitarlo.

En cambio, PATH_MAX sirve para permitir que el kernel copie las PATH_MAX pasadas a la memoria no paginada temporal, que luego puede procesarse sin necesidad de permitir un error de página en cada acceso. Asignar grandes cantidades de dicha memoria puede bloquear la mayoría de las otras cosas que está haciendo el kernel o incluso causar pánicos de kernel.