kexec/fs2dt.c: wrong dt node fix

2nd kernel hangs early because of a regression caused by below commit:
commit 68262155d8c661586b809bc5301a7dff1c378137
Author: Andrew Jones <drjones@redhat.com>
Date:   Fri Nov 20 12:31:53 2015 -0500

    kexec/fs2dt: cleanup pathname

    putnode() will add the trailing '/', avoid having two. Also
    pathstart is unused, get rid of it.

    Signed-off-by: Andrew Jones <drjones@redhat.com>
    Signed-off-by: Simon Horman <horms@verge.net.au>

The actual purpose of the commit is to avoid double slash in pathname.
But unfortunately in function putnode() we have below magics to get the node
name:
	basename = strrchr(pathname,'/') + 1;
	...
	strcpy((void *)dt, *basename ? basename : "");
	...
	strcat(pathname, "/");

We treat none zero basename as a node name, then concat a slash to open the
directory for later property handling.
pathname originally was "/proc/device-tree/" so for the first run of putnode
it will cause double slashes. With the commit above mentioned there are no
double slashes but we will copy "device-tree" to dt. Thus kexec kernel is not
happy..

Instead let's fix it by only concating slash when the basenanme is not empty
and restore the initial value of pathname as "/proc/device-tree/"

Note: I only reproduce the issue with loading older kernel like 3.10 in RHEL. I do
not see the problem in new kernels in Fedora.

Signed-off-by: Dave Young <dyoung@redhat.com>
Reviewed-by: Andrew Jones <drjones@redhat.com>
Signed-off-by: Simon Horman <horms@verge.net.au>
1 file changed