summaryrefslogtreecommitdiffstats
path: root/fs/kernfs/file.c
diff options
context:
space:
mode:
Diffstat (limited to 'fs/kernfs/file.c')
-rw-r--r--fs/kernfs/file.c31
1 files changed, 20 insertions, 11 deletions
diff --git a/fs/kernfs/file.c b/fs/kernfs/file.c
index f8d5021a652e..ae948aaa4c53 100644
--- a/fs/kernfs/file.c
+++ b/fs/kernfs/file.c
@@ -832,26 +832,35 @@ void kernfs_drain_open_files(struct kernfs_node *kn)
832 * to see if it supports poll (Neither 'poll' nor 'select' return 832 * to see if it supports poll (Neither 'poll' nor 'select' return
833 * an appropriate error code). When in doubt, set a suitable timeout value. 833 * an appropriate error code). When in doubt, set a suitable timeout value.
834 */ 834 */
835__poll_t kernfs_generic_poll(struct kernfs_open_file *of, poll_table *wait)
836{
837 struct kernfs_node *kn = kernfs_dentry_node(of->file->f_path.dentry);
838 struct kernfs_open_node *on = kn->attr.open;
839
840 poll_wait(of->file, &on->poll, wait);
841
842 if (of->event != atomic_read(&on->event))
843 return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
844
845 return DEFAULT_POLLMASK;
846}
847
835static __poll_t kernfs_fop_poll(struct file *filp, poll_table *wait) 848static __poll_t kernfs_fop_poll(struct file *filp, poll_table *wait)
836{ 849{
837 struct kernfs_open_file *of = kernfs_of(filp); 850 struct kernfs_open_file *of = kernfs_of(filp);
838 struct kernfs_node *kn = kernfs_dentry_node(filp->f_path.dentry); 851 struct kernfs_node *kn = kernfs_dentry_node(filp->f_path.dentry);
839 struct kernfs_open_node *on = kn->attr.open; 852 __poll_t ret;
840 853
841 if (!kernfs_get_active(kn)) 854 if (!kernfs_get_active(kn))
842 goto trigger; 855 return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
843 856
844 poll_wait(filp, &on->poll, wait); 857 if (kn->attr.ops->poll)
858 ret = kn->attr.ops->poll(of, wait);
859 else
860 ret = kernfs_generic_poll(of, wait);
845 861
846 kernfs_put_active(kn); 862 kernfs_put_active(kn);
847 863 return ret;
848 if (of->event != atomic_read(&on->event))
849 goto trigger;
850
851 return DEFAULT_POLLMASK;
852
853 trigger:
854 return DEFAULT_POLLMASK|EPOLLERR|EPOLLPRI;
855} 864}
856 865
857static void kernfs_notify_workfn(struct work_struct *work) 866static void kernfs_notify_workfn(struct work_struct *work)