Message ID | 20180521160147.2372-2-adam.manzanares@wdc.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
adam.manzanares@wdc.com writes: > From: Adam Manzanares <adam.manzanares@wdc.com> > > Aio per command iopriority support introduces a second interface between > userland and the kernel capable of passing iopriority. The aio interface also > needs the ability to verify that the submitting context has sufficient > priviledges to submit IOPRIO_RT commands. This patch creates the > ioprio_check_cap function to be used by the ioprio_set system call and also by > the aio interface. > > Signed-off-by: Adam Manzanares <adam.manzanares@wdc.com> > Reviewed-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Jeff Moyer <jmoyer@redhat.com> > --- > block/ioprio.c | 22 ++++++++++++++++------ > include/linux/ioprio.h | 2 ++ > 2 files changed, 18 insertions(+), 6 deletions(-) > > diff --git a/block/ioprio.c b/block/ioprio.c > index 6f5d0b6625e3..f9821080c92c 100644 > --- a/block/ioprio.c > +++ b/block/ioprio.c > @@ -61,15 +61,10 @@ int set_task_ioprio(struct task_struct *task, int ioprio) > } > EXPORT_SYMBOL_GPL(set_task_ioprio); > > -SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) > +int ioprio_check_cap(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: > @@ -92,6 +87,21 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) > return -EINVAL; > } > > + return 0; > +} > + > +SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) > +{ > + struct task_struct *p, *g; > + struct user_struct *user; > + struct pid *pgrp; > + kuid_t uid; > + int ret; > + > + ret = ioprio_check_cap(ioprio); > + if (ret) > + return ret; > + > ret = -ESRCH; > rcu_read_lock(); > switch (which) { > diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h > index 627efac73e6d..4a28cec49ec3 100644 > --- a/include/linux/ioprio.h > +++ b/include/linux/ioprio.h > @@ -77,4 +77,6 @@ extern int ioprio_best(unsigned short aprio, unsigned short bprio); > > extern int set_task_ioprio(struct task_struct *task, int ioprio); > > +extern int ioprio_check_cap(int ioprio); > + > #endif
diff --git a/block/ioprio.c b/block/ioprio.c index 6f5d0b6625e3..f9821080c92c 100644 --- a/block/ioprio.c +++ b/block/ioprio.c @@ -61,15 +61,10 @@ int set_task_ioprio(struct task_struct *task, int ioprio) } EXPORT_SYMBOL_GPL(set_task_ioprio); -SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) +int ioprio_check_cap(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: @@ -92,6 +87,21 @@ SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) return -EINVAL; } + return 0; +} + +SYSCALL_DEFINE3(ioprio_set, int, which, int, who, int, ioprio) +{ + struct task_struct *p, *g; + struct user_struct *user; + struct pid *pgrp; + kuid_t uid; + int ret; + + ret = ioprio_check_cap(ioprio); + if (ret) + return ret; + ret = -ESRCH; rcu_read_lock(); switch (which) { diff --git a/include/linux/ioprio.h b/include/linux/ioprio.h index 627efac73e6d..4a28cec49ec3 100644 --- a/include/linux/ioprio.h +++ b/include/linux/ioprio.h @@ -77,4 +77,6 @@ extern int ioprio_best(unsigned short aprio, unsigned short bprio); extern int set_task_ioprio(struct task_struct *task, int ioprio); +extern int ioprio_check_cap(int ioprio); + #endif