block: move ioprio.c from fs/ to block/
authorJens Axboe <axboe@fb.com>
Mon, 19 May 2014 17:02:18 +0000 (11:02 -0600)
committerJens Axboe <axboe@fb.com>
Mon, 19 May 2014 17:02:18 +0000 (11:02 -0600)
Like commit f9c78b2b, move this block related file outside
of fs/ and into the core block directory, block/.

Signed-off-by: Jens Axboe <axboe@fb.com>
block/Makefile
block/ioprio.c [new file with mode: 0644]
fs/Makefile
fs/ioprio.c [deleted file]

index 506a0c570be222e0dbde9b0cff1b49dac3cfee53..b4c4d3b99a2dd8ae75cc95c843e0ecec39415514 100644 (file)
@@ -7,7 +7,8 @@ obj-$(CONFIG_BLOCK) := bio.o elevator.o blk-core.o blk-tag.o blk-sysfs.o \
                        blk-exec.o blk-merge.o blk-softirq.o blk-timeout.o \
                        blk-iopoll.o blk-lib.o blk-mq.o blk-mq-tag.o \
                        blk-mq-sysfs.o blk-mq-cpu.o blk-mq-cpumap.o ioctl.o \
-                       genhd.o scsi_ioctl.o partition-generic.o partitions/
+                       genhd.o scsi_ioctl.o partition-generic.o ioprio.o \
+                       partitions/
 
 obj-$(CONFIG_BLK_DEV_BSG)      += bsg.o
 obj-$(CONFIG_BLK_DEV_BSGLIB)   += bsg-lib.o
