--- x/fs/namei.c +++ y/fs/namei.c @@ -3927,8 +3927,14 @@ int vfs_mkdir(struct user_namespace *mnt if (error) return error; - if (max_links && dir->i_nlink >= max_links) - return -EMLINK; + inode_lock(dir); + if (dir->i_nlink == 0 && !(dir->i_state & I_LINKABLE)) + error = -ENOENT; + else if (max_links && dir->i_nlink >= max_links) + error = -EMLINK; + inode_unlock(dir); + if (error) + return error; error = dir->i_op->mkdir(mnt_userns, dir, dentry, mode); if (!error)