diff options
Diffstat (limited to 'kernel/fork.c')
| -rw-r--r-- | kernel/fork.c | 16 | 
1 files changed, 11 insertions, 5 deletions
diff --git a/kernel/fork.c b/kernel/fork.c index e5d9d405ae4e..a5d21c42acfc 100644 --- a/kernel/fork.c +++ b/kernel/fork.c @@ -216,10 +216,9 @@ static unsigned long *alloc_thread_stack_node(struct task_struct *tsk, int node)  		if (!s)  			continue; -#ifdef CONFIG_DEBUG_KMEMLEAK  		/* Clear stale pointers from reused stack. */  		memset(s->addr, 0, THREAD_SIZE); -#endif +  		tsk->stack_vm_area = s;  		return s->addr;  	} @@ -595,6 +594,8 @@ static void check_mm(struct mm_struct *mm)  void __mmdrop(struct mm_struct *mm)  {  	BUG_ON(mm == &init_mm); +	WARN_ON_ONCE(mm == current->mm); +	WARN_ON_ONCE(mm == current->active_mm);  	mm_free_pgd(mm);  	destroy_context(mm);  	hmm_mm_destroy(mm); @@ -1198,8 +1199,8 @@ void mm_release(struct task_struct *tsk, struct mm_struct *mm)  			 * not set up a proper pointer then tough luck.  			 */  			put_user(0, tsk->clear_child_tid); -			sys_futex(tsk->clear_child_tid, FUTEX_WAKE, -					1, NULL, NULL, 0); +			do_futex(tsk->clear_child_tid, FUTEX_WAKE, +					1, NULL, NULL, 0, 0);  		}  		tsk->clear_child_tid = NULL;  	} @@ -2354,7 +2355,7 @@ static int unshare_fd(unsigned long unshare_flags, struct files_struct **new_fdp   * constructed. Here we are modifying the current, active,   * task_struct.   */ -SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags) +int ksys_unshare(unsigned long unshare_flags)  {  	struct fs_struct *fs, *new_fs = NULL;  	struct files_struct *fd, *new_fd = NULL; @@ -2470,6 +2471,11 @@ bad_unshare_out:  	return err;  } +SYSCALL_DEFINE1(unshare, unsigned long, unshare_flags) +{ +	return ksys_unshare(unshare_flags); +} +  /*   *	Helper to unshare the files of the current task.   *	We don't want to expose copy_files internals to  |