2016-04-17 6 views
1

Ich versuche einen Treiber zu reparieren, der im Kernel 3.16.0-69 auf d_alias oder d_u.d_alias verweist. Das Makro sucht nach den Kernel-Versionen und verwendet die entsprechende Version.C Preprozessor KERNEL_VERSION Referenz Fehlerkorrektur

#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 

Das Problem, das ich habe, ist, dass, wenn ich KERNEL_VERSION (3,16,0) es für 3.16.0-69 aber Pausen für 3.16.0-30 funktioniert. Wie kann ich den Bugfix-Teil des Kernels, die 69 oder 30 in diesem Beispiel, referenzieren. Ich habe es versucht und es funktioniert nicht.

Ich versuche, dies richtig zu beheben, wie ich dies beibehalten muss, bis der Anbieter es behebt.

+0

'0-69' ist' -69', die Werte sind ganze Zahlen. Sie können Versionen, die klein sind, nicht mit diesem Makro vergleichen –

+0

[getting-kernel-version-from-linux-kernel-modul-at-runtime] (http://stackoverflow.com/questions/8030758/getting-kernel-version- from-linux-kernel-modul-at-runtime/8030951 # 8030951) führte mich zu folgendem. '(LINUX_VERSION_CODE> = KERNEL_VERSION (3,16,0) && UTS_UBUNTU_RELEASE_ABI> 30)'. Nicht sicher, ob das der beste Weg ist – stephenc01

+0

Muss es zur Kompilierzeit getan werden? – Harry

Antwort

1

auf die Kommentare Basierend

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

würde meine Frage beantworten.

Ich musste auch

#include <generated/utsrelease.h>. 

Ein Nachteil ist, dass das Patch-Level der Verteilung hinzufügen hinzufügen einzigartig ist. d. h. Ubuntu in diesem Beispiel