Since setid will create a autogroup for that process, there is no
way to detach a process from that autogroup, this patch add a new interface
to detach a process from its autogroup. You can write anything to
/proc/<pid>/autogroup_detach to do that.

Signed-off-by: Weiping Zhang <zhangweip...@didiglobal.com>
---
 fs/proc/base.c | 50 ++++++++++++++++++++++++++++++++++++++++++++++++++
 1 file changed, 50 insertions(+)

diff --git a/fs/proc/base.c b/fs/proc/base.c
index d86c0afc8a85..a210cab8b52d 100644
--- a/fs/proc/base.c
+++ b/fs/proc/base.c
@@ -1541,6 +1541,55 @@ static const struct file_operations 
proc_pid_sched_autogroup_operations = {
        .release        = single_release,
 };
 
+static int sched_autogroup_detach_show(struct seq_file *m, void *v)
+{
+       struct inode *inode = m->private;
+
+       seq_printf(m, "write any data to detach this task from a autogroup\n");
+
+       return 0;
+}
+
+static int sched_autogroup_detach_open(struct inode *inode, struct file *filp)
+{
+       int ret;
+
+       ret = single_open(filp, sched_autogroup_detach_show, NULL);
+       if (!ret) {
+               struct seq_file *m = filp->private_data;
+
+               m->private = inode;
+       }
+       return ret;
+}
+
+static ssize_t
+sched_autogroup_detach_write(struct file *file, const char __user *buf,
+           size_t count, loff_t *offset)
+{
+       struct inode *inode = file_inode(file);
+       struct task_struct *p;
+       int ret;
+
+       p = get_proc_task(inode);
+       if (!p)
+               return -ESRCH;
+
+       sched_autogroup_detach(p);
+
+       put_task_struct(p);
+
+       return count;
+}
+
+static const struct file_operations proc_pid_sched_autogroup_detach_operations 
= {
+       .open           = sched_autogroup_detach_open,
+       .read           = seq_read,
+       .write          = sched_autogroup_detach_write,
+       .llseek         = seq_lseek,
+       .release        = single_release,
+};
+
 #endif /* CONFIG_SCHED_AUTOGROUP */
 
 #ifdef CONFIG_TIME_NS
@@ -3161,6 +3210,7 @@ static const struct pid_entry tgid_base_stuff[] = {
 #endif
 #ifdef CONFIG_SCHED_AUTOGROUP
        REG("autogroup",  S_IRUGO|S_IWUSR, proc_pid_sched_autogroup_operations),
+       REG("autogroup_detach",  S_IRUGO|S_IWUSR, 
proc_pid_sched_autogroup_detach_operations),
 #endif
 #ifdef CONFIG_TIME_NS
        REG("timens_offsets",  S_IRUGO|S_IWUSR, proc_timens_offsets_operations),
-- 
2.14.1

Reply via email to