From: Vladimir Sokolovsky Date: Mon, 4 Jun 2012 20:17:55 +0000 (+0300) Subject: Fix SLES11 SP2 support X-Git-Tag: compat-2012-07-02~2 X-Git-Url: https://openfabrics.org/gitweb/?a=commitdiff_plain;h=4afbf288f02acd5dbd19589cc02c83141eefa80e;p=~emulex%2Ffor-vlad%2Fold%2Fcompat.git Fix SLES11 SP2 support Signed-off-by: Vladimir Sokolovsky --- diff --git a/compat/Makefile b/compat/Makefile index a6bfa2d..0cc0620 100644 --- a/compat/Makefile +++ b/compat/Makefile @@ -34,7 +34,7 @@ compat-$(CONFIG_COMPAT_KERNEL_2_6_39) += \ compat-2.6.39.o \ kstrtox.o compat-$(CONFIG_COMPAT_KERNEL_3_0) += compat-3.0.o -compat-$(CONFIG_COMPAT_KERNEL_3_1) += compat-3.1.o +# compat-$(CONFIG_COMPAT_KERNEL_3_1) += compat-3.1.o compat-$(CONFIG_COMPAT_KERNEL_3_2) += compat-3.2.o compat-$(CONFIG_COMPAT_CORDIC) += cordic.o diff --git a/compat/compat-3.1.c b/compat/compat-3.1.c deleted file mode 100644 index 5eda45f..0000000 --- a/compat/compat-3.1.c +++ /dev/null @@ -1,63 +0,0 @@ -/* - * Lock-less NULL terminated single linked list - * - * The basic atomic operation of this list is cmpxchg on long. On - * architectures that don't have NMI-safe cmpxchg implementation, the - * list can NOT be used in NMI handlers. So code that uses the list in - * an NMI handler should depend on CONFIG_ARCH_HAVE_NMI_SAFE_CMPXCHG. - * - * Copyright 2010,2011 Intel Corp. - * Author: Huang Ying - * - * This program is free software; you can redistribute it and/or - * modify it under the terms of the GNU General Public License version - * 2 as published by the Free Software Foundation; - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program; if not, write to the Free Software - * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA - */ -#include -#include -#include -#include - -#include - -/** - * llist_del_first - delete the first entry of lock-less list - * @head: the head for your lock-less list - * - * If list is empty, return NULL, otherwise, return the first entry - * deleted, this is the newest added one. - * - * Only one llist_del_first user can be used simultaneously with - * multiple llist_add users without lock. Because otherwise - * llist_del_first, llist_add, llist_add (or llist_del_all, llist_add, - * llist_add) sequence in another user may change @head->first->next, - * but keep @head->first. If multiple consumers are needed, please - * use llist_del_all or use lock between consumers. - */ -struct llist_node *llist_del_first(struct llist_head *head) -{ - struct llist_node *entry, *old_entry, *next; - - entry = head->first; - for (;;) { - if (entry == NULL) - return NULL; - old_entry = entry; - next = entry->next; - entry = cmpxchg(&head->first, old_entry, next); - if (entry == old_entry) - break; - } - - return entry; -} -EXPORT_SYMBOL_GPL(llist_del_first); diff --git a/compat/compat-3.2.c b/compat/compat-3.2.c index 4569f73..ee3d192 100644 --- a/compat/compat-3.2.c +++ b/compat/compat-3.2.c @@ -50,6 +50,7 @@ int __ethtool_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) } EXPORT_SYMBOL(__ethtool_get_settings); +#ifndef CONFIG_COMPAT_SLES_11_2 /** * llist_add_batch - add several linked entries in batch * @new_first: first entry in batch to be added @@ -76,3 +77,37 @@ bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last, } EXPORT_SYMBOL_GPL(llist_add_batch); +/** + * llist_del_first - delete the first entry of lock-less list + * @head: the head for your lock-less list + * + * If list is empty, return NULL, otherwise, return the first entry + * deleted, this is the newest added one. + * + * Only one llist_del_first user can be used simultaneously with + * multiple llist_add users without lock. Because otherwise + * llist_del_first, llist_add, llist_add (or llist_del_all, llist_add, + * llist_add) sequence in another user may change @head->first->next, + * but keep @head->first. If multiple consumers are needed, please + * use llist_del_all or use lock between consumers. + */ +struct llist_node *llist_del_first(struct llist_head *head) +{ + struct llist_node *entry, *old_entry, *next; + + entry = head->first; + for (;;) { + if (entry == NULL) + return NULL; + old_entry = entry; + next = entry->next; + entry = cmpxchg(&head->first, old_entry, next); + if (entry == old_entry) + break; + } + + return entry; +} +EXPORT_SYMBOL_GPL(llist_del_first); + +#endif /* CONFIG_COMPAT_SLES_11_2 */ diff --git a/include/linux/llist.h b/include/linux/llist.h index b15d0c7..a2a3742 100644 --- a/include/linux/llist.h +++ b/include/linux/llist.h @@ -7,6 +7,11 @@ extern bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last, struct llist_head *head); +extern struct llist_node *llist_del_first(struct llist_head *head); +#else + +#ifdef CONFIG_COMPAT_SLES_11_2 +#include_next #else #ifndef LLIST_H @@ -193,7 +198,9 @@ static inline struct llist_node *llist_del_all(struct llist_head *head) extern bool llist_add_batch(struct llist_node *new_first, struct llist_node *new_last, struct llist_head *head); + extern struct llist_node *llist_del_first(struct llist_head *head); +#endif /* CONFIG_COMPAT_SLES_11_2 */ #endif /* LLIST_H */ #endif /* (LINUX_VERSION_CODE >= KERNEL_VERSION(3,2,0) */