unsigned tgid;
        struct pid_namespace *ns;
 
-       tgid = name_to_int(dentry);
+       tgid = name_to_int(&dentry->d_name);
        if (tgid == ~0U)
                goto out;
 
        if (!leader)
                goto out_no_task;
 
-       tid = name_to_int(dentry);
+       tid = name_to_int(&dentry->d_name);
        if (tid == ~0U)
                goto out;
 
 
 {
        struct task_struct *task = get_proc_task(dir);
        int result = -ENOENT;
-       unsigned fd = name_to_int(dentry);
+       unsigned fd = name_to_int(&dentry->d_name);
 
        if (!task)
                goto out_no_task;
 
                                          nlink_t nlink)
 {
        struct proc_dir_entry *ent = NULL;
-       const char *fn = name;
-       unsigned int len;
-
-       /* make sure name is valid */
-       if (!name || !strlen(name))
-               goto out;
+       const char *fn;
+       struct qstr qstr;
 
        if (xlate_proc_name(name, parent, &fn) != 0)
                goto out;
+       qstr.name = fn;
+       qstr.len = strlen(fn);
+       if (qstr.len == 0 || qstr.len >= 256) {
+               WARN(1, "name len %u\n", qstr.len);
+               return NULL;
+       }
+       if (*parent == &proc_root && name_to_int(&qstr) != ~0U) {
+               WARN(1, "create '/proc/%s' by hand\n", qstr.name);
+               return NULL;
+       }
 
-       /* At this point there must not be any '/' characters beyond *fn */
-       if (strchr(fn, '/'))
-               goto out;
-
-       len = strlen(fn);
-
-       ent = kzalloc(sizeof(struct proc_dir_entry) + len + 1, GFP_KERNEL);
+       ent = kzalloc(sizeof(struct proc_dir_entry) + qstr.len + 1, GFP_KERNEL);
        if (!ent)
                goto out;
 
-       memcpy(ent->name, fn, len + 1);
-       ent->namelen = len;
+       memcpy(ent->name, fn, qstr.len + 1);
+       ent->namelen = qstr.len;
        ent->mode = mode;
        ent->nlink = nlink;
        atomic_set(&ent->count, 1);
 
        return 0;
 }
 
-static inline unsigned name_to_int(struct dentry *dentry)
+static inline unsigned name_to_int(const struct qstr *qstr)
 {
-       const char *name = dentry->d_name.name;
-       int len = dentry->d_name.len;
+       const char *name = qstr->name;
+       int len = qstr->len;
        unsigned n = 0;
 
        if (len > 1 && *name == '0')