[PATCH 50] ptrace_request: use ptrace_lookup_engine()

Oleg Nesterov oleg at redhat.com
Thu Sep 17 19:08:28 UTC 2009


Change ptrace_request() to find utrace_engine and pass it to callees.

---

 kernel/ptrace.c |   63 +++++++++++++++++++++++---------------------------------
 1 file changed, 26 insertions(+), 37 deletions(-)

--- PU/kernel/ptrace.c~50_PTRACE_REQUEST_LOOKUP_ENGINE	2009-09-17 20:46:55.000000000 +0200
+++ PU/kernel/ptrace.c	2009-09-17 21:03:11.000000000 +0200
@@ -806,27 +806,20 @@ int ptrace_writedata(struct task_struct 
 	return copied;
 }
 
-static int ptrace_set_options(struct task_struct *child, long data)
+static int ptrace_set_options(struct utrace_engine *engine,
+				struct task_struct *child, long data)
 {
-	struct utrace_engine *engine = ptrace_lookup_engine(child);
-
-	if (likely(!IS_ERR(engine))) {
-		__ptrace_set_options(child, engine, data & PTRACE_O_MASK);
-		utrace_engine_put(engine);
-	}
+	__ptrace_set_options(child, engine, data & PTRACE_O_MASK);
 
 	return (data & ~PTRACE_O_MASK) ? -EINVAL : 0;
 }
 
