2009-12-27 18 views
6

Sto lavorando a un file system virtuale che non è basato su disco, un po 'come/proc. Ora voglio creare un link simbolico all'interno di esso su un target su un file system ext3. Non ho trovato alcuna documentazione standard sui modi per raggiungere questo obiettivo. Quello che ho indovinato finora è che devo scrivere una funzione da inserire per symlink in struct inode_operations. Ma francamente sono in perdita anche con i parametri della funzione.Implementazione di collegamenti simbolici in un file system virtuale

Se è importante, ho iniziato con questo tutorial su LWN: http://lwn.net/Articles/13325/

EDIT: Sto lavorando con libfs, si fonde al momento

+0

realtà sto lavorando su un modulo del kernel già esistente che utilizza libfs per creare il file system virtuale. So che sarebbe più facile se usassi FUSE ma in questo momento è fuori questione :) – user108127

risposta

2

Sono stato in grado di farlo finalmente. Ecco quello che ho fatto (alcuni dettagli possono variare a seconda di ciò che il filesystem vuole raggiungere):

  1. Creare inode del collegamento simbolico con la modalità S_IFLNK e aggiungere il bersaglio al campo i_private.

  2. Implementare follow_link perché generic_readlink le impone di essere presente

 
static void *sample_follow_link (struct dentry *dentry, struct nameidata *nd) 
{ 
    nd->depth = 0; 
    nd_set_link(nd, (char *)dentry->d_inode->i_private); 
    return NULL; 
} 

static struct inode_operations sample_inode_ops = { 
    .readlink = generic_readlink, 
    .follow_link = sample_follow_link, 
}; 

..... 
//in the function for the dentry and inode creation 
inode->i_op = sample_inode_ops 

1

vorrei suggerire di dare un'occhiata al Linux/fs/ext2/codice sorgente. File symlink.c, inode.c, namei.c e probabilmente pochi altri. Avrai un'idea su ciò che deve essere fatto. Contrariamente alle aspettative, il codice del filesystem dei singoli filesystem è in realtà molto breve e di facile lettura.

Ma forse invece di creare un nuovo file system virtuale, potresti farti un'altra domanda, non sarebbe sufficiente il fusibile a livello di file system dell'utente nel mio caso? Hanno una documentazione leggermente migliore per la creazione di filesystem virtuali e qualche altro esempio.

+0

Grazie per il suggerimento. Cercherò sicuramente nel codice sorgente di ext2 per alcune idee sull'implementazione. – user108127

3

Presumibilmente si sta utilizzando fuse, se non sei, fare :)

Tutto quello che dovete fare è implementare la funzione getattr per dire al kernel che l'oggetto è un link simbolico, quindi implementare la funzione readlink e restituire il percorso a cui il collegamento dovrebbe collegarsi; il kernel farà il resto.

Problemi correlati