NFSv4: Remove BKL from the nfsv4 state recovery
[pandora-kernel.git] / drivers / char / genrtc.c
index 817dc40..69f0a29 100644 (file)
@@ -12,7 +12,7 @@
  *
  *     This driver allows use of the real time clock (built into
  *     nearly all computers) from user space. It exports the /dev/rtc
- *     interface supporting various ioctl() and also the /proc/dev/rtc
+ *     interface supporting various ioctl() and also the /proc/driver/rtc
  *     pseudo-file for status information.
  *
  *     The ioctls can be used to set the interrupt behaviour where
@@ -102,7 +102,7 @@ static void gen_rtc_interrupt(unsigned long arg);
  * Routine to poll RTC seconds field for change as often as possible,
  * after first RTC_UIE use timer to reduce polling
  */
-static void genrtc_troutine(void *data)
+static void genrtc_troutine(struct work_struct *work)
 {
        unsigned int tmp = get_rtc_ss();
        
@@ -173,7 +173,6 @@ static void gen_rtc_interrupt(unsigned long arg)
 static ssize_t gen_rtc_read(struct file *file, char __user *buf,
                        size_t count, loff_t *ppos)
 {
-       DECLARE_WAITQUEUE(wait, current);
        unsigned long data;
        ssize_t retval;
 
@@ -183,18 +182,10 @@ static ssize_t gen_rtc_read(struct file *file, char __user *buf,
        if (file->f_flags & O_NONBLOCK && !gen_rtc_irq_data)
                return -EAGAIN;
 
-       add_wait_queue(&gen_rtc_wait, &wait);
-       retval = -ERESTARTSYS;
-
-       while (1) {
-               set_current_state(TASK_INTERRUPTIBLE);
-               data = xchg(&gen_rtc_irq_data, 0);
-               if (data)
-                       break;
-               if (signal_pending(current))
-                       goto out;
-               schedule();
-       }
+       retval = wait_event_interruptible(gen_rtc_wait,
+                       (data = xchg(&gen_rtc_irq_data, 0)));
+       if (retval)
+               goto out;
 
        /* first test allows optimizer to nuke this case for 32-bit machines */
        if (sizeof (int) != sizeof (long) && count == sizeof (unsigned int)) {
@@ -206,10 +197,7 @@ static ssize_t gen_rtc_read(struct file *file, char __user *buf,
                retval = put_user(data, (unsigned long __user *)buf) ?:
                        sizeof(unsigned long);
        }
- out:
-       current->state = TASK_RUNNING;
-       remove_wait_queue(&gen_rtc_wait, &wait);
-
+out:
        return retval;
 }
 
@@ -255,7 +243,7 @@ static inline int gen_set_rtc_irq_bit(unsigned char bit)
                irq_active = 1;
                stop_rtc_timers = 0;
                lostint = 0;
-               INIT_WORK(&genrtc_task, genrtc_troutine, NULL);
+               INIT_WORK(&genrtc_task, genrtc_troutine);
                oldsecs = get_rtc_ss();
                init_timer(&timer_task);
 
@@ -377,7 +365,7 @@ static int gen_rtc_release(struct inode *inode, struct file *file)
 #ifdef CONFIG_PROC_FS
 
 /*
- *     Info exported via "/proc/rtc".
+ *     Info exported via "/proc/driver/rtc".
  */
 
 static int gen_rtc_proc_output(char *buf)