libata: Use glob_match from lib/glob.c
authorGeorge Spelvin <linux@horizon.com>
Wed, 6 Aug 2014 23:09:27 +0000 (16:09 -0700)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 7 Aug 2014 01:01:25 +0000 (18:01 -0700)
The function may be useful for other drivers, so export it.  (Suggested
by Tejun Heo.)

Note that I inverted the return value of glob_match; returning true on
match seemed to make more sense.

Signed-off-by: George Spelvin <linux@horizon.com>
Cc: Randy Dunlap <rdunlap@infradead.org>
Cc: Tejun Heo <tj@kernel.org>
Cc: Ingo Molnar <mingo@elte.hu>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
drivers/ata/Kconfig
drivers/ata/libata-core.c

index e65d400efd449a9030f5ccbef1a27d68587aa797..e1b92788c225875efb978f21f8cd25f817f68a52 100644 (file)
@@ -16,6 +16,7 @@ menuconfig ATA
        depends on BLOCK
        depends on !(M32R || M68K || S390) || BROKEN
        select SCSI
+       select GLOB
        ---help---
          If you want to use an ATA hard disk, ATA tape drive, ATA CD-ROM or
          any other ATA device under Linux, say Y and make sure that you know
index 677c0c1b03bd658322cad2faf5becd86ce1db3cd..dbdc5d32343f53f7ed96a94cf2d6d69258a54237 100644 (file)
@@ -59,6 +59,7 @@
 #include <linux/async.h>
 #include <linux/log2.h>
 #include <linux/slab.h>
+#include <linux/glob.h>
 #include <scsi/scsi.h>
 #include <scsi/scsi_cmnd.h>
 #include <scsi/scsi_host.h>
@@ -4250,73 +4251,6 @@ static const struct ata_blacklist_entry ata_device_blacklist [] = {
        { }
 };
 
-/**
- *     glob_match - match a text string against a glob-style pattern
- *     @text: the string to be examined
- *     @pattern: the glob-style pattern to be matched against
- *
- *     Either/both of text and pattern can be empty strings.
- *
- *     Match text against a glob-style pattern, with wildcards and simple sets:
- *
- *             ?       matches any single character.
- *             *       matches any run of characters.
- *             [xyz]   matches a single character from the set: x, y, or z.
- *             [a-d]   matches a single character from the range: a, b, c, or d.
- *             [a-d0-9] matches a single character from either range.
- *
- *     The special characters ?, [, -, or *, can be matched using a set, eg. [*]
- *     Behaviour with malformed patterns is undefined, though generally reasonable.
- *
- *     Sample patterns:  "SD1?",  "SD1[0-5]",  "*R0",  "SD*1?[012]*xx"
- *
- *     This function uses one level of recursion per '*' in pattern.
- *     Since it calls _nothing_ else, and has _no_ explicit local variables,
- *     this will not cause stack problems for any reasonable use here.
- *
- *     RETURNS:
- *     0 on match, 1 otherwise.
- */
-static int glob_match (const char *text, const char *pattern)
-{
-       do {
-               /* Match single character or a '?' wildcard */
-               if (*text == *pattern || *pattern == '?') {
-                       if (!*pattern++)
-                               return 0;  /* End of both strings: match */
-               } else {
-                       /* Match single char against a '[' bracketed ']' pattern set */
-                       if (!*text || *pattern != '[')
-                               break;  /* Not a pattern set */
-                       while (*++pattern && *pattern != ']' && *text != *pattern) {
-                               if (*pattern == '-' && *(pattern - 1) != '[')
-                                       if (*text > *(pattern - 1) && *text < *(pattern + 1)) {
-                                               ++pattern;
-                                               break;
-                                       }
-                       }
-                       if (!*pattern || *pattern == ']')
-                               return 1;  /* No match */
-                       while (*pattern && *pattern++ != ']');
-               }
-       } while (*++text && *pattern);
-
-       /* Match any run of chars against a '*' wildcard */
-       if (*pattern == '*') {
-               if (!*++pattern)
-                       return 0;  /* Match: avoid recursion at end of pattern */
-               /* Loop to handle additional pattern chars after the wildcard */
-               while (*text) {
-                       if (glob_match(text, pattern) == 0)
-                               return 0;  /* Remainder matched */
-                       ++text;  /* Absorb (match) this char and try again */
-               }
-       }
-       if (!*text && !*pattern)
-               return 0;  /* End of both strings: match */
-       return 1;  /* No match */
-}
-
 static unsigned long ata_dev_blacklisted(const struct ata_device *dev)
 {
        unsigned char model_num[ATA_ID_PROD_LEN + 1];
@@ -4327,10 +4261,10 @@ static unsigned long ata_dev_blacklisted(const struct ata_device *dev)
        ata_id_c_string(dev->id, model_rev, ATA_ID_FW_REV, sizeof(model_rev));
 
        while (ad->model_num) {
-               if (!glob_match(model_num, ad->model_num)) {
+               if (glob_match(model_num, ad->model_num)) {
                        if (ad->model_rev == NULL)
                                return ad->horkage;
-                       if (!glob_match(model_rev, ad->model_rev))
+                       if (glob_match(model_rev, ad->model_rev))
                                return ad->horkage;
                }
                ad++;