} /* Check for someone yanking out a board */ list_for_each(tmp, &slot_list) { slot = list_entry(tmp, struct slot, slot_list); if(slot->extracting) { /* * Hmmm, we're likely hosed at this point, should we * bother trying to tell the driver or not? */ err("card in slot %s was improperly removed", slot->hotplug_slot->name); if(update_adapter_status(slot->hotplug_slot, 0)) { warn("failure to update adapter file"); } slot->extracting = 0; } } 
} while(atomic_read(&extracting) != 0); 
event_thread(void *data){	int rc;	struct slot *slot;	struct list_head *tmp;	lock_kernel();	daemonize("cpci_hp_eventd");	unlock_kernel();	dbg("%s - event thread started", __FUNCTION__);	while(1) {		dbg("event thread sleeping");		down_interruptible(&event_semaphore);		dbg("event thread woken, thread_finished = %d",		    thread_finished);		if(thread_finished || signal_pending(current))			break;		while(controller->ops->query_enum()) {			rc = check_slots();			if (rc > 0)				/* Give userspace a chance to handle extraction */				msleep(500);			else if (rc < 0) {				dbg("%s - error checking slots", __FUNCTION__);				thread_finished = 1;				break;			}		}		/* Check for someone yanking out a board */		list_for_each(tmp, &slot_list) {			slot = list_entry(tmp, struct slot, slot_list);			if(slot->extracting) {				/*				 * Hmmm, we're likely hosed at this point, should we				 * bother trying to tell the driver or not?				 */				err("card in slot %s was improperly removed",				    slot->hotplug_slot->name);				if(update_adapter_status(slot->hotplug_slot, 0)) {					warn("failure to update adapter file");				}				slot->extracting = 0;			}		}		/* Re-enable ENUM# interrupt */		dbg("%s - re-enabling irq", __FUNCTION__);		controller->ops->enable_irq();	}	dbg("%s - event thread signals exit", __FUNCTION__);	up(&thread_exit);	return 0;}
10457	/local/tlutelli/issta_data/temp/c/2005_temp/2005/10457/43b7d7cfb157b5c8c5cc0933f4e96fd81adc81ca/cpci_hotplug_core.c/clean/drivers/pci/hotplug/cpci_hotplug_core.c