|
@@ -730,9 +730,18 @@ void gnttab_request_free_callback(struct gnttab_free_callback *callback,
|
|
void (*fn)(void *), void *arg, u16 count)
|
|
void (*fn)(void *), void *arg, u16 count)
|
|
{
|
|
{
|
|
unsigned long flags;
|
|
unsigned long flags;
|
|
|
|
+ struct gnttab_free_callback *cb;
|
|
|
|
+
|
|
spin_lock_irqsave(&gnttab_list_lock, flags);
|
|
spin_lock_irqsave(&gnttab_list_lock, flags);
|
|
- if (callback->next)
|
|
|
|
- goto out;
|
|
|
|
|
|
+
|
|
|
|
+ /* Check if the callback is already on the list */
|
|
|
|
+ cb = gnttab_free_callback_list;
|
|
|
|
+ while (cb) {
|
|
|
|
+ if (cb == callback)
|
|
|
|
+ goto out;
|
|
|
|
+ cb = cb->next;
|
|
|
|
+ }
|
|
|
|
+
|
|
callback->fn = fn;
|
|
callback->fn = fn;
|
|
callback->arg = arg;
|
|
callback->arg = arg;
|
|
callback->count = count;
|
|
callback->count = count;
|