fs: seq_file - add event counter to simplify poll() support

Moving the event counter into the dynamically allocated 'struc seq_file'
allows poll() support without the need to allocate its own tracking
structure.

All current users are switched over to use the new counter.

Requested-by: Andrew Morton akpm@linux-foundation.org
Acked-by: NeilBrown <neilb@suse.de>
Tested-by: Lucas De Marchi lucas.demarchi@profusion.mobi
Signed-off-by: Kay Sievers <kay.sievers@vrfy.org>
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
Kay Sievers
2011-07-12 20:48:39 +02:00
committed by Al Viro
parent 72c5052ddc
commit f15146380d
6 changed files with 20 additions and 43 deletions

View File

@@ -1681,19 +1681,14 @@ out:
}
#ifdef CONFIG_PROC_FS
struct proc_swaps {
struct seq_file seq;
int event;
};
static unsigned swaps_poll(struct file *file, poll_table *wait)
{
struct proc_swaps *s = file->private_data;
struct seq_file *seq = file->private_data;
poll_wait(file, &proc_poll_wait, wait);
if (s->event != atomic_read(&proc_poll_event)) {
s->event = atomic_read(&proc_poll_event);
if (seq->poll_event != atomic_read(&proc_poll_event)) {
seq->poll_event = atomic_read(&proc_poll_event);
return POLLIN | POLLRDNORM | POLLERR | POLLPRI;
}
@@ -1783,24 +1778,16 @@ static const struct seq_operations swaps_op = {
static int swaps_open(struct inode *inode, struct file *file)
{
struct proc_swaps *s;
struct seq_file *seq;
int ret;
s = kmalloc(sizeof(struct proc_swaps), GFP_KERNEL);
if (!s)
return -ENOMEM;
file->private_data = s;
ret = seq_open(file, &swaps_op);
if (ret) {
kfree(s);
if (ret)
return ret;
}
s->seq.private = s;
s->event = atomic_read(&proc_poll_event);
return ret;
seq = file->private_data;
seq->poll_event = atomic_read(&proc_poll_event);
return 0;
}
static const struct file_operations proc_swaps_operations = {