diff --git a/block/ioprio.c b/block/ioprio.c
new file mode 100644 (file)
index 0000000..e50170c
--- /dev/null
@@ -0,0 +1,241 @@
+/*
+ * fs/ioprio.c
+ *
+ * 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
+ * those. The prio argument is a composite of prio class and prio data, where
+ * the data argument has meaning within that class. The standard scheduling
+ * classes have 8 distinct prio levels, with 0 being the highest prio and 7
+ * being the lowest.
+ *
+ * IOW, setting BE scheduling class with prio 2 is done ala:
+ *
+ * unsigned int prio = (IOPRIO_CLASS_BE << IOPRIO_CLASS_SHIFT) | 2;
+ *
+ * ioprio_set(PRIO_PROCESS, pid, prio);
+ *
+ * See also Documentation/block/ioprio.txt
+ *
+ */
+#include <linux/gfp.h>
+#include <linux/kernel.h>
+#include <linux/export.h>
+#include <linux/ioprio.h>
+#include <linux/blkdev.h>
+#include <linux/capability.h>
+#include <linux/syscalls.h>
+#include <linux/security.h>
+#include <linux/pid_namespace.h>
+
+int set_task_ioprio(struct task_struct *task, int ioprio)
+{
+       int err;
+       struct io_context *ioc;
+       const struct cred *cred = current_cred(), *tcred;
+
+       rcu_read_lock();
+       tcred = __task_cred(task);
+       if (!uid_eq(tcred->uid, cred->euid) &&
+           !uid_eq(tcred->uid, cred->uid) && !capable(CAP_SYS_NICE)) {
+               rcu_read_unlock();
+               return -EPERM;
+       }
+       rcu_read_unlock();
+
+       err = security_task_setioprio(task, ioprio);
+       if (err)
+               return err;
+
+       ioc = get_task_io_context(task, GFP_ATOMIC, NUMA_NO_NODE);
+       if (ioc) {
+               ioc->ioprio = ioprio;
+               put_io_context(ioc);
+       }
+
+       return err;
+}
+EXPORT_SYMBOL_GPL(set_task_ioprio);
+
+SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
+{
+       int class = IOPRIO_PRIO_CLASS(ioprio);
+       int data = IOPRIO_PRIO_DATA(ioprio);
+       struct task_struct *p, *g;
+       struct user_struct *user;
+       struct pid *pgrp;
+       kuid_t uid;
+       int ret;
+
+       switch (class) {
+               case IOPRIO_CLASS_RT:
+                       if (!capable(CAP_SYS_ADMIN))
+                               return -EPERM;
+                       /* fall through, rt has prio field too */
+               case IOPRIO_CLASS_BE:
+                       if (data >= IOPRIO_BE_NR || data < 0)
+                               return -EINVAL;
+
+                       break;
+               case IOPRIO_CLASS_IDLE:
+                       break;
+               case IOPRIO_CLASS_NONE:
+                       if (data)
+                               return -EINVAL;
+                       break;
+               default:
+                       return -EINVAL;
+       }
+
+       ret = -ESRCH;
+       rcu_read_lock();
+       switch (which) {
+               case IOPRIO_WHO_PROCESS:
+                       if (!who)
+                               p = current;
+                       else
+                               p = find_task_by_vpid(who);
+                       if (p)
+                               ret = set_task_ioprio(p, ioprio);
+                       break;
+               case IOPRIO_WHO_PGRP:
+                       if (!who)
+                               pgrp = task_pgrp(current);
+                       else
+                               pgrp = find_vpid(who);
+                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
+                               ret = set_task_ioprio(p, ioprio);
+                               if (ret)
+                                       break;
+                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
+                       break;
+               case IOPRIO_WHO_USER:
+                       uid = make_kuid(current_user_ns(), who);
+                       if (!uid_valid(uid))
+                               break;
+                       if (!who)
+                               user = current_user();
+                       else
+                               user = find_user(uid);
+
+                       if (!user)
+                               break;
+
+                       do_each_thread(g, p) {
+                               if (!uid_eq(task_uid(p), uid))
+                                       continue;
+                               ret = set_task_ioprio(p, ioprio);
+                               if (ret)
+                                       goto free_uid;
+                       } while_each_thread(g, p);
+free_uid:
+                       if (who)
+                               free_uid(user);
+                       break;
+               default:
+                       ret = -EINVAL;
+       }
+
+       rcu_read_unlock();
+       return ret;
+}
+
+static int get_task_ioprio(struct task_struct *p)
+{
+       int ret;
+
+       ret = security_task_getioprio(p);
+       if (ret)
+               goto out;
+       ret = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, IOPRIO_NORM);
+       if (p->io_context)
+               ret = p->io_context->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 (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;
+}
+
+SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
+{
+       struct task_struct *g, *p;
+       struct user_struct *user;
+       struct pid *pgrp;
+       kuid_t uid;
+       int ret = -ESRCH;
+       int tmpio;
+
+       rcu_read_lock();
+       switch (which) {
+               case IOPRIO_WHO_PROCESS:
+                       if (!who)
+                               p = current;
+                       else
+                               p = find_task_by_vpid(who);
+                       if (p)
+                               ret = get_task_ioprio(p);
+                       break;
+               case IOPRIO_WHO_PGRP:
+                       if (!who)
+                               pgrp = task_pgrp(current);
+                       else
+                               pgrp = find_vpid(who);
+                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
+                               tmpio = get_task_ioprio(p);
+                               if (tmpio < 0)
+                                       continue;
+                               if (ret == -ESRCH)
+                                       ret = tmpio;
+                               else
+                                       ret = ioprio_best(ret, tmpio);
+                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
+                       break;
+               case IOPRIO_WHO_USER:
+                       uid = make_kuid(current_user_ns(), who);
+                       if (!who)
+                               user = current_user();
+                       else
+                               user = find_user(uid);
+
+                       if (!user)
+                               break;
+
+                       do_each_thread(g, p) {
+                               if (!uid_eq(task_uid(p), user->uid))
+                                       continue;
+                               tmpio = get_task_ioprio(p);
+                               if (tmpio < 0)
+                                       continue;
+                               if (ret == -ESRCH)
+                                       ret = tmpio;
+                               else
+                                       ret = ioprio_best(ret, tmpio);
+                       } while_each_thread(g, p);
+
+                       if (who)
+                               free_uid(user);
+                       break;
+               default:
+                       ret = -EINVAL;
+       }
+
+       rcu_read_unlock();
+       return ret;
+}
index 1ed9eab5e0a96c547e01f51e18b0b2dfadb18737..4030cbfbc9af8572673eb06c997603ee529443e4 100644 (file)
@@ -14,7 +14,7 @@ obj-y :=      open.o read_write.o file_table.o super.o \
                stack.o fs_struct.o statfs.o
 
 ifeq ($(CONFIG_BLOCK),y)
