X-Git-Url: http://git.onelab.eu/?a=blobdiff_plain;f=fs%2Fioprio.c;fp=fs%2Fioprio.c;h=66240ed9b6e4afdb9160006bba21e38457514557;hb=64ba3f394c830ec48a1c31b53dcae312c56f1604;hp=359fa701114aa050e9d31c891d575bdac4305f04;hpb=be1e6109ac94a859551f8e1774eb9a8469fe055c;p=linux-2.6.git diff --git a/fs/ioprio.c b/fs/ioprio.c index 359fa7011..66240ed9b 100644 --- a/fs/ioprio.c +++ b/fs/ioprio.c @@ -24,29 +24,21 @@ #include #include #include -#include +#include static int set_task_ioprio(struct task_struct *task, int ioprio) { - int err; struct io_context *ioc; if (task->uid != current->euid && task->uid != current->uid && !capable(CAP_SYS_NICE)) return -EPERM; - err = security_task_setioprio(task, ioprio); - if (err) - return err; - task_lock(task); task->ioprio = ioprio; ioc = task->io_context; - /* see wmb() in current_io_context() */ - smp_read_barrier_depends(); - if (ioc && ioc->set_ioprio) ioc->set_ioprio(ioc, ioprio); @@ -114,9 +106,9 @@ asmlinkage long sys_ioprio_set(int which, int who, int ioprio) continue; ret = set_task_ioprio(p, ioprio); if (ret) - goto free_uid; + break; } while_each_thread(g, p); -free_uid: + if (who) free_uid(user); break; @@ -128,47 +120,11 @@ free_uid: return ret; } -static int get_task_ioprio(struct task_struct *p) -{ - int ret; - - ret = security_task_getioprio(p); - if (ret) - goto out; - ret = p->ioprio; -out: - return ret; -} - -int ioprio_best(unsigned short aprio, unsigned short 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) - bclass = IOPRIO_CLASS_BE; - - if (aclass == bclass) - return min(aprio, bprio); - if (aclass > bclass) - return bprio; - else - return aprio; -} - asmlinkage long sys_ioprio_get(int which, int who) { struct task_struct *g, *p; struct user_struct *user; int ret = -ESRCH; - int tmpio; read_lock_irq(&tasklist_lock); switch (which) { @@ -178,19 +134,16 @@ asmlinkage long sys_ioprio_get(int which, int who) else p = find_task_by_pid(who); if (p) - ret = get_task_ioprio(p); + ret = p->ioprio; break; case IOPRIO_WHO_PGRP: if (!who) who = process_group(current); do_each_task_pid(who, PIDTYPE_PGID, p) { - tmpio = get_task_ioprio(p); - if (tmpio < 0) - continue; if (ret == -ESRCH) - ret = tmpio; + ret = p->ioprio; else - ret = ioprio_best(ret, tmpio); + ret = ioprio_best(ret, p->ioprio); } while_each_task_pid(who, PIDTYPE_PGID, p); break; case IOPRIO_WHO_USER: @@ -205,13 +158,10 @@ asmlinkage long sys_ioprio_get(int which, int who) do_each_thread(g, p) { if (p->uid != user->uid) continue; - tmpio = get_task_ioprio(p); - if (tmpio < 0) - continue; if (ret == -ESRCH) - ret = tmpio; + ret = p->ioprio; else - ret = ioprio_best(ret, tmpio); + ret = ioprio_best(ret, p->ioprio); } while_each_thread(g, p); if (who)