|
@@ -745,7 +745,8 @@ static void mm_init_owner(struct mm_struct *mm, struct task_struct *p)
|
|
|
#endif
|
|
|
}
|
|
|
|
|
|
-static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p)
|
|
|
+static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p,
|
|
|
+ struct user_namespace *user_ns)
|
|
|
{
|
|
|
mm->mmap = NULL;
|
|
|
mm->mm_rb = RB_ROOT;
|
|
@@ -785,6 +786,7 @@ static struct mm_struct *mm_init(struct mm_struct *mm, struct task_struct *p)
|
|
|
if (init_new_context(p, mm))
|
|
|
goto fail_nocontext;
|
|
|
|
|
|
+ mm->user_ns = get_user_ns(user_ns);
|
|
|
return mm;
|
|
|
|
|
|
fail_nocontext:
|
|
@@ -830,7 +832,7 @@ struct mm_struct *mm_alloc(void)
|
|
|
return NULL;
|
|
|
|
|
|
memset(mm, 0, sizeof(*mm));
|
|
|
- return mm_init(mm, current);
|
|
|
+ return mm_init(mm, current, current_user_ns());
|
|
|
}
|
|
|
|
|
|
/*
|
|
@@ -845,6 +847,7 @@ void __mmdrop(struct mm_struct *mm)
|
|
|
destroy_context(mm);
|
|
|
mmu_notifier_mm_destroy(mm);
|
|
|
check_mm(mm);
|
|
|
+ put_user_ns(mm->user_ns);
|
|
|
free_mm(mm);
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(__mmdrop);
|
|
@@ -1126,7 +1129,7 @@ static struct mm_struct *dup_mm(struct task_struct *tsk)
|
|
|
|
|
|
memcpy(mm, oldmm, sizeof(*mm));
|
|
|
|
|
|
- if (!mm_init(mm, tsk))
|
|
|
+ if (!mm_init(mm, tsk, mm->user_ns))
|
|
|
goto fail_nomem;
|
|
|
|
|
|
err = dup_mmap(mm, oldmm);
|