2009-12-27 25 views
6

Estoy trabajando en un sistema de archivos virtual que no está basado en disco, algo así como/proc. Ahora quiero crear un enlace simbólico dentro de un destino en un sistema de archivos ext3. No he encontrado ninguna documentación estándar sobre las formas de lograr esto. Lo que he adivinado hasta ahora es que tengo que escribir una función para poner en symlink en struct inode_operations. Pero francamente estoy perdido incluso con los parámetros de la función.Implementación de enlaces simbólicos en un sistema de archivos virtual

si importa, Me comenzó con este tutorial sobre LWN: http://lwn.net/Articles/13325/

EDIT: Estoy trabajando con libfs, no se fusionan en el momento

+0

realidad estoy trabajando en un módulo del kernel ya existente que utiliza libfs para crear el sistema de archivos virtual. Sé que sería más fácil si estuviera usando FUSE pero ahora está fuera de cuestión :) – user108127

Respuesta

2

Pude lograrlo finalmente. Esto es lo que hice (algunos detalles pueden variar en función de lo que el sistema de ficheros quiere lograr):

  1. Crear i-nodo del enlace simbólico con el modo S_IFLNK y añadir el destino al campo i_private.

  2. Implementar follow_link porque generic_readlink requiere que esté 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

sugeriría a echar un vistazo a Linux/fs/ext2/código fuente. Archivos symlink.c, inode.c, namei.c y probablemente algunos otros. Te darás una idea de lo que hay que hacer. Contrario a lo esperado, el código del sistema de archivos de los sistemas de archivos individuales es realmente muy corto y fácil de leer.

¿Pero tal vez en lugar de crear un nuevo sistema de archivos virtual, podría hacerse otra pregunta, no fusionaría el sistema de archivos de nivel de usuario en mi caso? Tienen una documentación ligeramente mejor para crear sistemas de archivos virtuales y algunos ejemplos más.

+0

Gracias por la sugerencia. Definitivamente buscaré en el código fuente ext2 algunas ideas sobre la implementación. – user108127

3

Es de suponer que está utilizando fuse, si no está, lo hacen :)

Todo lo que tiene que hacer es poner en práctica la función getattr para decirle al kernel que el objeto es un enlace simbólico, a continuación, aplicar la función readlink y devolver la ruta a la que debe vincular el enlace; el kernel hará el resto.

Cuestiones relacionadas