C预处理器KERNEL_VERSION参考错误修复

时间:2016-04-17 12:45:13

标签: c linux compilation linux-kernel

我正在尝试修复在内核3.16.0-69中引用d_alias或d_u.d_alias的驱动程序。宏查找内核版本并使用适当的版本。

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0) || LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) || LINUX_VERSION_CODE == KERNEL_VERSION(3,16,67)
    //946e51f2bf37f1656916eb75bd0742ba33983c28, move d_rcu from overlapping d_child to overlapping d_alias;
    //SLES 12.1 (3.12.49) back port it too
    dentry = hlist_entry(p, struct dentry, d_u.d_alias);
#else
    dentry = hlist_entry(p, struct dentry, d_alias);
#endif

我遇到的问题是,如果我使用KERNEL_VERSION(3,16,0),它适用于3.16.0-69但是打破了3.16.0-30。我如何引用内核的bugfix部分,在本例中为69或30。我试过这个并没有用。

#if LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0-31) || LINUX_VERSION_CODE >= KERNEL_VERSION(3,19,0) || LINUX_VERSION_CODE == KERNEL_VERSION(3,12,49) || LINUX_VERSION_CODE == KERNEL_VERSION(3,16,67)

我正在努力解决这个问题,因为我必须保持这一点,直到供应商修复它为止。

1 个答案:

答案 0 :(得分:2)

基于评论

(LINUX_VERSION_CODE == KERNEL_VERSION(3,16,0) && UTS_UBUNTU_RELEASE_ABI > 30) 

会回答我的问题。

我还必须添加添加

#include <generated/utsrelease.h>. 

一个缺点是补丁级别对于分发是唯一的。即本例中的Ubuntu