take check for new events in namespace (guts of mounts_poll()) to namespace.c
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
This commit is contained in:
@@ -737,6 +737,21 @@ static void m_stop(struct seq_file *m, void *v)
|
|||||||
up_read(&namespace_sem);
|
up_read(&namespace_sem);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
int mnt_had_events(struct proc_mounts *p)
|
||||||
|
{
|
||||||
|
struct mnt_namespace *ns = p->ns;
|
||||||
|
int res = 0;
|
||||||
|
|
||||||
|
spin_lock(&vfsmount_lock);
|
||||||
|
if (p->event != ns->event) {
|
||||||
|
p->event = ns->event;
|
||||||
|
res = 1;
|
||||||
|
}
|
||||||
|
spin_unlock(&vfsmount_lock);
|
||||||
|
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
struct proc_fs_info {
|
struct proc_fs_info {
|
||||||
int flag;
|
int flag;
|
||||||
const char *str;
|
const char *str;
|
||||||
|
@@ -647,17 +647,11 @@ static int mounts_release(struct inode *inode, struct file *file)
|
|||||||
static unsigned mounts_poll(struct file *file, poll_table *wait)
|
static unsigned mounts_poll(struct file *file, poll_table *wait)
|
||||||
{
|
{
|
||||||
struct proc_mounts *p = file->private_data;
|
struct proc_mounts *p = file->private_data;
|
||||||
struct mnt_namespace *ns = p->ns;
|
|
||||||
unsigned res = POLLIN | POLLRDNORM;
|
unsigned res = POLLIN | POLLRDNORM;
|
||||||
|
|
||||||
poll_wait(file, &ns->poll, wait);
|
poll_wait(file, &p->ns->poll, wait);
|
||||||
|
if (mnt_had_events(p))
|
||||||
spin_lock(&vfsmount_lock);
|
|
||||||
if (p->event != ns->event) {
|
|
||||||
p->event = ns->event;
|
|
||||||
res |= POLLERR | POLLPRI;
|
res |= POLLERR | POLLPRI;
|
||||||
}
|
|
||||||
spin_unlock(&vfsmount_lock);
|
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
@@ -35,6 +35,7 @@ static inline void get_mnt_ns(struct mnt_namespace *ns)
|
|||||||
extern const struct seq_operations mounts_op;
|
extern const struct seq_operations mounts_op;
|
||||||
extern const struct seq_operations mountinfo_op;
|
extern const struct seq_operations mountinfo_op;
|
||||||
extern const struct seq_operations mountstats_op;
|
extern const struct seq_operations mountstats_op;
|
||||||
|
extern int mnt_had_events(struct proc_mounts *);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
Reference in New Issue
Block a user