Implémentation de liens symboliques dans un système de fichiers virtuel

Je travaille sur un système de fichiers virtuel qui n’est pas basé sur disque, un peu comme / proc. Maintenant, je veux créer un lien symbolique vers une cible sur un système de fichiers ext3. Je n’ai trouvé aucune documentation standard sur les moyens d’y parvenir. Ce que j’ai deviné jusqu’ici, c’est que je dois écrire une fonction pour insérer un symlink dans struct inode_operations . Mais franchement je suis désemparé même avec les parameters de la fonction.

Si c’est important, j’ai commencé avec ce tutoriel sur LWN: http://lwn.net/Articles/13325/

EDIT: Je travaille avec libfs, pas FUSE pour le moment

Vous utilisez probablement le fusible , si vous n’êtes pas, faites 🙂

Tout ce que vous avez à faire est d’implémenter la fonction getattr pour indiquer au kernel que l’object est un lien symbolique, puis implémentez la fonction readlink et renvoyez le chemin auquel le lien doit être lié; le kernel fera le rest.

J’ai pu y arriver enfin. Voici ce que j’ai fait (certains détails peuvent différer selon ce que le système de fichiers veut réaliser):

  1. Créez l’inode du lien symbolique avec le mode S_IFLNK et ajoutez la cible au champ i_private.

  2. Implémentez follow_link car generic_readlink exige qu’il soit présent

 statique vide * sample_follow_link (struct dentry * dentry, struct nameidata * nd)
 {
     nd-> depth = 0;
     nd_set_link (nd, (char *) dentry-> d_inode-> i_private);
     retourne NULL;
 }

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

 .....
 // dans la fonction de création de dentry et d'inode 
 inode-> i_op = sample_inode_ops

Je suggère de regarder linux / fs / ext2 / code source. Fichiers symlink.c, inode.c, namei.c et probablement peu d’autres. Vous aurez une idée de ce qui doit être fait. Contrairement aux attentes, le code du système de fichiers des systèmes de fichiers individuels est en fait très court et facile à lire.

Mais peut-être qu’au lieu de créer un nouveau système de fichiers virtuel, vous pourriez vous poser une autre question, ne pas fusionner le système de fichiers de niveau utilisateur dans mon cas? Ils ont une documentation légèrement meilleure pour créer des systèmes de fichiers virtuels et quelques exemples supplémentaires.