-obj-y +=       buffer.o block_dev.o direct-io.o mpage.o ioprio.o
+obj-y +=       buffer.o block_dev.o direct-io.o mpage.o
 else
 obj-y +=       no-block.o
 endif
diff --git a/fs/ioprio.c b/fs/ioprio.c
deleted file mode 100644 (file)
index e50170c..0000000
+++ /dev/null
@@ -1,241 +0,0 @@
-/*
- * fs/ioprio.c
- *
- * 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
- * those. The prio argument is a composite of prio class and prio data, where
- * the data argument has meaning within that class. The standard scheduling
- * classes have 8 distinct prio levels, with 0 being the highest prio and 7
- * being the lowest.
- *
- * IOW, setting BE scheduling class with prio 2 is done ala:
- *
- * unsigned int prio = (IOPRIO_CLASS_BE << IOPRIO_CLASS_SHIFT) | 2;
- *
- * ioprio_set(PRIO_PROCESS, pid, prio);
- *
- * See also Documentation/block/ioprio.txt
- *
- */
-#include <linux/gfp.h>
-#include <linux/kernel.h>
-#include <linux/export.h>
-#include <linux/ioprio.h>
-#include <linux/blkdev.h>
-#include <linux/capability.h>
-#include <linux/syscalls.h>
-#include <linux/security.h>
-#include <linux/pid_namespace.h>
-
-int set_task_ioprio(struct task_struct *task, int ioprio)
-{
-       int err;
-       struct io_context *ioc;
-       const struct cred *cred = current_cred(), *tcred;
-
-       rcu_read_lock();
-       tcred = __task_cred(task);
-       if (!uid_eq(tcred->uid, cred->euid) &&
-           !uid_eq(tcred->uid, cred->uid) && !capable(CAP_SYS_NICE)) {
-               rcu_read_unlock();
-               return -EPERM;
-       }
-       rcu_read_unlock();
-
-       err = security_task_setioprio(task, ioprio);
-       if (err)
-               return err;
-
-       ioc = get_task_io_context(task, GFP_ATOMIC, NUMA_NO_NODE);
-       if (ioc) {
-               ioc->ioprio = ioprio;
-               put_io_context(ioc);
-       }
-
-       return err;
-}
-EXPORT_SYMBOL_GPL(set_task_ioprio);
-
-SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio)
-{
-       int class = IOPRIO_PRIO_CLASS(ioprio);
-       int data = IOPRIO_PRIO_DATA(ioprio);
-       struct task_struct *p, *g;
-       struct user_struct *user;
-       struct pid *pgrp;
-       kuid_t uid;
-       int ret;
-
-       switch (class) {
-               case IOPRIO_CLASS_RT:
-                       if (!capable(CAP_SYS_ADMIN))
-                               return -EPERM;
-                       /* fall through, rt has prio field too */
-               case IOPRIO_CLASS_BE:
-                       if (data >= IOPRIO_BE_NR || data < 0)
-                               return -EINVAL;
-
-                       break;
-               case IOPRIO_CLASS_IDLE:
-                       break;
-               case IOPRIO_CLASS_NONE:
-                       if (data)
-                               return -EINVAL;
-                       break;
-               default:
-                       return -EINVAL;
-       }
-
-       ret = -ESRCH;
-       rcu_read_lock();
-       switch (which) {
-               case IOPRIO_WHO_PROCESS:
-                       if (!who)
-                               p = current;
-                       else
-                               p = find_task_by_vpid(who);
-                       if (p)
-                               ret = set_task_ioprio(p, ioprio);
-                       break;
-               case IOPRIO_WHO_PGRP:
-                       if (!who)
-                               pgrp = task_pgrp(current);
-                       else
-                               pgrp = find_vpid(who);
-                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
-                               ret = set_task_ioprio(p, ioprio);
-                               if (ret)
-                                       break;
-                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
-                       break;
-               case IOPRIO_WHO_USER:
-                       uid = make_kuid(current_user_ns(), who);
-                       if (!uid_valid(uid))
-                               break;
-                       if (!who)
-                               user = current_user();
-                       else
-                               user = find_user(uid);
-
-                       if (!user)
-                               break;
-
-                       do_each_thread(g, p) {
-                               if (!uid_eq(task_uid(p), uid))
-                                       continue;
-                               ret = set_task_ioprio(p, ioprio);
-                               if (ret)
-                                       goto free_uid;
-                       } while_each_thread(g, p);
-free_uid:
-                       if (who)
-                               free_uid(user);
-                       break;
-               default:
-                       ret = -EINVAL;
-       }
-
-       rcu_read_unlock();
-       return ret;
-}
-
-static int get_task_ioprio(struct task_struct *p)
-{
-       int ret;
-
-       ret = security_task_getioprio(p);
-       if (ret)
-               goto out;
-       ret = IOPRIO_PRIO_VALUE(IOPRIO_CLASS_NONE, IOPRIO_NORM);
-       if (p->io_context)
-               ret = p->io_context->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 (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;
-}
-
-SYSCALL_DEFINE2(ioprio_get, int, which, int, who)
-{
-       struct task_struct *g, *p;
-       struct user_struct *user;
-       struct pid *pgrp;
-       kuid_t uid;
-       int ret = -ESRCH;
-       int tmpio;
-
-       rcu_read_lock();
-       switch (which) {
-               case IOPRIO_WHO_PROCESS:
-                       if (!who)
-                               p = current;
-                       else
-                               p = find_task_by_vpid(who);
-                       if (p)
-                               ret = get_task_ioprio(p);
-                       break;
-               case IOPRIO_WHO_PGRP:
-                       if (!who)
-                               pgrp = task_pgrp(current);
-                       else
-                               pgrp = find_vpid(who);
-                       do_each_pid_thread(pgrp, PIDTYPE_PGID, p) {
-                               tmpio = get_task_ioprio(p);
-                               if (tmpio < 0)
-                                       continue;
-                               if (ret == -ESRCH)
-                                       ret = tmpio;
-                               else
-                                       ret = ioprio_best(ret, tmpio);
-                       } while_each_pid_thread(pgrp, PIDTYPE_PGID, p);
-                       break;
-               case IOPRIO_WHO_USER:
-                       uid = make_kuid(current_user_ns(), who);
-                       if (!who)
-                               user = current_user();
-                       else
-                               user = find_user(uid);
-
-                       if (!user)
-                               break;
-
-                       do_each_thread(g, p) {
-                               if (!uid_eq(task_uid(p), user->uid))
-                                       continue;
-                               tmpio = get_task_ioprio(p);
-                               if (tmpio < 0)
-                                       continue;
-                               if (ret == -ESRCH)
-                                       ret = tmpio;
-                               else
-                                       ret = ioprio_best(ret, tmpio);
-                       } while_each_thread(g, p);
-
-                       if (who)
-                               free_uid(user);
-                       break;
-               default:
-                       ret = -EINVAL;
-       }
-
-       rcu_read_unlock();
-       return ret;
-}