RDMA/ucma: Simplify ucma_get_event()
authorSean Hefty <sean.hefty@intel.com>
Thu, 5 Apr 2007 17:49:51 +0000 (10:49 -0700)
committerRoland Dreier <rolandd@cisco.com>
Tue, 24 Apr 2007 23:31:11 +0000 (16:31 -0700)
Use wait_event_interruptible() instead of a more complicated
open-coded equivalent.

Signed-off-by: Sean Hefty <sean.hefty@intel.com>
drivers/infiniband/core/ucma.c

index c859134c1daa3a0d73306f517bebc1c3920a949d..53b4c94a7eb5a34a0ffe8ab29a4dcb941967c33b 100644 (file)
@@ -306,26 +306,18 @@ static ssize_t ucma_get_event(struct ucma_file *file, const char __user *inbuf,
 
        mutex_lock(&file->mut);
        while (list_empty(&file->event_list)) {
-               if (file->filp->f_flags & O_NONBLOCK) {
-                       ret = -EAGAIN;
-                       break;
-               }
+               mutex_unlock(&file->mut);
 
-               if (signal_pending(current)) {
-                       ret = -ERESTARTSYS;
-                       break;
-               }
+               if (file->filp->f_flags & O_NONBLOCK)
+                       return -EAGAIN;
+
+               if (wait_event_interruptible(file->poll_wait,
+                                            !list_empty(&file->event_list)))
+                       return -ERESTARTSYS;
 
-               prepare_to_wait(&file->poll_wait, &wait, TASK_INTERRUPTIBLE);
-               mutex_unlock(&file->mut);
-               schedule();
                mutex_lock(&file->mut);
-               finish_wait(&file->poll_wait, &wait);
        }
 
-       if (ret)
-               goto done;
-
        uevent = list_entry(file->event_list.next, struct ucma_event, list);
 
        if (uevent->resp.event == RDMA_CM_EVENT_CONNECT_REQUEST) {