@@ -941,3 +941,34 @@ SYSCALL_DEFINE5(ppoll, struct pollfd __user *, ufds, unsigned int, nfds,
return ret;
}
#endif /* HAVE_SET_RESTORE_SIGMASK */
+
+#ifdef CONFIG_FILE_HOTPLUG
+static int unpoll_file_once(wait_queue_head_t *q, struct file *file)
+{
+ unsigned long flags;
+ wait_queue_t *curr, *next;
+ int found = 0;
+
+ spin_lock_irqsave(&q->lock, flags);
+ list_for_each_entry_safe(curr, next, &q->task_list, task_list) {
+ struct poll_table_entry *entry;
+ if (curr->func != pollwake)
+ continue;
+ entry = container_of(curr, struct poll_table_entry, wait);
+ if (entry->filp != file)
+ continue;
+ curr->func(curr, TASK_NORMAL, 0, NULL);
+ found = 1;
+ }
+ spin_unlock_irqrestore(&q->lock, flags);
+
+ return found;
+}
+
+void unpoll_file(wait_queue_head_t *q, struct file *file)
+{
+ while (unpoll_file_once(q, file))
+ schedule_timeout_uninterruptible(1);
+}
+EXPORT_SYMBOL(unpoll_file);
+#endif
@@ -131,6 +131,8 @@ extern int core_sys_select(int n, fd_set __user *inp, fd_set __user *outp,
extern int poll_select_set_timeout(struct timespec *to, long sec, long nsec);
+extern void unpoll_file(wait_queue_head_t *q, struct file *file);
+
#endif /* KERNEL */
#endif /* _LINUX_POLL_H */