[PATCH v2 10/11] teach proc_self_get_link()/proc_thread_self_get_link() to work in RCU mode

2015-12-08 Thread Al Viro
From: Al Viro 

Signed-off-by: Al Viro 
---
 fs/proc/self.c| 8 +++-
 fs/proc/thread_self.c | 9 -
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/fs/proc/self.c b/fs/proc/self.c
index 9dd0ae6..7a8b19e 100644
--- a/fs/proc/self.c
+++ b/fs/proc/self.c
@@ -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;
 }
diff --git a/fs/proc/thread_self.c b/fs/proc/thread_self.c
index 50eef6f..03eaa84 100644
--- a/fs/proc/thread_self.c
+++ b/fs/proc/thread_self.c
@@ -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;
 }
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH v2 10/11] teach proc_self_get_link()/proc_thread_self_get_link() to work in RCU mode

2015-12-08 Thread Al Viro
From: Al Viro 

Signed-off-by: Al Viro 
---
 fs/proc/self.c| 8 +++-
 fs/proc/thread_self.c | 9 -
 2 files changed, 7 insertions(+), 10 deletions(-)

diff --git a/fs/proc/self.c b/fs/proc/self.c
index 9dd0ae6..7a8b19e 100644
--- a/fs/proc/self.c
+++ b/fs/proc/self.c
@@ -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;
 }
diff --git a/fs/proc/thread_self.c b/fs/proc/thread_self.c
index 50eef6f..03eaa84 100644
--- a/fs/proc/thread_self.c
+++ b/fs/proc/thread_self.c
@@ -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;
 }
-- 
2.1.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/