diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
index 2eb61f3c896b86c769d2b373edf976334fcc1abf..73693b6d4324c4b726188759706b5278c9c4c24e 100644
--- a/fs/proc/task_mmu.c
+++ b/fs/proc/task_mmu.c
@@ -36,8 +36,8 @@ int task_statm(struct mm_struct *mm, int *shared, int *text,
 	       int *data, int *resident)
 {
 	*shared = mm->shared_vm;
-	*text = mm->exec_vm - ((mm->end_code - mm->start_code) >> PAGE_SHIFT);
-	*data = mm->total_vm - mm->shared_vm;
+	*text = (mm->end_code - mm->start_code) >> PAGE_SHIFT;
+	*data = mm->total_vm - mm->shared_vm - *text;
 	*resident = mm->rss;
 	return mm->total_vm;
 }