[PATCH] sys_set/getpriority PRIO_USER semantics fix and optimisation

From: pmeda
Date: Wed Dec 01 2004 - 17:19:54 EST




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@xxxxxxxxxxxx

sys.c | 26 ++++++++++++--------------
1 files changed, 12 insertions, 14 deletions


Signed-off-by: pmeda@xxxxxxxxxx


--- linux-2.6.9-1/kernel/sys.c Wed Dec 1 20:46:50 2004
+++ linux-2.6.9-2/kernel/sys.c Wed Dec 1 21:47:36 2004
@@ -341,19 +341,18 @@
} while_each_task_pid(who, PIDTYPE_PGID, p);
break;
case PRIO_USER:
- if (!who)
- user = current->user;
- else
- user = find_user(who);
-
- if (!user)
- goto out_unlock;
+ user = current->user;
+ if (!who)
+ who = current->uid;
+ else
+ 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;
}
@@ -400,13 +399,12 @@
} 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) {
@@ -415,7 +413,7 @@
retval = niceval;
}
while_each_thread(g, p);
- if (who)
+ if (who != current->uid)
free_uid(user); /* for find_user() */
break;
}
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/