fs: seq_file - add event counter to simplify poll() support
Subsystems (5)
PATCH 1/1 fs: seq_file - add event counter to simplify poll() support
Hey Al,
any objections? If not, care to pick that up?
Thanks,
Kay
From: Kay Sievers <[email protected]>
Subject: 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 [email protected]
Acked-by NeilBrown <[email protected]>
Tested-by Lucas De Marchi [email protected]
Signed-off-by Kay Sievers <[email protected]>
--- drivers/md/md.c | 26 ++++++++------------------ fs/namespace.c | 4 ++-- fs/proc/base.c | 2 +- include/linux/mnt_namespace.h | 1 - include/linux/seq_file.h | 1 + mm/swapfile.c | 29 ++++++++--------------------- 6 files changed, 20 insertions(+), 43 deletions(-)
drivers/md/md.c +8 -18
@@ -6394,16 +6394,11 @@ static void md_seq_stop(struct seq_file *seq, void *v)mddev_put (mddev); } -struct mdstat_info { -int event; -}; -static int md_seq_show (struct seq_file *seq,void *v) {mddev_t *mddev = v;sector_t sectors;mdk_rdev_t *rdev; -struct mdstat_info *mi = seq->private;struct bitmap *bitmap;if (v == (void *)1 ) {
@@ -6415,7 +6410,7 @@ static int md_seq_show(struct seq_file *seq, void *v)spin_unlock (&pers_lock);seq_printf (seq,"\n" ); - mi->event =atomic_read (&md_event_count); + seq->poll_event =atomic_read (&md_event_count);return 0 ; }if (v == (void *)2 ) {
@@ -6527,26 +6522,21 @@ static const struct seq_operations md_seq_ops = {static int md_seq_open (struct inode *inode,struct file *file) { +struct seq_file *seq;int error; -struct mdstat_info *mi =kmalloc (sizeof (*mi),GFP_KERNEL ); -if (mi ==NULL ) -return -ENOMEM ; error =seq_open (file, &md_seq_ops);if (error) -kfree (mi); -else { -struct seq_file *p = file->private_data; - p->private = mi; - mi->event =atomic_read (&md_event_count); - } +return error; + + seq = file->private_data; + seq->poll_event =atomic_read (&md_event_count);return error; }static unsigned int mdstat_poll (struct file *filp,poll_table *wait) { -struct seq_file *m = filp->private_data; -struct mdstat_info *mi = m->private; +struct seq_file *seq = filp->private_data;int mask;poll_wait (filp, &md_event_waiters, wait);
@@ -6554,7 +6544,7 @@ static unsigned int mdstat_poll(struct file *filp, poll_table *wait)/* always allow read */ mask =POLLIN |POLLRDNORM ; -if (mi->event !=atomic_read (&md_event_count)) +if (seq->poll_event !=atomic_read (&md_event_count)) mask |=POLLERR |POLLPRI ;return mask; }
fs/namespace.c +2 -2
@@ -934,8 +934,8 @@ int mnt_had_events(struct proc_mounts *p)int res =0 ;br_read_lock (vfsmount_lock); -if (p->event != ns->event) { - p->event = ns->event; +if (p->m.poll_event != ns->event) { + p->m.poll_event = ns->event; res =1 ; }br_read_unlock (vfsmount_lock);
fs/proc/base.c +1 -1
@@ -673,7 +673,7 @@ static int mounts_open_common(struct inode *inode, struct file *file, p->m.private = p; p->ns = ns; p->root = root; - p->event = ns->event; + p->m.poll_event = ns->event;return 0 ;
include/linux/mnt_namespace.h +0 -1
@@ -18,7 +18,6 @@ struct proc_mounts {struct seq_file m;/* must be the first element */ struct mnt_namespace *ns;struct path root; -int event; };struct fs_struct ;
include/linux/seq_file.h +1 -0
@@ -23,6 +23,7 @@ struct seq_file {u64 version;struct mutex lock;const struct seq_operations *op; +int poll_event;void *private; };
mm/swapfile.c +8 -21
@@ -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 = {