vserver 1.9.5.x5
[linux-2.6.git] / drivers / ieee1394 / nodemgr.c
index 1d22fe8..21472e9 100644 (file)
@@ -69,8 +69,7 @@ static int nodemgr_bus_read(struct csr1212_csr *csr, u64 addr, u16 length,
                if (!ret)
                        break;
 
-               set_current_state(TASK_INTERRUPTIBLE);
-               if (schedule_timeout (HZ/3))
+               if (msleep_interruptible(334))
                        return -EINTR;
        }
 
@@ -1074,7 +1073,7 @@ do {                                                              \
 
 #undef PUT_ENVP
 
-       envp[i] = 0;
+       envp[i] = NULL;
 
        return 0;
 }
@@ -1474,19 +1473,28 @@ static int nodemgr_host_thread(void *__hi)
 
        /* Sit and wait for a signal to probe the nodes on the bus. This
         * happens when we get a bus reset. */
-       while (!down_interruptible(&hi->reset_sem) &&
-              !down_interruptible(&nodemgr_serialize)) {
+       while (1) {
                unsigned int generation = 0;
                int i;
 
-               if (hi->kill_me)
+               if (down_interruptible(&hi->reset_sem) ||
+                   down_interruptible(&nodemgr_serialize)) {
+                       if (try_to_freeze(PF_FREEZE))
+                               continue;
+                       printk("NodeMgr: received unexpected signal?!\n" );
                        break;
+               }
+
+               if (hi->kill_me) {
+                       up(&nodemgr_serialize);
+                       break;
+               }
 
                /* Pause for 1/4 second in 1/16 second intervals,
                 * to make sure things settle down. */
                for (i = 0; i < 4 ; i++) {
                        set_current_state(TASK_INTERRUPTIBLE);
-                       if (schedule_timeout(HZ/16)) {
+                       if (msleep_interruptible(63)) {
                                up(&nodemgr_serialize);
                                goto caught_signal;
                        }
@@ -1502,6 +1510,12 @@ static int nodemgr_host_thread(void *__hi)
                         * start the the waiting over again */
                        while (!down_trylock(&hi->reset_sem))
                                i = 0;
+
+                       /* Check the kill_me again */
+                       if (hi->kill_me) {
+                               up(&nodemgr_serialize);
+                               goto caught_signal;
+                       }
                }
 
                if (!nodemgr_check_irm_capability(host, reset_cycles)) {
@@ -1702,12 +1716,23 @@ static struct hpsb_highlevel nodemgr_highlevel = {
        .remove_host =  nodemgr_remove_host,
 };
 
-void init_ieee1394_nodemgr(void)
+int init_ieee1394_nodemgr(void)
 {
-       class_register(&nodemgr_ne_class);
-       class_register(&nodemgr_ud_class);
+       int ret;
+
+       ret = class_register(&nodemgr_ne_class);
+       if (ret < 0)
+               return ret;
+
+       ret = class_register(&nodemgr_ud_class);
+       if (ret < 0) {
+               class_unregister(&nodemgr_ne_class);
+               return ret;
+       }
 
        hpsb_register_highlevel(&nodemgr_highlevel);
+
+       return 0;
 }
 
 void cleanup_ieee1394_nodemgr(void)