teach proc_self_get_link()/proc_thread_self_get_link() to work in RCU mode
authorAl Viro <viro@zeniv.linux.org.uk>
Tue, 17 Nov 2015 15:58:42 +0000 (10:58 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Wed, 9 Dec 2015 03:41:55 +0000 (22:41 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/proc/self.c
fs/proc/thread_self.c

index 9dd0ae6..7a8b19e 100644 (file)
@@ -25,14 +25,12 @@ static const char *proc_self_get_link(struct dentry *dentry,
        pid_t tgid = task_tgid_nr_ns(current, ns);
        char *name;
 
-       if (!dentry)
-               return ERR_PTR(-ECHILD);
        if (!tgid)
                return ERR_PTR(-ENOENT);
        /* 11 for max length of signed int in decimal + NULL term */
-       name = kmalloc(12, GFP_KERNEL);
-       if (!name)
-               return ERR_PTR(-ENOMEM);
+       name = kmalloc(12, dentry ? GFP_KERNEL : GFP_ATOMIC);
+       if (unlikely(!name))
+               return dentry ? ERR_PTR(-ENOMEM) : ERR_PTR(-ECHILD);
        sprintf(name, "%d", tgid);
        return *cookie = name;
 }
index 50eef6f..03eaa84 100644 (file)
@@ -27,13 +27,12 @@ static const char *proc_thread_self_get_link(struct dentry *dentry,
        pid_t pid = task_pid_nr_ns(current, ns);
        char *name;
 
-       if (!dentry)
-               return ERR_PTR(-ECHILD);
        if (!pid)
                return ERR_PTR(-ENOENT);
-       name = kmalloc(PROC_NUMBUF + 6 + PROC_NUMBUF, GFP_KERNEL);
-       if (!name)
-               return ERR_PTR(-ENOMEM);
+       name = kmalloc(PROC_NUMBUF + 6 + PROC_NUMBUF,
+                               dentry ? GFP_KERNEL : GFP_ATOMIC);
+       if (unlikely(!name))
+               return dentry ? ERR_PTR(-ENOMEM) : ERR_PTR(-ECHILD);
        sprintf(name, "%d/task/%d", tgid, pid);
        return *cookie = name;
 }