Re: [PATCH/RFC 1/2] lib: string: Remove duplicated function

2014-09-12 Thread Tejun Heo
Hello,

On Fri, Sep 12, 2014 at 11:01:17AM +0200, Rasmus Villemoes wrote:
> On Fri, Sep 12 2014, Andrew Morton  wrote:
> 
> > On Wed, 27 Aug 2014 09:36:01 +0200 Rasmus Villemoes 
> >  wrote:
> >> strncasecmp is the POSIX name for this functionality. So rename the
> >> non-broken function to the standard name. To minimize the impact on
> >> the rest of the kernel (and since both are exported to modules), make
> >> strnicmp a wrapper for strncasecmp.

Maybe it's a good idea to convert all existing users of strnicmp()
strncasecmp() and then mark the strnicmp() wrapper as __deprecated for
later removal?

> > I guess it's safe to assume that nobody was depending on the
> > strncasecmp() bug.
> 
> Hm, I thought so as well, but decided to double check. I found one minor
> issue; maybe Tejun can tell if my analysis is correct.
> 
> In drivers/ata/libata-core.c, ata_parse_force_one(), it is not
> immediately clear to me that val cannot end up being the empty
> string. With the buggy strncasecmp, the continue branch is always
> followed (since fp->name is not empty); however, with strncasecmp with
> the correct semantics, the empty string is obviously a prefix of every
> fp->name. So even though the comment says that "1.5" is an ok
> abbreviation of "1.5Gbps", I don't think the intention was to allow ""
> to be an abbreviation of everything. Anyway, the worst that can happen
> seems to be that "ambigious value" [sic] becomes the *reason instead
> of "unknown value".

Sounds right to me and it shouldn't matter at all.

> > Yes, please prepare the strnicmp()->strncasecmp() patches and let's get
> > them merged up.  After a kernel release or two we can zap the
> > back-compat wrapper.

Ooh, somebody already suggested the same. :)

Thanks.

-- 
tejun
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH/RFC 1/2] lib: string: Remove duplicated function

2014-09-12 Thread Joe Perches
On Fri, 2014-09-12 at 11:01 +0200, Rasmus Villemoes wrote:
> Would it make sense to add a checkpatch warning to ensure new users
> are not introduced, and then remove it when the wrapper is also removed?

 Generally the rate of introduction is pretty low.

Generally, just making sure it's not used is good enough.

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH/RFC 1/2] lib: string: Remove duplicated function

2014-09-12 Thread Rasmus Villemoes
On Fri, Sep 12 2014, Andrew Morton  wrote:

> On Wed, 27 Aug 2014 09:36:01 +0200 Rasmus Villemoes 
>  wrote:
>
>> lib/string.c contains two functions, strnicmp and strncasecmp, which
>> do roughly the same thing, namely compare two strings
>> case-insensitively up to a given bound. They have slightly different
>> implementations, but the only important difference is that strncasecmp
>> doesn't handle len==0 appropriately; it effectively becomes strcasecmp
>> in that case. strnicmp correctly says that two strings are always
>> equal in their first 0 characters.
>> 
>> strncasecmp is the POSIX name for this functionality. So rename the
>> non-broken function to the standard name. To minimize the impact on
>> the rest of the kernel (and since both are exported to modules), make
>> strnicmp a wrapper for strncasecmp.
>
> I guess it's safe to assume that nobody was depending on the
> strncasecmp() bug.

Hm, I thought so as well, but decided to double check. I found one minor
issue; maybe Tejun can tell if my analysis is correct.

In drivers/ata/libata-core.c, ata_parse_force_one(), it is not
immediately clear to me that val cannot end up being the empty
string. With the buggy strncasecmp, the continue branch is always
followed (since fp->name is not empty); however, with strncasecmp with
the correct semantics, the empty string is obviously a prefix of every
fp->name. So even though the comment says that "1.5" is an ok
abbreviation of "1.5Gbps", I don't think the intention was to allow ""
to be an abbreviation of everything. Anyway, the worst that can happen
seems to be that "ambigious value" [sic] becomes the *reason instead
of "unknown value".

I may have overlooked similar issues; my checking was basically "is the
length parameter an explicit non-zero number or strlen() of some static
data in some table (where I assume empty strings do not lurk)".

> Yes, please prepare the strnicmp()->strncasecmp() patches and let's get
> them merged up.  After a kernel release or two we can zap the
> back-compat wrapper.

Will do. Is there a fixed SHA1 I can refer to in the commit logs?

> And it isn't just "out of tree modules" that we should be concerned
> about - we'll commonly find that "to be in tree" code is using
> interfaces which we're trying to alter or remove, so it takes a cycle
> or two to get everything propagated.  Most of this code can be found in
> linux-next.

