diff -urN oldtree/block/cfq-iosched.c newtree/block/cfq-iosched.c --- oldtree/block/cfq-iosched.c 2006-09-29 13:50:42.000000000 -0400 +++ newtree/block/cfq-iosched.c 2006-09-29 14:47:42.000000000 -0400 @@ -1359,10 +1359,10 @@ printk(KERN_ERR "cfq: bad prio %x\n", ioprio_class); case IOPRIO_CLASS_NONE: /* - * no prio set, place us in the middle of the BE classes + * Select class and ioprio according to policy and nice */ + cfqq->ioprio_class = task_policy_ioprio_class(tsk); cfqq->ioprio = task_nice_ioprio(tsk); - cfqq->ioprio_class = IOPRIO_CLASS_BE; break; case IOPRIO_CLASS_RT: cfqq->ioprio = task_ioprio(tsk); diff -urN oldtree/include/linux/ioprio.h newtree/include/linux/ioprio.h --- oldtree/include/linux/ioprio.h 2006-09-29 13:50:42.000000000 -0400 +++ newtree/include/linux/ioprio.h 2006-09-29 14:47:42.000000000 -0400 @@ -22,7 +22,7 @@ * class, the default for any process. IDLE is the idle scheduling class, it * is only served when no one else is using the disk. */ -enum { +enum ioprio_class { IOPRIO_CLASS_NONE, IOPRIO_CLASS_RT, IOPRIO_CLASS_BE, @@ -51,8 +51,19 @@ return IOPRIO_PRIO_DATA(task->ioprio); } +static inline enum ioprio_class + task_policy_ioprio_class(struct task_struct *task) +{ + if (rt_task(task)) + return IOPRIO_CLASS_RT; + return IOPRIO_CLASS_BE; +} + static inline int task_nice_ioprio(struct task_struct *task) { + if (rt_task(task)) + return (MAX_RT_PRIO - task->rt_priority) * IOPRIO_BE_NR / + (MAX_RT_PRIO + 1); return (task_nice(task) + 20) / 5; }