if (error) 
if (error) { /* we failed... before resuming, bring back devices from * dpm_off_irq list back to main dpm_off list, we do want * to call resume() on them, in case they partially suspended * despite returning -EAGAIN */ while (!list_empty(&dpm_off_irq)) { struct list_head * entry = dpm_off_irq.next; list_del(entry); list_add(entry, &dpm_off); } 
int device_suspend(pm_message_t state){	int error = 0;	down(&dpm_sem);	down(&dpm_list_sem);	while (!list_empty(&dpm_active) && error == 0) {		struct list_head * entry = dpm_active.prev;		struct device * dev = to_device(entry);		get_device(dev);		up(&dpm_list_sem);		error = suspend_device(dev, state);		down(&dpm_list_sem);		/* Check if the device got removed */		if (!list_empty(&dev->power.entry)) {			/* Move it to the dpm_off or dpm_off_irq list */			if (!error) {				list_del(&dev->power.entry);				list_add(&dev->power.entry, &dpm_off);			} else if (error == -EAGAIN) {				list_del(&dev->power.entry);				list_add(&dev->power.entry, &dpm_off_irq);				error = 0;			}		}		if (error)			printk(KERN_ERR "Could not suspend device %s: "				"error %d\n", kobject_name(&dev->kobj), error);		put_device(dev);	}	up(&dpm_list_sem);	if (error)		dpm_resume();	up(&dpm_sem);	return error;}
4520	/local/tlutelli/issta_data/temp/c/2005_temp/2005/4520/42b16c051c3f462095fb8c9bad1bc05b34518cb9/suspend.c/buggy/drivers/base/power/suspend.c