git.samba.org
/
sfrench
/
cifs-2.6.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
Merge branch 'upstream-linus' of master.kernel.org:/pub/scm/linux/kernel/git/jgarzik...
[sfrench/cifs-2.6.git]
/
fs
/
ioprio.c
diff --git
a/fs/ioprio.c
b/fs/ioprio.c
index 78b1deae3fa2e1a9aaa4142fa83050b434840b90..10d2c211d18b28414aa8b0f26dcfe489fa0ddfe9 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
@@
-47,8
+47,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;
@@
-60,6
+60,7
@@
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
int data = IOPRIO_PRIO_DATA(ioprio);
struct task_struct *p, *g;
struct user_struct *user;
int data = IOPRIO_PRIO_DATA(ioprio);
struct task_struct *p, *g;
struct user_struct *user;
+ struct pid *pgrp;
int ret;
switch (class) {
int ret;
switch (class) {
@@
-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)
@@
-93,12
+99,14
@@
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
break;
case IOPRIO_WHO_PGRP:
if (!who)
break;
case IOPRIO_WHO_PGRP:
if (!who)
- who = process_group(current);
- do_each_task_pid(who, PIDTYPE_PGID, p) {
+ pgrp = task_pgrp(current);
+ else
+ pgrp = find_pid(who);
+ do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
ret = set_task_ioprio(p, ioprio);
if (ret)
break;
ret = set_task_ioprio(p, ioprio);
if (ret)
break;
- } while_each_
task_pid(who
, PIDTYPE_PGID, p);
+ } while_each_
pid_task(pgrp
, PIDTYPE_PGID, p);
break;
case IOPRIO_WHO_USER:
if (!who)
break;
case IOPRIO_WHO_USER:
if (!who)
@@
-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)
@@
-167,10
+170,11
@@
asmlinkage long sys_ioprio_get(int which, int who)
{
struct task_struct *g, *p;
struct user_struct *user;
{
struct task_struct *g, *p;
struct user_struct *user;
+ struct pid *pgrp;
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)
@@
-182,8
+186,10
@@
asmlinkage long sys_ioprio_get(int which, int who)
break;
case IOPRIO_WHO_PGRP:
if (!who)
break;
case IOPRIO_WHO_PGRP:
if (!who)
- who = process_group(current);
- do_each_task_pid(who, PIDTYPE_PGID, p) {
+ pgrp = task_pgrp(current);
+ else
+ pgrp = find_pid(who);
+ do_each_pid_task(pgrp, PIDTYPE_PGID, p) {
tmpio = get_task_ioprio(p);
if (tmpio < 0)
continue;
tmpio = get_task_ioprio(p);
if (tmpio < 0)
continue;
@@
-191,7
+197,7
@@
asmlinkage long sys_ioprio_get(int which, int who)
ret = tmpio;
else
ret = ioprio_best(ret, tmpio);
ret = tmpio;
else
ret = ioprio_best(ret, tmpio);
- } while_each_
task_pid(who
, PIDTYPE_PGID, p);
+ } while_each_
pid_task(pgrp
, PIDTYPE_PGID, p);
break;
case IOPRIO_WHO_USER:
if (!who)
break;
case IOPRIO_WHO_USER:
if (!who)
@@
-221,7
+227,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;
}