Would it make sense to add a checkpatch warning to ensure new users
are not introduced, and then remove it when the wrapper is also removed?

Thanks,
Rasmus
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


Re: [PATCH/RFC 1/2] lib: string: Remove duplicated function

2014-09-11 Thread Andrew Morton
On Wed, 27 Aug 2014 09:36:01 +0200 Rasmus Villemoes  
wrote:

> lib/string.c contains two functions, strnicmp and strncasecmp, which
> do roughly the same thing, namely compare two strings
> case-insensitively up to a given bound. They have slightly different
> implementations, but the only important difference is that strncasecmp
> doesn't handle len==0 appropriately; it effectively becomes strcasecmp
> in that case. strnicmp correctly says that two strings are always
> equal in their first 0 characters.
> 
> strncasecmp is the POSIX name for this functionality. So rename the
> non-broken function to the standard name. To minimize the impact on
> the rest of the kernel (and since both are exported to modules), make
> strnicmp a wrapper for strncasecmp.

I guess it's safe to assume that nobody was depending on the
strncasecmp() bug.

The existing strnicmp() implementation is rather verbose, but I expect
that avoiding the tolower() cost where possible makes sense.

Yes, please prepare the strnicmp()->strncasecmp() patches and let's get
them merged up.  After a kernel release or two we can zap the
back-compat wrapper.


And it isn't just "out of tree modules" that we should be concerned
about - we'll commonly find that "to be in tree" code is using
interfaces which we're trying to alter or remove, so it takes a cycle
or two to get everything propagated.  Most of this code can be found in
linux-next.
--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/


[PATCH/RFC 1/2] lib: string: Remove duplicated function

2014-08-27 Thread Rasmus Villemoes
lib/string.c contains two functions, strnicmp and strncasecmp, which
do roughly the same thing, namely compare two strings
case-insensitively up to a given bound. They have slightly different
implementations, but the only important difference is that strncasecmp
doesn't handle len==0 appropriately; it effectively becomes strcasecmp
in that case. strnicmp correctly says that two strings are always
equal in their first 0 characters.

strncasecmp is the POSIX name for this functionality. So rename the
non-broken function to the standard name. To minimize the impact on
the rest of the kernel (and since both are exported to modules), make
strnicmp a wrapper for strncasecmp.

Signed-off-by: Rasmus Villemoes 
---
 lib/string.c | 27 ++-
 1 file changed, 10 insertions(+), 17 deletions(-)

diff --git a/lib/string.c b/lib/string.c
index 992bf30..92c33e1 100644
--- a/lib/string.c
+++ b/lib/string.c
@@ -27,14 +27,14 @@
 #include 
 #include 
 
-#ifndef __HAVE_ARCH_STRNICMP
+#ifndef __HAVE_ARCH_STRNCASECMP
 /**
- * strnicmp - Case insensitive, length-limited string comparison
+ * strncasecmp - Case insensitive, length-limited string comparison
  * @s1: One string
  * @s2: The other string
  * @len: the maximum number of characters to compare
  */
-int strnicmp(const char *s1, const char *s2, size_t len)
+int strncasecmp(const char *s1, const char *s2, size_t len)
 {
/* Yes, Virginia, it had better be unsigned */
unsigned char c1, c2;
@@ -56,6 +56,13 @@ int strnicmp(const char *s1, const char *s2, size_t len)
} while (--len);
return (int)c1 - (int)c2;
 }
+EXPORT_SYMBOL(strncasecmp);
+#endif
+#ifndef __HAVE_ARCH_STRNICMP
+int strnicmp(const char *s1, const char *s2, size_t len)
+{
+   return strncasecmp(s1, s2, len);
+}
 EXPORT_SYMBOL(strnicmp);
 #endif
 
@@ -73,20 +80,6 @@ int strcasecmp(const char *s1, const char *s2)
 EXPORT_SYMBOL(strcasecmp);
 #endif
 
-#ifndef __HAVE_ARCH_STRNCASECMP
-int strncasecmp(const char *s1, const char *s2, size_t n)
-{
-   int c1, c2;
-
-   do {
-   c1 = tolower(*s1++);
-   c2 = tolower(*s2++);
-   } while ((--n > 0) && c1 == c2 && c1 != 0);
-   return c1 - c2;
-}
-EXPORT_SYMBOL(strncasecmp);
-#endif
-
 #ifndef __HAVE_ARCH_STRCPY
 /**
  * strcpy - Copy a %NUL terminated string
-- 
2.0.4

--
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Please read the FAQ at  http://www.tux.org/lkml/