]> git.proxmox.com Git - mirror_ubuntu-bionic-kernel.git/blobdiff - drivers/scsi/scsi_devinfo.c
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[mirror_ubuntu-bionic-kernel.git] / drivers / scsi / scsi_devinfo.c
index 6bf43d94cdc0cad83ffb5a3f4737ceab891483a5..fe5a9ea27b5eb4ccb637f275ca8d013cff662f64 100644 (file)
@@ -135,6 +135,7 @@ static struct {
        {"3PARdata", "VV", NULL, BLIST_REPORTLUN2},
        {"ADAPTEC", "AACRAID", NULL, BLIST_FORCELUN},
        {"ADAPTEC", "Adaptec 5400S", NULL, BLIST_FORCELUN},
+       {"AIX", "VDASD", NULL, BLIST_TRY_VPD_PAGES},
        {"AFT PRO", "-IX CF", "0.0>", BLIST_FORCELUN},
        {"BELKIN", "USB 2 HS-CF", "1.95",  BLIST_FORCELUN | BLIST_INQUIRY_36},
        {"BROWNIE", "1200U3P", NULL, BLIST_NOREPORTLUN},
@@ -161,7 +162,7 @@ static struct {
        {"DGC", "RAID", NULL, BLIST_SPARSELUN}, /* Dell PV 650F, storage on LUN 0 */
        {"DGC", "DISK", NULL, BLIST_SPARSELUN}, /* Dell PV 650F, no storage on LUN 0 */
        {"EMC",  "Invista", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
-       {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_FORCELUN},
+       {"EMC", "SYMMETRIX", NULL, BLIST_SPARSELUN | BLIST_LARGELUN | BLIST_REPORTLUN2},
        {"EMULEX", "MD21/S2     ESDI", NULL, BLIST_SINGLELUN},
        {"easyRAID", "16P", NULL, BLIST_NOREPORTLUN},
        {"easyRAID", "X6P", NULL, BLIST_NOREPORTLUN},
@@ -174,7 +175,7 @@ static struct {
        {"HITACHI", "DF500", "*", BLIST_REPORTLUN2},
        {"HITACHI", "DISK-SUBSYSTEM", "*", BLIST_REPORTLUN2},
        {"HITACHI", "HUS1530", "*", BLIST_NO_DIF},
-       {"HITACHI", "OPEN-", "*", BLIST_REPORTLUN2},
+       {"HITACHI", "OPEN-", "*", BLIST_REPORTLUN2 | BLIST_TRY_VPD_PAGES},
        {"HITACHI", "OP-C-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
        {"HITACHI", "3380-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
        {"HITACHI", "3390-", "*", BLIST_SPARSELUN | BLIST_LARGELUN},
@@ -305,8 +306,8 @@ static void scsi_strcpy_devinfo(char *name, char *to, size_t to_length,
                         */
                        to[from_length] = '\0';
                } else {
-                       /* 
-                        * space pad the string if it is short. 
+                       /*
+                        * space pad the string if it is short.
                         */
                        strncpy(&to[from_length], spaces,
                                to_length - from_length);
@@ -326,10 +327,10 @@ static void scsi_strcpy_devinfo(char *name, char *to, size_t to_length,
  * @flags:     if strflags NULL, use this flag value
  *
  * Description:
- *     Create and add one dev_info entry for @vendor, @model, @strflags or
- *     @flag. If @compatible, add to the tail of the list, do not space
- *     pad, and set devinfo->compatible. The scsi_static_device_list entries
- *     are added with @compatible 1 and @clfags NULL.
+ *     Create and add one dev_info entry for @vendor, @model, @strflags or
+ *     @flag. If @compatible, add to the tail of the list, do not space
+ *     pad, and set devinfo->compatible. The scsi_static_device_list entries
+ *     are added with @compatible 1 and @clfags NULL.
  *
  * Returns: 0 OK, -error on failure.
  **/
@@ -351,11 +352,11 @@ static int scsi_dev_info_list_add(int compatible, char *vendor, char *model,
  * @key:       specify list to use
  *
  * Description:
- *     Create and add one dev_info entry for @vendor, @model,
- *     @strflags or @flag in list specified by @key. If @compatible,
- *     add to the tail of the list, do not space pad, and set
- *     devinfo->compatible. The scsi_static_device_list entries are
- *     added with @compatible 1 and @clfags NULL.
+ *     Create and add one dev_info entry for @vendor, @model,
+ *     @strflags or @flag in list specified by @key. If @compatible,
+ *     add to the tail of the list, do not space pad, and set
+ *     devinfo->compatible. The scsi_static_device_list entries are
+ *     added with @compatible 1 and @clfags NULL.
  *
  * Returns: 0 OK, -error on failure.
  **/
@@ -400,13 +401,13 @@ EXPORT_SYMBOL(scsi_dev_info_list_add_keyed);
 
 /**
  * scsi_dev_info_list_find - find a matching dev_info list entry.
- * @vendor:    vendor string
- * @model:     model (product) string
+ * @vendor:    full vendor string
+ * @model:     full model (product) string
  * @key:       specify list to use
  *
  * Description:
  *     Finds the first dev_info entry matching @vendor, @model
- *     in list specified by @key.
+ *     in list specified by @key.
  *
  * Returns: pointer to matching entry, or ERR_PTR on failure.
  **/
@@ -416,7 +417,7 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,
        struct scsi_dev_info_list *devinfo;
        struct scsi_dev_info_list_table *devinfo_table =
                scsi_devinfo_lookup_by_key(key);
-       size_t vmax, mmax;
+       size_t vmax, mmax, mlen;
        const char *vskip, *mskip;
 
        if (IS_ERR(devinfo_table))
@@ -455,22 +456,25 @@ static struct scsi_dev_info_list *scsi_dev_info_list_find(const char *vendor,
                            dev_info_list) {
                if (devinfo->compatible) {
                        /*
-                        * Behave like the older version of get_device_flags.
+                        * vendor strings must be an exact match
                         */
-                       if (memcmp(devinfo->vendor, vskip, vmax) ||
-                                       (vmax < sizeof(devinfo->vendor) &&
-                                               devinfo->vendor[vmax]))
+                       if (vmax != strlen(devinfo->vendor) ||
+                           memcmp(devinfo->vendor, vskip, vmax))
                                continue;
-                       if (memcmp(devinfo->model, mskip, mmax) ||
-                                       (mmax < sizeof(devinfo->model) &&
-                                               devinfo->model[mmax]))
+
+                       /*
+                        * @model specifies the full string, and
+                        * must be larger or equal to devinfo->model
+                        */
+                       mlen = strlen(devinfo->model);
+                       if (mmax < mlen || memcmp(devinfo->model, mskip, mlen))
                                continue;
                        return devinfo;
                } else {
                        if (!memcmp(devinfo->vendor, vendor,
-                                    sizeof(devinfo->vendor)) &&
-                            !memcmp(devinfo->model, model,
-                                     sizeof(devinfo->model)))
+                                   sizeof(devinfo->vendor)) &&
+                           !memcmp(devinfo->model, model,
+                                   sizeof(devinfo->model)))
                                return devinfo;
                }
        }
@@ -509,10 +513,10 @@ EXPORT_SYMBOL(scsi_dev_info_list_del_keyed);
  * @dev_list:  string of device flags to add
  *
  * Description:
- *     Parse dev_list, and add entries to the scsi_dev_info_list.
- *     dev_list is of the form "vendor:product:flag,vendor:product:flag".
- *     dev_list is modified via strsep. Can be called for command line
- *     addition, for proc or mabye a sysfs interface.
+ *     Parse dev_list, and add entries to the scsi_dev_info_list.
+ *     dev_list is of the form "vendor:product:flag,vendor:product:flag".
+ *     dev_list is modified via strsep. Can be called for command line
+ *     addition, for proc or mabye a sysfs interface.
  *
  * Returns: 0 if OK, -error on failure.
  **/
@@ -702,7 +706,7 @@ static int proc_scsi_devinfo_open(struct inode *inode, struct file *file)
        return seq_open(file, &scsi_devinfo_seq_ops);
 }
 
-/* 
+/*
  * proc_scsi_dev_info_write - allow additions to scsi_dev_info_list via /proc.
  *
  * Description: Adds a black/white list entry for vendor and model with an
@@ -841,8 +845,8 @@ EXPORT_SYMBOL(scsi_dev_info_remove_list);
  * scsi_init_devinfo - set up the dynamic device list.
  *
  * Description:
- *     Add command line entries from scsi_dev_flags, then add
- *     scsi_static_device_list entries to the scsi device info list.
+ *     Add command line entries from scsi_dev_flags, then add
+ *     scsi_static_device_list entries to the scsi device info list.
  */
 int __init scsi_init_devinfo(void)
 {