Commit b545069f authored by Prasanna Meda's avatar Prasanna Meda Committed by Linus Torvalds

[PATCH] sys_set/getpriority PRIO_USER semantics fix and optimisation

This change brings the semantics equivalent to 2.4 and also to what the man
page says; Also optimises by avoiding unneeded lookup in uid cache, when
who is same as the current->uid.

sys_set/getpriority is rewritten in 2.5/2.6, perhaps while transitioning to
the pid maps.  It has now semantical bug, when uid is zero.  Note that akpm
also fixed refcount leak and locking in the new functions in changeset
http://linus.bkbits.net:8080/linux-2.5/cset@1.1608.10.84

Signed-off-by: <pmeda@akamai.com>
Acked-by: default avatarIngo Molnar <mingo@elte.hu>
Signed-off-by: default avatarAndrew Morton <akpm@osdl.org>
Signed-off-by: default avatarLinus Torvalds <torvalds@osdl.org>
parent d20a8fb5
......@@ -273,19 +273,18 @@ asmlinkage long sys_setpriority(int which, int who, int niceval)
} while_each_task_pid(who, PIDTYPE_PGID, p);
break;
case PRIO_USER:
user = current->user;
if (!who)
user = current->user;
who = current->uid;
else
user = find_user(who);
if (!user)
goto out_unlock;
if ((who != current->uid) && !(user = find_user(who)))
goto out_unlock; /* No processes for this user */
do_each_thread(g, p)
if (p->uid == who)
error = set_one_prio(p, niceval, error);
while_each_thread(g, p);
if (who)
if (who != current->uid)
free_uid(user); /* For find_user() */
break;
}
......@@ -332,13 +331,12 @@ asmlinkage long sys_getpriority(int which, int who)
} while_each_task_pid(who, PIDTYPE_PGID, p);
break;
case PRIO_USER:
user = current->user;
if (!who)
user = current->user;
who = current->uid;
else
user = find_user(who);
if (!user)
goto out_unlock;
if ((who != current->uid) && !(user = find_user(who)))
goto out_unlock; /* No processes for this user */
do_each_thread(g, p)
if (p->uid == who) {
......@@ -347,7 +345,7 @@ asmlinkage long sys_getpriority(int which, int who)
retval = niceval;
}
while_each_thread(g, p);
if (who)
if (who != current->uid)
free_uid(user); /* for find_user() */
break;
}
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment