diff options
Diffstat (limited to 'fs/proc/base.c')
-rw-r--r-- | fs/proc/base.c | 16 |
1 files changed, 13 insertions, 3 deletions
diff --git a/fs/proc/base.c b/fs/proc/base.c index c9e3f650f23c..08e3eccf9a12 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c | |||
@@ -2706,9 +2706,16 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) | |||
2706 | { | 2706 | { |
2707 | struct task_io_accounting acct = task->ioac; | 2707 | struct task_io_accounting acct = task->ioac; |
2708 | unsigned long flags; | 2708 | unsigned long flags; |
2709 | int result; | ||
2709 | 2710 | ||
2710 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) | 2711 | result = mutex_lock_killable(&task->signal->cred_guard_mutex); |
2711 | return -EACCES; | 2712 | if (result) |
2713 | return result; | ||
2714 | |||
2715 | if (!ptrace_may_access(task, PTRACE_MODE_READ)) { | ||
2716 | result = -EACCES; | ||
2717 | goto out_unlock; | ||
2718 | } | ||
2712 | 2719 | ||
2713 | if (whole && lock_task_sighand(task, &flags)) { | 2720 | if (whole && lock_task_sighand(task, &flags)) { |
2714 | struct task_struct *t = task; | 2721 | struct task_struct *t = task; |
@@ -2719,7 +2726,7 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) | |||
2719 | 2726 | ||
2720 | unlock_task_sighand(task, &flags); | 2727 | unlock_task_sighand(task, &flags); |
2721 | } | 2728 | } |
2722 | return sprintf(buffer, | 2729 | result = sprintf(buffer, |
2723 | "rchar: %llu\n" | 2730 | "rchar: %llu\n" |
2724 | "wchar: %llu\n" | 2731 | "wchar: %llu\n" |
2725 | "syscr: %llu\n" | 2732 | "syscr: %llu\n" |
@@ -2734,6 +2741,9 @@ static int do_io_accounting(struct task_struct *task, char *buffer, int whole) | |||
2734 | (unsigned long long)acct.read_bytes, | 2741 | (unsigned long long)acct.read_bytes, |
2735 | (unsigned long long)acct.write_bytes, | 2742 | (unsigned long long)acct.write_bytes, |
2736 | (unsigned long long)acct.cancelled_write_bytes); | 2743 | (unsigned long long)acct.cancelled_write_bytes); |
2744 | out_unlock: | ||
2745 | mutex_unlock(&task->signal->cred_guard_mutex); | ||
2746 | return result; | ||
2737 | } | 2747 | } |
2738 | 2748 | ||
2739 | static int proc_tid_io_accounting(struct task_struct *task, char *buffer) | 2749 | static int proc_tid_io_accounting(struct task_struct *task, char *buffer) |