【发布时间】:2017-03-22 16:22:23
【问题描述】:
在我的 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 上,我通常会下载包 kernel-headers 并且一切都可以完美编译。
btrfs 是在 3.0 以上的内核中引入的。
btrfs 标头不应该在那里吗?
它们存在于另一个包中吗?也许 fs-headers 或类似的东西?
谢谢
【问题讨论】:
-
fs/btrfs下的标头包含 API btrfs 驱动程序专用:此 API 仅用于驱动程序的实现。所以,你的全部目的 -I need to cast struct inode to struct btrfs_inode- 并不“好”,因为你正试图使用其他人的私有 API。在这种情况下,没有获取此类 API 的通用方法。 -
suse 通过调用 (inode->i_op->getattr(NULL, dentry, &kstat) 解决了这个问题,我想避免开销并简单地进行强制转换。所以我查看了 btrfs inode getattr implementation .
-
你的代码怎么知道inode属于一个btrfs文件系统?
-
通过检查 inode 的超级块类型
标签: linux-kernel filesystems linux-device-driver btrfs