{
        struct sysfs_inode_attrs *ps_iattr;
 
+       if (!!sysfs_ns_type(acxt->parent_sd) != !!sd->s_ns) {
+               WARN(1, KERN_WARNING "sysfs: ns %s in '%s' for '%s'\n",
+                       sysfs_ns_type(acxt->parent_sd)? "required": "invalid",
+                       acxt->parent_sd->s_name, sd->s_name);
+               return -EINVAL;
+       }
+
        if (sysfs_find_dirent(acxt->parent_sd, sd->s_ns, sd->s_name))
                return -EEXIST;
 
 {
        struct sysfs_dirent *sd;
 
+       if (!!sysfs_ns_type(parent_sd) != !!ns) {
+               WARN(1, KERN_WARNING "sysfs: ns %s in '%s' for '%s'\n",
+                       sysfs_ns_type(parent_sd)? "required": "invalid",
+                       parent_sd->s_name, name);
+               return NULL;
+       }
+
        for (sd = parent_sd->s_dir.children; sd; sd = sd->s_sibling) {
                if (sd->s_ns != ns)
                        continue;
 
        mutex_lock(&sysfs_mutex);
 
        if (sd && dir)
-               /* Only directories are tagged, so no need to pass
-                * a tag explicitly.
-                */
                sd = sysfs_find_dirent(sd, NULL, dir);
        if (sd && attr)
                sd = sysfs_find_dirent(sd, NULL, attr);