return getname_flags(filename, 0, NULL);
 }
 
-/*
- * The "getname_kernel()" interface doesn't do pathnames longer
- * than EMBEDDED_NAME_MAX. Deal with it - you're a kernel user.
- */
 struct filename *
 getname_kernel(const char * filename)
 {
        struct filename *result;
-       char *kname;
-       int len;
-
-       len = strlen(filename);
-       if (len >= EMBEDDED_NAME_MAX)
-               return ERR_PTR(-ENAMETOOLONG);
+       int len = strlen(filename) + 1;
 
        result = __getname();
        if (unlikely(!result))
                return ERR_PTR(-ENOMEM);
 
-       kname = (char *)result + sizeof(*result);
-       result->name = kname;
+       if (len <= EMBEDDED_NAME_MAX) {
+               result->name = (char *)(result) + sizeof(*result);
+               result->separate = false;
+       } else if (len <= PATH_MAX) {
+               struct filename *tmp;
+
+               tmp = kmalloc(sizeof(*tmp), GFP_KERNEL);
+               if (unlikely(!tmp)) {
+                       __putname(result);
+                       return ERR_PTR(-ENOMEM);
+               }
+               tmp->name = (char *)result;
+               tmp->separate = true;
+               result = tmp;
+       } else {
+               __putname(result);
+               return ERR_PTR(-ENAMETOOLONG);
+       }
+       memcpy((char *)result->name, filename, len);
        result->uptr = NULL;
        result->aname = NULL;
-       result->separate = false;
 
-       strlcpy(kname, filename, EMBEDDED_NAME_MAX);
        return result;
 }