0

在我的 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 或类似的东西?

谢谢

4

1 回答 1

0

我通过下载内核源包解决了这个问题,然后修改了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
于 2017-03-22T08:22:23.007 回答