[PATCH 4/4] utrace_set_events: use goto to return -EALREADY
Oleg Nesterov
oleg at redhat.com
Sat Aug 14 02:31:30 UTC 2010
utrace_set_events() is not trivial, and imho it has too much
"unlock + return" cases. Change the code to use goto, this also
lessens the source and compiled code a bit.
---
kernel/utrace.c | 19 +++++++------------
1 file changed, 7 insertions(+), 12 deletions(-)
--- kstub/kernel/utrace.c~4_cleanup_ealready 2010-08-14 04:30:29.000000000 +0200
+++ kstub/kernel/utrace.c 2010-08-14 04:30:29.000000000 +0200
@@ -524,7 +524,7 @@ int utrace_set_events(struct task_struct
{
struct utrace *utrace;
unsigned long old_flags, old_utrace_flags;
- int ret;
+ int ret = -EALREADY;
/*
* We just ignore the internal bit, so callers can use
@@ -542,15 +542,11 @@ int utrace_set_events(struct task_struct
/* If ->death or ->reap is true we must see exit_state != 0. */
if (target->exit_state) {
if (utrace->death) {
- if ((old_flags & ~events) & _UTRACE_DEATH_EVENTS) {
- spin_unlock(&utrace->lock);
- return -EALREADY;
- }
+ if ((old_flags & ~events) & _UTRACE_DEATH_EVENTS)
+ goto unlock;
} else if (utrace->reap) {
- if ((old_flags ^ events) & UTRACE_EVENT(REAP)) {
- spin_unlock(&utrace->lock);
- return -EALREADY;
- }
+ if ((old_flags ^ events) & UTRACE_EVENT(REAP))
+ goto unlock;
}
}
@@ -568,8 +564,7 @@ int utrace_set_events(struct task_struct
read_lock(&tasklist_lock);
if (unlikely(target->exit_state)) {
read_unlock(&tasklist_lock);
- spin_unlock(&utrace->lock);
- return -EALREADY;
+ goto unlock;
}
target->utrace_flags |= events;
read_unlock(&tasklist_lock);
@@ -597,7 +592,7 @@ int utrace_set_events(struct task_struct
if (utrace->reporting == engine)
ret = -EINPROGRESS;
}
-
+unlock:
spin_unlock(&utrace->lock);
return ret;
More information about the utrace-devel
mailing list