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
.