|
@@ -59,7 +59,6 @@
|
|
|
#include <linux/taskstats_kern.h>
|
|
|
#include <linux/random.h>
|
|
|
#include <linux/tty.h>
|
|
|
-#include <linux/proc_fs.h>
|
|
|
#include <linux/blkdev.h>
|
|
|
#include <linux/fs_struct.h>
|
|
|
#include <linux/magic.h>
|
|
@@ -597,6 +596,57 @@ void mmput(struct mm_struct *mm)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(mmput);
|
|
|
|
|
|
+/*
|
|
|
+ * We added or removed a vma mapping the executable. The vmas are only mapped
|
|
|
+ * during exec and are not mapped with the mmap system call.
|
|
|
+ * Callers must hold down_write() on the mm's mmap_sem for these
|
|
|
+ */
|
|
|
+void added_exe_file_vma(struct mm_struct *mm)
|
|
|
+{
|
|
|
+ mm->num_exe_file_vmas++;
|
|
|
+}
|
|
|
+
|
|
|
+void removed_exe_file_vma(struct mm_struct *mm)
|
|
|
+{
|
|
|
+ mm->num_exe_file_vmas--;
|
|
|
+ if ((mm->num_exe_file_vmas == 0) && mm->exe_file){
|
|
|
+ fput(mm->exe_file);
|
|
|
+ mm->exe_file = NULL;
|
|
|
+ }
|
|
|
+
|
|
|
+}
|
|
|
+
|
|
|
+void set_mm_exe_file(struct mm_struct *mm, struct file *new_exe_file)
|
|
|
+{
|
|
|
+ if (new_exe_file)
|
|
|
+ get_file(new_exe_file);
|
|
|
+ if (mm->exe_file)
|
|
|
+ fput(mm->exe_file);
|
|
|
+ mm->exe_file = new_exe_file;
|
|
|
+ mm->num_exe_file_vmas = 0;
|
|
|
+}
|
|
|
+
|
|
|
+struct file *get_mm_exe_file(struct mm_struct *mm)
|
|
|
+{
|
|
|
+ struct file *exe_file;
|
|
|
+
|
|
|
+ /* We need mmap_sem to protect against races with removal of
|
|
|
+ * VM_EXECUTABLE vmas */
|
|
|
+ down_read(&mm->mmap_sem);
|
|
|
+ exe_file = mm->exe_file;
|
|
|
+ if (exe_file)
|
|
|
+ get_file(exe_file);
|
|
|
+ up_read(&mm->mmap_sem);
|
|
|
+ return exe_file;
|
|
|
+}
|
|
|
+
|
|
|
+static void dup_mm_exe_file(struct mm_struct *oldmm, struct mm_struct *newmm)
|
|
|
+{
|
|
|
+ /* It's safe to write the exe_file pointer without exe_file_lock because
|
|
|
+ * this is called during fork when the task is not yet in /proc */
|
|
|
+ newmm->exe_file = get_mm_exe_file(oldmm);
|
|
|
+}
|
|
|
+
|
|
|
/**
|
|
|
* get_task_mm - acquire a reference to the task's mm
|
|
|
*
|