rem: int int_remove_io_interrupt_handler(int vector, int (*func)(void*), void* data)
add: int_remove_io_interrupt_handler(int vector, int (*func)(void*), void* data)
context: int int_remove_io_interrupt_handler(int vector, int (*func)(void*), void* data) {         struct io_handler *io, *prev = NULL;         int state;         // lock the structures down so it is not modified while we search         state = int_disable_interrupts();         acquire_spinlock(&io_vectors[vector].vector_lock);         // start at the beginning         io = io_vectors[vector].handler_list;         // while not at end         while(io != NULL) {                 // see if we match both the function & data                 if (io->func == func && io->data == data)                         break;                 // Store our backlink and move to next                 prev = io;                 io = io->next;         }         // If we found it         if (io != NULL) {                 // unlink it, taking care of the change it was the first in line                 if (prev != NULL)                         prev->next = io->next;                 else                         io_vectors[vector].handler_list = io->next;         }         // release our lock as we're done with the vector         release_spinlock(&io_vectors[vector].vector_lock);         int_restore_interrupts(state);         // and disable the IRQ if nothing left         if (io != NULL) {                 if (prev == NULL && io->next == NULL)                         arch_int_disable_io_interrupt(vector);                 kfree(io);         }         return (io != NULL) ? 0 : EINVAL; } 