Switch proc/self to nd_set_link()
authorAl Viro <viro@zeniv.linux.org.uk>
Thu, 14 Jan 2010 06:03:28 +0000 (01:03 -0500)
committerAl Viro <viro@zeniv.linux.org.uk>
Fri, 19 Feb 2010 15:25:41 +0000 (10:25 -0500)
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
fs/proc/base.c

index e42bbd843ed13793e93a9af193e8b14136013d31..58324c299165751120e82a6827af278093f414ac 100644 (file)
@@ -2369,16 +2369,30 @@ static void *proc_self_follow_link(struct dentry *dentry, struct nameidata *nd)
 {
        struct pid_namespace *ns = dentry->d_sb->s_fs_info;
        pid_t tgid = task_tgid_nr_ns(current, ns);
-       char tmp[PROC_NUMBUF];
-       if (!tgid)
-               return ERR_PTR(-ENOENT);
-       sprintf(tmp, "%d", task_tgid_nr_ns(current, ns));
-       return ERR_PTR(vfs_follow_link(nd,tmp));
+       char *name = ERR_PTR(-ENOENT);
+       if (tgid) {
+               name = __getname();
+               if (!name)
+                       name = ERR_PTR(-ENOMEM);
+               else
+                       sprintf(name, "%d", tgid);
+       }
+       nd_set_link(nd, name);
+       return NULL;
+}
+
+static void proc_self_put_link(struct dentry *dentry, struct nameidata *nd,
+                               void *cookie)
+{
+       char *s = nd_get_link(nd);
+       if (!IS_ERR(s))
+               __putname(s);
 }
 
 static const struct inode_operations proc_self_inode_operations = {
        .readlink       = proc_self_readlink,
        .follow_link    = proc_self_follow_link,
+       .put_link       = proc_self_put_link,
 };
 
 /*