vserver 2.0 rc7
[linux-2.6.git] / drivers / char / snsc.c
index 9d027ec..e3c0b52 100644 (file)
@@ -192,8 +192,8 @@ scdrv_read(struct file *file, char __user *buf, size_t count, loff_t *f_pos)
                }
 
                len = CHUNKSIZE;
-               add_wait_queue(&sd->sd_rq, &wait);
                set_current_state(TASK_INTERRUPTIBLE);
+               add_wait_queue(&sd->sd_rq, &wait);
                spin_unlock_irqrestore(&sd->sd_rlock, flags);
 
                schedule_timeout(SCDRV_TIMEOUT);
@@ -288,8 +288,8 @@ scdrv_write(struct file *file, const char __user *buf,
                        return -EAGAIN;
                }
 
-               add_wait_queue(&sd->sd_wq, &wait);
                set_current_state(TASK_INTERRUPTIBLE);
+               add_wait_queue(&sd->sd_wq, &wait);
                spin_unlock_irqrestore(&sd->sd_wlock, flags);
 
                schedule_timeout(SCDRV_TIMEOUT);
@@ -374,6 +374,7 @@ scdrv_init(void)
        void *salbuf;
        struct class_simple *snsc_class;
        dev_t first_dev, dev;
+       nasid_t event_nasid = ia64_sn_get_console_nasid();
 
        if (alloc_chrdev_region(&first_dev, 0, numionodes,
                                SYSCTL_BASENAME) < 0) {
@@ -441,6 +442,13 @@ scdrv_init(void)
                        ia64_sn_irtr_intr_enable(scd->scd_nasid,
                                                 0 /*ignored */ ,
                                                 SAL_IROUTER_INTR_RECV);
+
+                        /* on the console nasid, prepare to receive
+                         * system controller environmental events
+                         */
+                        if(scd->scd_nasid == event_nasid) {
+                                scdrv_event_init(scd);
+                        }
        }
        return 0;
 }