Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / kernel / wait.c
index 791681c..5cdf169 100644 (file)
@@ -33,13 +33,35 @@ void fastcall add_wait_queue_exclusive(wait_queue_head_t *q, wait_queue_t *wait)
 }
 EXPORT_SYMBOL(add_wait_queue_exclusive);
 
-void fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
+int fastcall remove_wait_queue(wait_queue_head_t *q, wait_queue_t *wait)
 {
        unsigned long flags;
+       struct list_head *list;
+       int seen, retval;
 
        spin_lock_irqsave(&q->lock, flags);
-       __remove_wait_queue(q, wait);
+       list = &q->task_list;
+       seen = 0;
+       retval = -1;
+
+       do {
+               struct list_head *next;
+               if (list == &wait->task_list)
+                       seen++;
+               next = list->next;
+               if (next->prev != list) {
+                       seen += 2;
+                       break;
+               }
+               list = next;
+       } while (list != &q->task_list);
+
+       if (seen == 1) {
+               __remove_wait_queue(q, wait);
+               retval = 0;
+       }
        spin_unlock_irqrestore(&q->lock, flags);
+       return retval;
 }
 EXPORT_SYMBOL(remove_wait_queue);