|
@@ -2280,16 +2280,19 @@ static ssize_t timerslack_ns_write(struct file *file, const char __user *buf,
|
|
if (!p)
|
|
if (!p)
|
|
return -ESRCH;
|
|
return -ESRCH;
|
|
|
|
|
|
- if (ptrace_may_access(p, PTRACE_MODE_ATTACH_FSCREDS)) {
|
|
|
|
- task_lock(p);
|
|
|
|
- if (slack_ns == 0)
|
|
|
|
- p->timer_slack_ns = p->default_timer_slack_ns;
|
|
|
|
- else
|
|
|
|
- p->timer_slack_ns = slack_ns;
|
|
|
|
- task_unlock(p);
|
|
|
|
- } else
|
|
|
|
|
|
+ if (!capable(CAP_SYS_NICE)) {
|
|
count = -EPERM;
|
|
count = -EPERM;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ task_lock(p);
|
|
|
|
+ if (slack_ns == 0)
|
|
|
|
+ p->timer_slack_ns = p->default_timer_slack_ns;
|
|
|
|
+ else
|
|
|
|
+ p->timer_slack_ns = slack_ns;
|
|
|
|
+ task_unlock(p);
|
|
|
|
+
|
|
|
|
+out:
|
|
put_task_struct(p);
|
|
put_task_struct(p);
|
|
|
|
|
|
return count;
|
|
return count;
|
|
@@ -2299,19 +2302,22 @@ static int timerslack_ns_show(struct seq_file *m, void *v)
|
|
{
|
|
{
|
|
struct inode *inode = m->private;
|
|
struct inode *inode = m->private;
|
|
struct task_struct *p;
|
|
struct task_struct *p;
|
|
- int err = 0;
|
|
|
|
|
|
+ int err = 0;
|
|
|
|
|
|
p = get_proc_task(inode);
|
|
p = get_proc_task(inode);
|
|
if (!p)
|
|
if (!p)
|
|
return -ESRCH;
|
|
return -ESRCH;
|
|
|
|
|
|
- if (ptrace_may_access(p, PTRACE_MODE_ATTACH_FSCREDS)) {
|
|
|
|
- task_lock(p);
|
|
|
|
- seq_printf(m, "%llu\n", p->timer_slack_ns);
|
|
|
|
- task_unlock(p);
|
|
|
|
- } else
|
|
|
|
|
|
+ if (!capable(CAP_SYS_NICE)) {
|
|
err = -EPERM;
|
|
err = -EPERM;
|
|
|
|
+ goto out;
|
|
|
|
+ }
|
|
|
|
|
|
|
|
+ task_lock(p);
|
|
|
|
+ seq_printf(m, "%llu\n", p->timer_slack_ns);
|
|
|
|
+ task_unlock(p);
|
|
|
|
+
|
|
|
|
+out:
|
|
put_task_struct(p);
|
|
put_task_struct(p);
|
|
|
|
|
|
return err;
|
|
return err;
|