【问题标题】:C Preprocessor KERNEL_VERSION reference bug fixC 预处理器 KERNEL_VERSION 参考错误修复
【发布时间】:2016-04-17 12:45:13
【问题描述】:

我正在尝试修复在内核 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。我如何引用内核的错误修复部分,在这个例子中是 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)

我正在尝试正确解决此问题,因为在供应商修复它之前我必须维护它。

【问题讨论】:

  • 0-69-69,值是整数。你不能用这个宏来比较这么小的版本
  • getting-kernel-version-from-linux-kernel-module-at-runtime 引导我执行以下操作。 (LINUX_VERSION_CODE >= KERNEL_VERSION(3,16,0) && UTS_UBUNTU_RELEASE_ABI > 30)。不确定这是否是最好的方法
  • 是否必须在编译时完成?
  • 如果您需要在编译时执行此操作(例如,而不是一些 autoconf hack),您将需要一些特定于发行版的测试,如 @stephenc01 所述。尽我所能,修复包含在内核版本> = 3.18.1 ||版本 >= 3.12.37 && 版本 = 3.14.40 && 版本 = 31.

标签: c linux compilation linux-kernel


【解决方案1】:

基于 cmets

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

会回答我的问题。

我还必须添加添加

#include <generated/utsrelease.h>. 

一个缺点是补丁级别是发行版独有的。即本例中的 Ubuntu

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-27
    • 1970-01-01
    • 2011-11-10
    • 2015-09-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多