From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from kirsty.vergenet.net ([202.4.237.240]) by bombadil.infradead.org with esmtp (Exim 4.80.1 #2 (Red Hat Linux)) id 1XoimM-0003DT-Bl for kexec@lists.infradead.org; Thu, 13 Nov 2014 01:00:55 +0000 Date: Thu, 13 Nov 2014 10:00:29 +0900 From: Simon Horman Subject: Re: [PATCH] kexec/fs2dt: Fix sorting of device tree Message-ID: <20141113010029.GI14971@verge.net.au> References: <1415838858-3225-1-git-send-email-anton@samba.org> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1415838858-3225-1-git-send-email-anton@samba.org> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: Anton Blanchard Cc: kexec@lists.infradead.org, haren@us.ibm.com On Thu, Nov 13, 2014 at 11:34:18AM +1100, Anton Blanchard wrote: > Commit b02d735bf252 ('ppc64 kdump device_tree sort') added code to > sort device tree properties, but it had a few issues. > > A compare routine needs to return -1 and 1. The special case for > sorting properties with unit addresses only returned 1 and ignored > the opposite case, which screwed up the sorting. > > We were missing a few more things: > > - Need to check both basenames are the same length > - Need to check both basenames match > > I noticed this when looking at the NUMA topology after a kexec, and > it had shifted. > > Signed-off-by: Anton Blanchard Thanks Anton, applied. > --- > kexec/fs2dt.c | 19 ++++++++++++++++--- > 1 file changed, 16 insertions(+), 3 deletions(-) > > diff --git a/kexec/fs2dt.c b/kexec/fs2dt.c > index 1e5f074..304f6cb 100644 > --- a/kexec/fs2dt.c > +++ b/kexec/fs2dt.c > @@ -479,6 +479,8 @@ static int comparefunc(const struct dirent **dentry1, > { > char *str1 = (*(struct dirent **)dentry1)->d_name; > char *str2 = (*(struct dirent **)dentry2)->d_name; > + char *sep1 = strchr(str1, '@'); > + char *sep2 = strchr(str2, '@'); > > /* > * strcmp scans from left to right and fails to idetify for some > @@ -486,9 +488,20 @@ static int comparefunc(const struct dirent **dentry1, > * Therefore, we get the wrong sorted order like memory@10000000 and > * memory@f000000. > */ > - if (strchr(str1, '@') && strchr(str2, '@') && > - (strlen(str1) > strlen(str2))) > - return 1; > + if (sep1 && sep2) { > + int baselen1 = sep1 - str1; > + int baselen2 = sep2 - str2; > + int len1 = strlen(str1); > + int len2 = strlen(str2); > + > + /* > + * Check the base name matches, and the properties are > + * different lengths. > + */ > + if ((baselen1 == baselen2) && (len1 != len2) && > + !strncmp(str1, str2, baselen2)) > + return (len1 > len2) - (len1 < len2); > + } > > return strcmp(str1, str2); > } > -- > 1.9.1 > > > _______________________________________________ > kexec mailing list > kexec@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec > _______________________________________________ kexec mailing list kexec@lists.infradead.org http://lists.infradead.org/mailman/listinfo/kexec