diff options
author | Al Viro <viro@zeniv.linux.org.uk> | 2010-02-05 00:40:25 -0500 |
---|---|---|
committer | Al Viro <viro@zeniv.linux.org.uk> | 2010-03-03 14:07:59 -0500 |
commit | 9f5596af44514f99e3a654a4f7cb813354b9e516 (patch) | |
tree | 6a579bf387683b910bd32e8aa7edef9956e58dd1 | |
parent | e21e7095a78867364d7aa9223d833ccb966f93f3 (diff) |
take check for new events in namespace (guts of mounts_poll()) to namespace.c
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
-rw-r--r-- | fs/namespace.c | 15 | ||||
-rw-r--r-- | fs/proc/base.c | 10 | ||||
-rw-r--r-- | include/linux/mnt_namespace.h | 1 |
3 files changed, 18 insertions, 8 deletions
diff --git a/fs/namespace.c b/fs/namespace.c index d5906c19e08e..970fe79d7867 100644 --- a/fs/namespace.c +++ b/fs/namespace.c | |||
@@ -737,6 +737,21 @@ static void m_stop(struct seq_file *m, void *v) | |||
737 | up_read(&namespace_sem); | 737 | up_read(&namespace_sem); |
738 | } | 738 | } |
739 | 739 | ||
740 | int mnt_had_events(struct proc_mounts *p) | ||
741 | { | ||
742 | struct mnt_namespace *ns = p->ns; | ||
743 | int res = 0; | ||
744 | |||
745 | spin_lock(&vfsmount_lock); | ||
746 | if (p->event != ns->event) { | ||
747 | p->event = ns->event; | ||
748 | res = 1; | ||
749 | } | ||
750 | spin_unlock(&vfsmount_lock); | ||
751 | |||
752 | return res; | ||
753 | } | ||
754 | |||
740 | struct proc_fs_info { | 755 | struct proc_fs_info { |
741 | int flag; | 756 | int flag; |
742 | const char *str; | 757 | const char *str; |
diff --git a/fs/proc/base.c b/fs/proc/base.c index 58324c299165..746895ddfda1 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -647,17 +647,11 @@ static int mounts_release(struct inode *inode, struct file *file) | |||
647 | static unsigned mounts_poll(struct file *file, poll_table *wait) | 647 | static unsigned mounts_poll(struct file *file, poll_table *wait) |
648 | { | 648 | { |
649 | struct proc_mounts *p = file->private_data; | 649 | struct proc_mounts *p = file->private_data; |
650 | struct mnt_namespace *ns = p->ns; | ||
651 | unsigned res = POLLIN | POLLRDNORM; | 650 | unsigned res = POLLIN | POLLRDNORM; |
652 | 651 | ||
653 | poll_wait(file, &ns->poll, wait); | 652 | poll_wait(file, &p->ns->poll, wait); |
654 | 653 | if (mnt_had_events(p)) | |
655 | spin_lock(&vfsmount_lock); | ||
656 | if (p->event != ns->event) { | ||
657 | p->event = ns->event; | ||
658 | res |= POLLERR | POLLPRI; | 654 | res |= POLLERR | POLLPRI; |
659 | } | ||
660 | spin_unlock(&vfsmount_lock); | ||
661 | 655 | ||
662 | return res; | 656 | return res; |
663 | } | 657 | } |
diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h index d74785c2393a..0b89efc6f215 100644 --- a/include/linux/mnt_namespace.h +++ b/include/linux/mnt_namespace.h | |||
@@ -35,6 +35,7 @@ static inline void get_mnt_ns(struct mnt_namespace *ns) | |||
35 | extern const struct seq_operations mounts_op; | 35 | extern const struct seq_operations mounts_op; |
36 | extern const struct seq_operations mountinfo_op; | 36 | extern const struct seq_operations mountinfo_op; |
37 | extern const struct seq_operations mountstats_op; | 37 | extern const struct seq_operations mountstats_op; |
38 | extern int mnt_had_events(struct proc_mounts *); | ||
38 | 39 | ||
39 | #endif | 40 | #endif |
40 | #endif | 41 | #endif |