git://git.onelab.eu
/
linux-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
fedora core 6 1.2949 + vserver 2.2.0
[linux-2.6.git]
/
fs
/
ioprio.c
diff --git
a/fs/ioprio.c
b/fs/ioprio.c
index
359fa70
..
9dfcf6b
100644
(file)
--- a/
fs/ioprio.c
+++ b/
fs/ioprio.c
@@
-1,7
+1,7
@@
/*
* fs/ioprio.c
*
/*
* fs/ioprio.c
*
- * Copyright (C) 2004 Jens Axboe <axboe@
suse.de
>
+ * Copyright (C) 2004 Jens Axboe <axboe@
kernel.dk
>
*
* Helper functions for setting/querying io priorities of processes. The
* system calls closely mimmick getpriority/setpriority, see the man page for
*
* Helper functions for setting/querying io priorities of processes. The
* system calls closely mimmick getpriority/setpriority, see the man page for
@@
-25,6
+25,7
@@
#include <linux/capability.h>
#include <linux/syscalls.h>
#include <linux/security.h>
#include <linux/capability.h>
#include <linux/syscalls.h>
#include <linux/security.h>
+#include <linux/vs_base.h>
static int set_task_ioprio(struct task_struct *task, int ioprio)
{
static int set_task_ioprio(struct task_struct *task, int ioprio)
{
@@
-47,8
+48,8
@@
static int set_task_ioprio(struct task_struct *task, int ioprio)
/* see wmb() in current_io_context() */
smp_read_barrier_depends();
/* see wmb() in current_io_context() */
smp_read_barrier_depends();
- if (ioc
&& ioc->set_ioprio
)
- ioc->
set_ioprio(ioc, ioprio)
;
+ if (ioc)
+ ioc->
ioprio_changed = 1
;
task_unlock(task);
return 0;
task_unlock(task);
return 0;
@@
-81,7
+82,12
@@
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
}
ret = -ESRCH;
}
ret = -ESRCH;
- read_lock_irq(&tasklist_lock);
+ /*
+ * We want IOPRIO_WHO_PGRP/IOPRIO_WHO_USER to be "atomic",
+ * so we can't use rcu_read_lock(). See re-copy of ->ioprio
+ * in copy_process().
+ */
+ read_lock(&tasklist_lock);
switch (which) {
case IOPRIO_WHO_PROCESS:
if (!who)
switch (which) {
case IOPRIO_WHO_PROCESS:
if (!who)
@@
-95,6
+101,8
@@
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
if (!who)
who = process_group(current);
do_each_task_pid(who, PIDTYPE_PGID, p) {
if (!who)
who = process_group(current);
do_each_task_pid(who, PIDTYPE_PGID, p) {
+ if (!vx_check(p->xid, VS_ADMIN_P | VS_IDENT))
+ continue;
ret = set_task_ioprio(p, ioprio);
if (ret)
break;
ret = set_task_ioprio(p, ioprio);
if (ret)
break;
@@
-124,7
+132,7
@@
free_uid:
ret = -EINVAL;
}
ret = -EINVAL;
}
- read_unlock
_irq
(&tasklist_lock);
+ read_unlock(&tasklist_lock);
return ret;
}
return ret;
}
@@
-145,11
+153,6
@@
int ioprio_best(unsigned short aprio, unsigned short bprio)
unsigned short aclass = IOPRIO_PRIO_CLASS(aprio);
unsigned short bclass = IOPRIO_PRIO_CLASS(bprio);
unsigned short aclass = IOPRIO_PRIO_CLASS(aprio);
unsigned short bclass = IOPRIO_PRIO_CLASS(bprio);
- if (!ioprio_valid(aprio))
- return bprio;
- if (!ioprio_valid(bprio))
- return aprio;
-
if (aclass == IOPRIO_CLASS_NONE)
aclass = IOPRIO_CLASS_BE;
if (bclass == IOPRIO_CLASS_NONE)
if (aclass == IOPRIO_CLASS_NONE)
aclass = IOPRIO_CLASS_BE;
if (bclass == IOPRIO_CLASS_NONE)
@@
-170,7
+173,7
@@
asmlinkage long sys_ioprio_get(int which, int who)
int ret = -ESRCH;
int tmpio;
int ret = -ESRCH;
int tmpio;
- read_lock
_irq
(&tasklist_lock);
+ read_lock(&tasklist_lock);
switch (which) {
case IOPRIO_WHO_PROCESS:
if (!who)
switch (which) {
case IOPRIO_WHO_PROCESS:
if (!who)
@@
-184,6
+187,8
@@
asmlinkage long sys_ioprio_get(int which, int who)
if (!who)
who = process_group(current);
do_each_task_pid(who, PIDTYPE_PGID, p) {
if (!who)
who = process_group(current);
do_each_task_pid(who, PIDTYPE_PGID, p) {
+ if (!vx_check(p->xid, VS_ADMIN_P | VS_IDENT))
+ continue;
tmpio = get_task_ioprio(p);
if (tmpio < 0)
continue;
tmpio = get_task_ioprio(p);
if (tmpio < 0)
continue;
@@
-221,7
+226,7
@@
asmlinkage long sys_ioprio_get(int which, int who)
ret = -EINVAL;
}
ret = -EINVAL;
}
- read_unlock
_irq
(&tasklist_lock);
+ read_unlock(&tasklist_lock);
return ret;
}
return ret;
}