OSDN Git Service

scsi: smartpqi: add module param for exposure order
authorGilbert Wu <gilbert.wu@microsemi.com>
Thu, 22 Aug 2019 20:38:58 +0000 (15:38 -0500)
committerMartin K. Petersen <martin.petersen@oracle.com>
Thu, 29 Aug 2019 22:31:38 +0000 (18:31 -0400)
Expose physical devices before logical devices.

Reviewed-by: Scott Benesh <scott.benesh@microsemi.com>
Reviewed-by: Kevin Barnett <kevin.barnett@microsemi.com>
Signed-off-by: Gilbert Wu <gilbert.wu@microsemi.com>
Signed-off-by: Don Brace <don.brace@microsemi.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
drivers/scsi/smartpqi/smartpqi_init.c

index 8fd5ffc..4324234 100644 (file)
@@ -145,6 +145,12 @@ MODULE_PARM_DESC(lockup_action, "Action to take when controller locked up.\n"
        "\t\tSupported: none, reboot, panic\n"
        "\t\tDefault: none");
 
+static int pqi_expose_ld_first;
+module_param_named(expose_ld_first,
+       pqi_expose_ld_first, int, 0644);
+MODULE_PARM_DESC(expose_ld_first,
+       "Expose logical drives before physical drives.");
+
 static char *raid_levels[] = {
        "RAID-0",
        "RAID-4",
@@ -1988,6 +1994,8 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
        unsigned int num_valid_devices;
        bool is_physical_device;
        u8 *scsi3addr;
+       unsigned int physical_index;
+       unsigned int logical_index;
        static char *out_of_memory_msg =
                "failed to allocate memory, device discovery stopped";
 
@@ -2050,19 +2058,23 @@ static int pqi_update_scsi_devices(struct pqi_ctrl_info *ctrl_info)
 
        device = NULL;
        num_valid_devices = 0;
+       physical_index = 0;
+       logical_index = 0;
 
        for (i = 0; i < num_new_devices; i++) {
 
-               if (i < num_physicals) {
+               if ((!pqi_expose_ld_first && i < num_physicals) ||
+                       (pqi_expose_ld_first && i >= num_logicals)) {
                        is_physical_device = true;
-                       phys_lun_ext_entry = &physdev_list->lun_entries[i];
+                       phys_lun_ext_entry =
+                               &physdev_list->lun_entries[physical_index++];
                        log_lun_ext_entry = NULL;
                        scsi3addr = phys_lun_ext_entry->lunid;
                } else {
                        is_physical_device = false;
                        phys_lun_ext_entry = NULL;
                        log_lun_ext_entry =
-                               &logdev_list->lun_entries[i - num_physicals];
+                               &logdev_list->lun_entries[logical_index++];
                        scsi3addr = log_lun_ext_entry->lunid;
                }