Domanda

Attualmente sto scrivendo un filesystem.IL statvfs (e anche il statfs) contengono un campo che specifica la lunghezza massima di un nome in quel percorso.COME PATH_MAX è definito nel pathconf pagina man (getconf), ciò significa che è definito in base alla directory (e quindi determinato dal filesystem sottostante).Come si specifica questo valore?

È stato utile?

Soluzione

Poiché questa domanda è taggata "fusibile" ...

Ho appena corso in questo problema mentre si lavora su un filesystem Fuse.Ho scritto una e-mail agli sviluppatori di fusibili, cercando chiarimenti.Risposta dall'attuale manutentore libfuse (Gennaio 2018): non è un modo per specificare la lunghezza massima del percorso in un filesystem Fuse [driver].

.
.

C'è un modo per un filesystem Fuse per informare il software in esecuzione in cima di esso sulla lunghezza del percorso massima corretta?

Non al momento, no.

.

In caso contrario, dovrebbe esserci?

probabilmente sì.Patch Benvenuti: -)

per riferimento: filettatura e-mail completa

Altri suggerimenti

PATH_MAX si comporta principalmente come proprietà dell'interfaccia di chiamata della funzione del file system, quindi non penso che abbia molto senso averlo vario attraverso le directory.

Ad esempio, la ridenominazione o lo spostamento di una directory con grandi alberi di directory in esso può rendere più a lungo il nome assoluto più lungo e sarebbe complicato e inefficiente per limitarlo.

Invece, PATH_MAX serve per consentire al kernel di copiare i percorsi superati a memoria temporanea nongata, che può quindi essere elaborata senza bisogno di consentire un errore di pagina ad ogni accesso.Allocare enormi quantità di tale memoria possono bloccare la maggior parte delle altre cose che il kernel sta facendo o persino causa il panico del kernel.

Su Linux, l'implementazione di glibc di pathconf restituisce un valore costante in fase di compilazione di PATH_MAX quindi non esiste alcun FUSE magico di runtime o chiunque altro possa eseguire per regolarlo.; è "Non puoi.glibc non te lo permette e FUSE è solo il messaggero."

Il risultato finale è una situazione difficile. Ecco un post sul blog che discute il codice che si preoccupa e non si preoccupa di PATH_MAX. Il software che si basa su percorsi non più lunghi di PATH_MAX è stato interrotto molto tempo fa da altri file system, quindi è sicuro ignorare PATH_MAX.

Su MacOS X (e probabilmente altri BSD):L'implementazione di pathconf è interamente nel kernel e può essere scambiato per filesystem.OSXFUSE include una versione NOOP di pathconf che dovrebbe restituire le consuete costanti in fase di compilazione.Tuttavia, nei miei test sembra che venga rilevata un'altra funzione NOOP lungo il percorso che restituisce un ENXIO e non riesco a far funzionare pathconf.

Bonus:per NAME_MAX, implementa statfs e imposta f_namemax.

POSIX lo consente _PC_PATH_MAX variare in base alla directory corrente, ma ciò non significa che i sistemi which non variare non sono conformi.

Il vero motivo per PATH_MAX esistente è che il kernel copia il percorso nel kernelspace prima di eseguire qualsiasi lavoro effettivo con esso.

La tua affermazione che esiste un PATH_MAX-campo correlato in statvfs è semplicemente sbagliato.Questo è legato a NAME_MAX, che è una cosa diversa.

Non ho abbastanza su altri ose ma imho Questa è un'impostazione a livello di sistema in almeno FreeBSD 5.2.1

path_max è trovato in # 62 sys/syslimits.h


Perché static int ufs_pathconf() che restituisce le informazioni PATHCONF per UFS FS, utilizza questa variabile nel modo specificato.

/*
 * 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 è un'impostazione di sistema ampia ed è solitamente definita in pathmax.h come:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top