-static int ptrace_getsiginfo(struct task_struct *child, siginfo_t *info)
+static int ptrace_getsiginfo(struct utrace_engine *engine,
+				struct task_struct *child, siginfo_t *info)
 {
-	struct utrace_engine *engine = ptrace_lookup_engine(child);
 	unsigned long flags;
 	int error = -ESRCH;
 
-	if (IS_ERR(engine))
-		return error;
-
 	if (lock_task_sighand(child, &flags)) {
 		error = -EINVAL;
 		if (likely(ptrace_context(engine)->siginfo != NULL)) {
@@ -836,19 +829,15 @@ static int ptrace_getsiginfo(struct task
 		unlock_task_sighand(child, &flags);
 	}
 
-	utrace_engine_put(engine);
 	return error;
 }
 
-static int ptrace_setsiginfo(struct task_struct *child, const siginfo_t *info)
+static int ptrace_setsiginfo(struct utrace_engine *engine,
+				struct task_struct *child, const siginfo_t *info)
 {
-	struct utrace_engine *engine = ptrace_lookup_engine(child);
 	unsigned long flags;
 	int error = -ESRCH;
 
-	if (IS_ERR(engine))
-		return error;
-
 	if (lock_task_sighand(child, &flags)) {
 		error = -EINVAL;
 		if (likely(ptrace_context(engine)->siginfo != NULL)) {
@@ -858,7 +847,6 @@ static int ptrace_setsiginfo(struct task
 		unlock_task_sighand(child, &flags);
 	}
 
-	utrace_engine_put(engine);
 	return error;
 }
 
@@ -965,10 +953,9 @@ static void do_ptrace_resume(struct utra
 	ptrace_wake_up(engine, tracee, UTRACE_RESUME);
 }
 
-static int ptrace_resume(struct task_struct *child, long request, long data)
+static int ptrace_resume(struct utrace_engine *engine,
+			struct task_struct *child, long request, long data)
 {
-	struct utrace_engine *engine;
-	struct ptrace_context *context;
 	enum utrace_resume_action action;
 	enum utrace_syscall_action syscall;
 	int ret = 0;
@@ -976,12 +963,6 @@ static int ptrace_resume(struct task_str
 	if (!valid_signal(data))
 		return -EIO;
 
-	engine = ptrace_lookup_engine(child);
-	if (IS_ERR(engine))
-		return -ESRCH;
-
-	context = ptrace_context(engine);
-
 	syscall = UTRACE_SYSCALL_RUN;
 #ifdef PTRACE_SYSEMU
 	if (request == PTRACE_SYSEMU || request == PTRACE_SYSEMU_SINGLESTEP)
@@ -1013,17 +994,19 @@ static int ptrace_resume(struct task_str
 	if (!ret)
 		do_ptrace_resume(engine, child, request, data);
 
-	utrace_engine_put(engine);
-
 	return ret;
 }
 
 int ptrace_request(struct task_struct *child, long request,
 		   long addr, long data)
 {
+	struct utrace_engine *engine = ptrace_lookup_engine(child);
 	siginfo_t siginfo;
 	int ret;
 
+	if (unlikely(IS_ERR(engine)))
+		return -ESRCH;
+
 	switch (request) {
 	case PTRACE_PEEKTEXT:
 	case PTRACE_PEEKDATA:
@@ -1038,14 +1021,14 @@ int ptrace_request(struct task_struct *c
 	case PTRACE_OLDSETOPTIONS:
 #endif
 	case PTRACE_SETOPTIONS:
-		ret = ptrace_set_options(child, data);
+		ret = ptrace_set_options(engine, child, data);
 		break;
 	case PTRACE_GETEVENTMSG:
 		ret = put_user(child->ptrace_message, (unsigned long __user *) data);
 		break;
 
 	case PTRACE_GETSIGINFO:
-		ret = ptrace_getsiginfo(child, &siginfo);
+		ret = ptrace_getsiginfo(engine, child, &siginfo);
 		if (!ret)
 			ret = copy_siginfo_to_user((siginfo_t __user *) data,
 						   &siginfo);
@@ -1056,7 +1039,7 @@ int ptrace_request(struct task_struct *c
 				   sizeof siginfo))
 			ret = -EFAULT;
 		else
-			ret = ptrace_setsiginfo(child, &siginfo);
+			ret = ptrace_setsiginfo(engine, child, &siginfo);
 		break;
 
 	case PTRACE_DETACH:	 /* detach a process that was attached. */
@@ -1075,13 +1058,13 @@ int ptrace_request(struct task_struct *c
 #endif
 	case PTRACE_SYSCALL:
 	case PTRACE_CONT:
-		ret = ptrace_resume(child, request, data);
+		ret = ptrace_resume(engine, child, request, data);
 		break;
 
 	case PTRACE_KILL:
 		ret = 0;
 		if (!child->exit_state)	/* already dead */
-			ret = ptrace_resume(child, request, SIGKILL);
+			ret = ptrace_resume(engine, child, request, SIGKILL);
 		break;
 
 	default:
@@ -1089,6 +1072,7 @@ int ptrace_request(struct task_struct *c
 		break;
 	}
 
+	utrace_engine_put(engine);
 	return ret;
 }
 
@@ -1182,11 +1166,15 @@ int generic_ptrace_pokedata(struct task_
 int compat_ptrace_request(struct task_struct *child, compat_long_t request,
 			  compat_ulong_t addr, compat_ulong_t data)
 {
+	struct utrace_engine *engine = ptrace_lookup_engine(child);
 	compat_ulong_t __user *datap = compat_ptr(data);
 	compat_ulong_t word;
 	siginfo_t siginfo;
 	int ret;
 
+	if (unlikely(IS_ERR(engine)))
+		return -ESRCH;
+
 	switch (request) {
 	case PTRACE_PEEKTEXT:
 	case PTRACE_PEEKDATA:
@@ -1208,7 +1196,7 @@ int compat_ptrace_request(struct task_st
 		break;
 
 	case PTRACE_GETSIGINFO:
-		ret = ptrace_getsiginfo(child, &siginfo);
+		ret = ptrace_getsiginfo(engine, child, &siginfo);
 		if (!ret)
 			ret = copy_siginfo_to_user32(
 				(struct compat_siginfo __user *) datap,
@@ -1221,13 +1209,14 @@ int compat_ptrace_request(struct task_st
 			    &siginfo, (struct compat_siginfo __user *) datap))
 			ret = -EFAULT;
 		else
-			ret = ptrace_setsiginfo(child, &siginfo);
+			ret = ptrace_setsiginfo(engine, child, &siginfo);
 		break;
 
 	default:
 		ret = ptrace_request(child, request, addr, data);
 	}
 
+	utrace_engine_put(engine);
 	return ret;
 }
 




More information about the utrace-devel mailing list