Signed-off-by: Paul Chavent <paul.chav...@onera.fr>
---
 drivers/pps/pps.c | 57 +++++++++++++++++++++++++++++--------------------------
 1 file changed, 30 insertions(+), 27 deletions(-)

diff --git a/drivers/pps/pps.c b/drivers/pps/pps.c
index 7173e3a..86ff57e 100644
--- a/drivers/pps/pps.c
+++ b/drivers/pps/pps.c
@@ -152,35 +152,38 @@ static long pps_cdev_ioctl(struct file *file,
                if (err)
                        return -EFAULT;
 
-               ev = pps->last_ev;
-
-               /* Manage the timeout */
-               if (fdata.timeout.flags & PPS_TIME_INVALID)
-                       err = wait_event_interruptible(pps->queue,
-                                       ev != pps->last_ev);
-               else {
-                       unsigned long ticks;
-
-                       dev_dbg(pps->dev, "timeout %lld.%09d\n",
-                                       (long long) fdata.timeout.sec,
-                                       fdata.timeout.nsec);
-                       ticks = fdata.timeout.sec * HZ;
-                       ticks += fdata.timeout.nsec / (NSEC_PER_SEC / HZ);
-
-                       if (ticks != 0) {
-                               err = wait_event_interruptible_timeout(
-                                               pps->queue,
-                                               ev != pps->last_ev,
-                                               ticks);
-                               if (err == 0)
-                                       return -ETIMEDOUT;
+               if (!(file->f_flags & O_NONBLOCK)) {
+                       ev = pps->last_ev;
+
+                       /* Manage the timeout */
+                       if (fdata.timeout.flags & PPS_TIME_INVALID)
+                               err = wait_event_interruptible(pps->queue,
+                                               ev != pps->last_ev);
+                       else {
+                               unsigned long ticks;
+
+                               dev_dbg(pps->dev, "timeout %lld.%09d\n",
+                                               (long long) fdata.timeout.sec,
+                                               fdata.timeout.nsec);
+                               ticks = fdata.timeout.sec * HZ;
+                               ticks += fdata.timeout.nsec /
+                                       (NSEC_PER_SEC / HZ);
+
+                               if (ticks != 0) {
+                                       err = wait_event_interruptible_timeout(
+                                                       pps->queue,
+                                                       ev != pps->last_ev,
+                                                       ticks);
+                                       if (err == 0)
+                                               return -ETIMEDOUT;
+                               }
                        }
-               }
 
-               /* Check for pending signals */
-               if (err == -ERESTARTSYS) {
-                       dev_dbg(pps->dev, "pending signal caught\n");
-                       return -EINTR;
+                       /* Check for pending signals */
+                       if (err == -ERESTARTSYS) {
+                               dev_dbg(pps->dev, "pending signal caught\n");
+                               return -EINTR;
+                       }
                }
 
                /* Return the fetched timestamp */
-- 
1.7.12.1

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/

Reply via email to