在我的linux内核驱动程序中,我需要将struct inode转换为struct btrfs_inode 为了做到这一点,我查看了btrfs_getattr的实现。
代码非常简单:
#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;
}
为了编译,我必须在函数顶部添加标题:
#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"
有什么问题?
我必须手动下载并包含ctree.h和btrfs_inode.h,它们不在kernel-headers包中提供。
在我编译驱动程序的每个平台上,我都有针对发行版/内核版本的特定VM,因此在每个VM上我通常都会下载包内核头文件,所有内容都可以完美编译。
btrfs是在上面的内核3.0中引入的 btrfs标题应该在那里吗? 它们存在于另一个包中吗?也许是fs-headers或类似的东西?
谢谢
答案 0 :(得分:0)
我通过下载kernel-sources包然后修改了makefile解决了这个问题
可能不建议使用此解决方案,但我可以接受,因为我构建的内核驱动程序只适合我维护的某些内核/发行版。
包括以下标题:
#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,0,0)
#include <fs/btrfs/ctree.h>
#include <fs/btrfs/btrfs_inode.h>
#endif
和Makefile我修改了EXTRA_CFLAGS属性“ - I / lib / modules / $(KERNEL_HEADERS)/ source”:
EXTRA_CFLAGS +=-D__Linux -std=gnu99 -I/lib/modules/$(KERNEL_HEADERS)/source