diff --git a/fs/namespace.c b/fs/namespace.c
index 73db467677e4..f5ba6fc6220c 100644
--- a/fs/namespace.c
+++ b/fs/namespace.c
@@ -580,19 +580,45 @@ static inline int check_mnt(struct vfsmount *mnt)
 	return mnt->mnt_ns == current->nsproxy->mnt_ns;
 }
 
+#ifdef CONFIG_VE
+void get_mnt_poll(struct mnt_namespace *ns,
+		  wait_queue_head_t **ppoll, int **pevent)
+{
+	struct ve_struct *ve = get_exec_env();
+
+	if (ns == init_task.nsproxy->mnt_ns) {
+		*ppoll = &ve->mnt_poll;
+		*pevent = &ve->mnt_event;
+	} else {
+		*ppoll = &ns->poll;
+		*pevent = &ns->event;
+	}
+}
+#endif
+
 static void touch_mnt_namespace(struct mnt_namespace *ns)
 {
+	wait_queue_head_t *ppoll;
+	int *pevent;
+
 	if (ns) {
-		ns->event = ++event;
-		wake_up_interruptible(&ns->poll);
+		get_mnt_poll(ns, &ppoll, &pevent);
+		*pevent = ++event;
+		wake_up_interruptible(ppoll);
 	}
 }
 
 static void __touch_mnt_namespace(struct mnt_namespace *ns)
 {
-	if (ns && ns->event != event) {
-		ns->event = event;
-		wake_up_interruptible(&ns->poll);
+	wait_queue_head_t *ppoll;
+	int *pevent;
+
+	if (ns) {
+		get_mnt_poll(ns, &ppoll, &pevent);
+		if (*pevent != event) {
+			*pevent = event;
+			wake_up_interruptible(ppoll);
+		}
 	}
 }
 
diff --git a/fs/proc/base.c b/fs/proc/base.c
index c21187a388fb..08ccf2623102 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -790,6 +790,8 @@ static int mounts_open_common(struct inode *inode, struct file *file,
 	struct mnt_namespace *ns = NULL;
 	struct path root;
 	struct proc_mounts *p;
+	wait_queue_head_t *ppoll;
+	int *pevent;
 	int ret = -EINVAL;
 
 	if (task) {
@@ -821,10 +823,12 @@ static int mounts_open_common(struct inode *inode, struct file *file,
 	if (ret)
 		goto err_free;
 
+	get_mnt_poll(ns, &ppoll, &pevent);
+
 	p->m.private = p;
 	p->ns = ns;
 	p->root = root;
-	p->event = ns->event;
+	p->event = *pevent;
 	p->iter = NULL;
 	p->iter_pos = 0;
 	p->iter_advanced = 0;
@@ -856,12 +860,15 @@ static unsigned mounts_poll(struct file *file, poll_table *wait)
 	struct proc_mounts *p = file->private_data;
 	struct mnt_namespace *ns = p->ns;
 	unsigned res = POLLIN | POLLRDNORM;
+	wait_queue_head_t *ppoll;
+	int *pevent;
 
-	poll_wait(file, &ns->poll, wait);
+	get_mnt_poll(ns, &ppoll, &pevent);
+	poll_wait(file, ppoll, wait);
 
 	spin_lock(&vfsmount_lock);
-	if (p->event != ns->event) {
-		p->event = ns->event;
+	if (p->event != *pevent) {
+		p->event = *pevent;
 		res |= POLLERR | POLLPRI;
 	}
 	spin_unlock(&vfsmount_lock);
diff --git a/include/linux/mnt_namespace.h b/include/linux/mnt_namespace.h
index 3bb98934952c..e5c8804551a4 100644
--- a/include/linux/mnt_namespace.h
+++ b/include/linux/mnt_namespace.h
@@ -51,5 +51,17 @@ extern const struct seq_operations mountstats_op;
 
 extern struct rw_semaphore namespace_sem;
 
+#ifdef CONFIG_VE
+extern void get_mnt_poll(struct mnt_namespace *ns,
+		wait_queue_head_t **ppoll, int **pevent);
+#else
+static inline void get_mnt_poll(struct mnt_namespace *ns,
+		wait_queue_head_t **ppoll, int **pevent)
+{
+	*ppoll = &ns->poll;
+	*pevent = &ns->event;
+}
+#endif
+
 #endif
 #endif
diff --git a/include/linux/ve.h b/include/linux/ve.h
index 8e020db0fa2a..142df70d51a7 100644
--- a/include/linux/ve.h
+++ b/include/linux/ve.h
@@ -220,6 +220,9 @@ struct ve_struct {
 
 	atomic_t		mnt_nr;
 
+	wait_queue_head_t	mnt_poll;
+	int			mnt_event;
+
 	void			*lve;
 
 	spinlock_t		aio_nr_lock;
diff --git a/kernel/ve/ve.c b/kernel/ve/ve.c
index cfbd76ec47d3..b4d04c2f20d5 100644
--- a/kernel/ve/ve.c
+++ b/kernel/ve/ve.c
@@ -97,6 +97,8 @@ struct ve_struct ve0 = {
 	.fsync_enable		= FSYNC_FILTERED,
 	.sync_mutex		= __MUTEX_INITIALIZER(ve0.sync_mutex),
 	.mnt_nr			= ATOMIC_INIT(0),
+	.mnt_poll		= __WAIT_QUEUE_HEAD_INITIALIZER(ve0.mnt_poll),
+	.mnt_event		= 0,
 	.aio_nr			= 0,
 	.aio_max_nr		= AIO_MAX_NR_DEFAULT,
 };
diff --git a/kernel/ve/vecalls.c b/kernel/ve/vecalls.c
index 29423a95498a..fdc2734f4642 100644
--- a/kernel/ve/vecalls.c
+++ b/kernel/ve/vecalls.c
@@ -920,6 +920,9 @@ static int init_ve_struct(struct ve_struct *ve, envid_t veid,
 
 	atomic_set(&ve->mnt_nr, 0);
 
+	init_waitqueue_head(&ve->mnt_poll);
+	ve->mnt_event = 0;
+
 	spin_lock_init(&ve->aio_nr_lock);
 	ve->aio_nr = 0;
 	ve->aio_max_nr = AIO_MAX_NR_DEFAULT;
