Obtenir des descripteurs de fichiers et des détails dans l’espace du kernel sans ouvrir ()

Quelqu’un pourrait-il fournir le code pour surmonter ce problème?

En effet, comment obtenir la struct inode* au niveau du kernel pour le fichier /dev/driver1 ?

Compte tenu de l’espace utilisateur:

 int fd; fd = open("/dev/driver1", O_RDWR | O_SYNC); 

Dans l’espace kernel:

 static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) struct dev_handle *handle; handle = file->private_data; 

En supposant que, nous ne passons pas par ce chemin,

Comment pouvons-nous obtenir dans le kernel lui-même, par exemple. coder en dur le file->private_data à donner à gérer?

Vous recherchez la fonction filp_open . À partir du fichier include/linux/fs.h :

 struct file *filp_open(const char *filename, int flags, umode_t mode); 

Voici un lien vers la source de la fonction et la documentation: http://lxr.free-electrons.com/source/fs/open.c#L937

Si vous avez vraiment besoin de FD, vous pouvez utiliser sys_open (non exporté dans les nouveaux kernelx):

 long sys_open(const char __user *filename, int flags, int mode); 

Vous pouvez trouver une très bonne réponse à une question similaire: Comment lire / écrire des fichiers dans un module du kernel Linux?

Modifier (comment obtenir inode ):

Vous pouvez obtenir l’ inode cache à partir du struct file :

 struct file *file = ...; struct inode *inode = file->inode; 

Si vous le voulez avec le locking: voici un arrière-plan: Documentation/filesystems/path-lookup.txt

Le sharepoint départ de la traversée est current->fs->root . Il y a un certain nombre de fonctions dans le kernel, qui font déjà le travail, vous pouvez les trouver dans le fichier source fs/namei.c .

Il y a une fonction: kern_path :

 int error; struct inode *inode; struct path path; error = kern_path(pathname, LOOKUP_FOLLOW, &path); if (error) ...; inode = path.dentry->d_inode; 

Votre code est dans la fonction dev_ioctl? Si oui, alors

 static long dev_ioctl(struct file *file, unsigned cmd, unsigned long arg) struct dev_handle *handle; struct inode *inode; handle = file->private_data; inode = file->f_inode; 

Il semble ne pas y avoir de documentation sensée pour les exigences de locking, vous devriez donc probablement essayer de trouver du code similaire et voir comment il fonctionne sur le membre f_inode .