git.openpandora.org
/
pandora-kernel.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
[XFS] Fix regression introduced by remount fixup
[pandora-kernel.git]
/
fs
/
ioprio.c
diff --git
a/fs/ioprio.c
b/fs/ioprio.c
index
d6ff77e
..
da3cc46
100644
(file)
--- a/
fs/ioprio.c
+++ b/
fs/ioprio.c
@@
-41,18
+41,28
@@
static int set_task_ioprio(struct task_struct *task, int ioprio)
return err;
task_lock(task);
return err;
task_lock(task);
+ do {
+ ioc = task->io_context;
+ /* see wmb() in current_io_context() */
+ smp_read_barrier_depends();
+ if (ioc)
+ break;
- task->ioprio = ioprio;
-
- ioc = task->io_context;
- /* see wmb() in current_io_context() */
- smp_read_barrier_depends();
+ ioc = alloc_io_context(GFP_ATOMIC, -1);
+ if (!ioc) {
+ err = -ENOMEM;
+ break;
+ }
+ task->io_context = ioc;
+ } while (1);
- if (ioc)
+ if (!err) {
+ ioc->ioprio = ioprio;
ioc->ioprio_changed = 1;
ioc->ioprio_changed = 1;
+ }
task_unlock(task);
task_unlock(task);
- return
0
;
+ return
err
;
}
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
}
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
@@
-75,8
+85,10
@@
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
break;
case IOPRIO_CLASS_IDLE:
break;
case IOPRIO_CLASS_IDLE:
- if (!capable(CAP_SYS_ADMIN))
- return -EPERM;
+ break;
+ case IOPRIO_CLASS_NONE:
+ if (data)
+ return -EINVAL;
break;
default:
return -EINVAL;
break;
default:
return -EINVAL;
@@
-103,11
+115,11
@@
asmlinkage long sys_ioprio_set(int which, int who, int ioprio)
pgrp = task_pgrp(current);
else
pgrp = find_vpid(who);
pgrp = task_pgrp(current);
else
pgrp = find_vpid(who);
- do_each_pid_t
ask
(pgrp, PIDTYPE_PGID, p) {
+ do_each_pid_t
hread
(pgrp, PIDTYPE_PGID, p) {
ret = set_task_ioprio(p, ioprio);
if (ret)
break;
ret = set_task_ioprio(p, ioprio);
if (ret)
break;
- } while_each_pid_t
ask
(pgrp, PIDTYPE_PGID, p);
+ } while_each_pid_t
hread
(pgrp, PIDTYPE_PGID, p);
break;
case IOPRIO_WHO_USER:
if (!who)
break;
case IOPRIO_WHO_USER:
if (!who)
@@
-144,7
+156,9
@@
static int get_task_ioprio(struct task_struct *p)
ret = security_task_getioprio(p);
if (ret)
goto out;
ret = security_task_getioprio(p);
if (ret)
goto out;
- ret = p->ioprio;
+ ret = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, IOPRIO_NORM);
+ if (p->io_context)
+ ret = p->io_context->ioprio;
out:
return ret;
}
out:
return ret;
}
@@
-190,7
+204,7
@@
asmlinkage long sys_ioprio_get(int which, int who)
pgrp = task_pgrp(current);
else
pgrp = find_vpid(who);
pgrp = task_pgrp(current);
else
pgrp = find_vpid(who);
- do_each_pid_t
ask
(pgrp, PIDTYPE_PGID, p) {
+ do_each_pid_t
hread
(pgrp, PIDTYPE_PGID, p) {
tmpio = get_task_ioprio(p);
if (tmpio < 0)
continue;
tmpio = get_task_ioprio(p);
if (tmpio < 0)
continue;
@@
-198,7
+212,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_pid_t
ask
(pgrp, PIDTYPE_PGID, p);
+ } while_each_pid_t
hread
(pgrp, PIDTYPE_PGID, p);
break;
case IOPRIO_WHO_USER:
if (!who)
break;
case IOPRIO_WHO_USER:
if (!who)