Oleg Nesterov e56fb28740 exec: do not abuse ->cred_guard_mutex in threadgroup_lock()
threadgroup_lock() takes signal->cred_guard_mutex to ensure that
thread_group_leader() is stable.  This doesn't look nice, the scope of
this lock in do_execve() is huge.

And as Dave pointed out this can lead to deadlock, we have the
following dependencies:

	do_execve:		cred_guard_mutex -> i_mutex
	cgroup_mount:		i_mutex -> cgroup_mutex
	attach_task_by_pid:	cgroup_mutex -> cred_guard_mutex

Change de_thread() to take threadgroup_change_begin() around the
switch-the-leader code and change threadgroup_lock() to avoid
->cred_guard_mutex.

Note that de_thread() can't sleep with ->group_rwsem held, this can
obviously deadlock with the exiting leader if the writer is active, so it
does threadgroup_change_end() before schedule().

Reported-by: Dave Jones <davej@redhat.com>
Acked-by: Tejun Heo <tj@kernel.org>
Acked-by: Li Zefan <lizefan@huawei.com>
Signed-off-by: Oleg Nesterov <oleg@redhat.com>
Cc: <stable@vger.kernel.org>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
2013-04-30 17:04:07 -07:00
..
2013-03-02 16:33:54 -08:00
2013-03-01 13:39:00 -08:00
2013-01-02 17:36:10 -08:00
2013-03-02 16:46:07 -08:00
2013-01-03 14:34:06 -08:00
2013-03-22 15:18:18 -07:00
2013-03-19 19:15:52 +01:00
2013-04-08 17:39:23 +02:00
2013-03-12 11:30:04 -07:00
2012-12-24 09:36:38 -07:00
2013-02-26 02:46:08 -05:00
2013-04-29 18:28:40 -07:00
2013-01-24 09:04:04 +01:00
2013-02-22 23:31:31 -05:00
2013-04-29 13:55:38 -07:00
2013-01-25 21:03:54 -08:00
2013-04-29 18:28:41 -07:00
2013-02-06 15:59:47 -05:00
2013-01-29 13:59:57 -05:00
2013-01-10 11:44:38 -06:00
2013-04-30 17:04:06 -07:00
2013-03-13 18:03:27 +01:00
2013-04-30 17:04:00 -07:00
2013-01-21 17:18:20 +10:30
2012-12-25 18:45:06 -05:00
2013-04-29 18:28:44 -07:00
2013-03-02 16:46:07 -08:00
2013-04-29 15:54:28 -07:00
2013-04-29 09:30:25 -07:00
2013-02-21 12:05:51 -08:00
2013-04-09 14:09:17 -04:00
2013-01-24 15:37:26 +01:00
2013-01-03 15:57:14 -08:00
2013-02-26 09:34:29 -08:00
2013-04-29 15:54:28 -07:00
2013-01-23 13:44:00 -05:00
2013-02-19 08:43:34 +01:00
2013-03-19 19:15:52 +01:00
2012-12-18 15:02:13 -08:00
2012-12-18 15:02:14 -08:00
2013-02-10 19:41:08 -05:00
2012-12-24 09:36:38 -07:00
2013-02-14 09:21:15 -05:00
2013-03-22 16:19:59 -07:00
2013-01-15 22:43:15 -08:00
2013-03-20 12:10:38 -04:00
2013-03-28 11:10:22 -07:00
2013-04-29 15:54:37 -07:00