diff options
Diffstat (limited to 'fs/aufs/poll.c')
-rw-r--r-- | fs/aufs/poll.c | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/fs/aufs/poll.c b/fs/aufs/poll.c new file mode 100644 index 000000000..dd2baf5dc --- /dev/null +++ b/fs/aufs/poll.c @@ -0,0 +1,39 @@ +/* + * Copyright (C) 2005-2016 Junjiro R. Okajima + */ + +/* + * poll operation + * There is only one filesystem which implements ->poll operation, currently. + */ + +#include "aufs.h" + +unsigned int aufs_poll(struct file *file, poll_table *wait) +{ + unsigned int mask; + int err; + struct file *h_file; + struct super_block *sb; + + /* We should pretend an error happened. */ + mask = POLLERR /* | POLLIN | POLLOUT */; + sb = file->f_path.dentry->d_sb; + si_read_lock(sb, AuLock_FLUSH | AuLock_NOPLMW); + + h_file = au_read_pre(file, /*keep_fi*/0); + err = PTR_ERR(h_file); + if (IS_ERR(h_file)) + goto out; + + /* it is not an error if h_file has no operation */ + mask = DEFAULT_POLLMASK; + if (h_file->f_op->poll) + mask = h_file->f_op->poll(h_file, wait); + fput(h_file); /* instead of au_read_post() */ + +out: + si_read_unlock(sb); + AuTraceErr((int)mask); + return mask; +} |