vserver 1.9.5.x5
[linux-2.6.git] / drivers / w1 / w1_family.c
index 6a62d2a..ccde36d 100644 (file)
 
 #include <linux/spinlock.h>
 #include <linux/list.h>
+#include <linux/delay.h>
 
 #include "w1_family.h"
 
-spinlock_t w1_flock = SPIN_LOCK_UNLOCKED;
+DEFINE_SPINLOCK(w1_flock);
 static LIST_HEAD(w1_families);
 
 static int w1_check_family(struct w1_family *f)
@@ -84,8 +85,13 @@ void w1_unregister_family(struct w1_family *fent)
 
        spin_unlock(&w1_flock);
 
-       while (atomic_read(&fent->refcnt))
-               schedule_timeout(10);
+       while (atomic_read(&fent->refcnt)) {
+               printk(KERN_INFO "Waiting for family %u to become free: refcnt=%d.\n",
+                               fent->fid, atomic_read(&fent->refcnt));
+
+               if (msleep_interruptible(1000))
+                       flush_signals(current);
+       }
 }
 
 /*