summaryrefslogtreecommitdiff
path: root/drivers/dahdi/dahdi-base.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/dahdi/dahdi-base.c')
-rw-r--r--drivers/dahdi/dahdi-base.c32
1 files changed, 29 insertions, 3 deletions
diff --git a/drivers/dahdi/dahdi-base.c b/drivers/dahdi/dahdi-base.c
index a9cd775..2a5d6f9 100644
--- a/drivers/dahdi/dahdi-base.c
+++ b/drivers/dahdi/dahdi-base.c
@@ -8617,14 +8617,40 @@ static void process_timers(void)
spin_unlock(&dahdi_timer_lock);
}
-static unsigned int dahdi_timer_poll(struct file *file, struct poll_table_struct *wait_table)
+/**
+ * dahdi_timer_poll - Poll function for a dahdi_timer.
+ * @file: Open timer handle.
+ * @wait_table: Just passing through...
+ *
+ * Returns 0 if there isn't anything to wake us up, otherwise POLLPRI if there
+ * is an event waiting on the timer.
+ *
+ * Older versions of Asterisk depend on the behavior that this poll will block
+ * indefintely if the timer has not been configured, so if there is no rate
+ * attached to the timer, this function must return 0.
+ *
+ */
+static unsigned int
+dahdi_timer_poll(struct file *file, struct poll_table_struct *wait_table)
{
struct dahdi_timer *timer = file->private_data;
- struct dahdi_timer_rate *rate = timer->rate;
+ struct dahdi_timer_rate *rate;
- if (!rate || !timer)
+ if (!timer)
return -EINVAL;
+ rate = timer->rate;
+
+ if (!rate) {
+ static bool __once;
+ if (!__once) {
+ __once = true;
+ module_printk(KERN_NOTICE,
+ "Calling poll on unconfigured timer.\n");
+ }
+ return 0;
+ }
+
poll_wait(file, &rate->sel, wait_table);
if (atomic_read(&timer->tripped) || atomic_read(&timer->ping))
return POLLPRI;