2017-03-20 6 views
0

Dans mon pilote de noyau Linux, j'ai besoin de lancer struct inode pour struct btrfs_inode. Pour ce faire, j'ai regardé la mise en œuvre de btrfs_getattr
.inclure les en-têtes de noyau linux pour le système de fichiers btrfs

le code est assez simple:

#include "/data/kernel/linux-4.1.21-x86_64/fs/btrfs/ctree.h" 
#include "/data/kernel/linux-4.1.21-x86_64/fs/btrfs/btrfs_inode.h" 
static dev_t get_device_id_btrfs(struct inode* inode){ 
if (inode != NULL) { 
    struct btrfs_inode *btrfsInode; 
    btrfsInode = BTRFS_I(inode); 
    if (btrfsInode != NULL && btrfsInode->root != NULL) { 
     return btrfsInode->root->anon_dev; 
    } 
} 
return 0; 
} 

afin de compiler je dois ajouter les en-têtes au-dessus de la fonction:

#include "/data/kernel/linux-4.1.21-x86_64/fs/btrfs/ctree.h" 
#include "/data/kernel/linux-4.1.21-x86_64/fs/btrfs/btrfs_inode.h" 

Quel est le problème?
Je dois télécharger manuellement et inclure ctree.h et btrfs_inode.h, ils ne sont pas fournis dans le paquetage kernel-headers.
Sur chaque plate-forme, je compile mon pilote, j'ai une machine virtuelle spécifique pour la distribution/noyau, donc sur chaque machine virtuelle, je télécharge habituellement les en-têtes de paquets et tout se compile parfaitement.

btrfs a été introduit dans le noyau 3.0 ci-dessus.
Arent les en-têtes de btrfs devraient être là? existent-ils dans un autre paquet? peut-être fs-headers ou quelque chose comme ça?

Merci

+0

en-têtes sous ' fs/btrfs' contient API ** private pour le pilote btrfs **: cette API est destinée à être utilisée * uniquement dans l'implémentation du pilote *. Donc, tout votre but - 'Je dois lancer struct inode à struct btrfs_inode' - n'est pas" bon ", parce que vous essayez ** d'utiliser l'API privée d'un autre **. Dans de tels cas, il n'y a pas d'approches communes pour obtenir une telle API. – Tsyvarev

+0

suse résolu en appelant (inode-> i_op-> getattr (NULL, dentry, & kstat), je voulais éviter la surcharge et simplement faire le cast .. donc j'ai regardé dans l'implémentation de btrfs inode getattr – ilansch

+0

Comment votre code sais que l'inode appartient à un système de fichiers btrfs? –

Répondre

0

Je résolu ce problème en paquet kernel-sources téléchargement, puis modifié makefile.
Cette solution n'est peut-être pas recommandée, mais elle est acceptable pour moi puisque je construis un pilote de noyau qui ne s'adapte qu'à certains noyaux/distributions que je maintiens.
comprennent les en-têtes suivants:

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0) 
#include <fs/btrfs/ctree.h> 
#include <fs/btrfs/btrfs_inode.h> 
#endif 

et le Makefile i modifié la propriété EXTRA_CFLAGS "-I/lib/modules/$ (kernel_headers)/source":

EXTRA_CFLAGS +=-D__Linux -std=gnu99 -I/lib/modules/$(KERNEL_HEADERS)/source