From: Hannes Reinecke Subject: [PATCH 2/2] Evaluate TGPS setting for device handler detection For correct ALUA support we should evaluate the TPGS setting of the device and only attach the alua device handler to it if not zero. Signed-off-by: Hannes Reinecke Acked-by: Nicholas A. Bellinger Acked-by: Chandra Seetharaman --- drivers/scsi/device_handler/scsi_dh_alua.c | 72 +++------------------------- drivers/scsi/device_handler/scsi_dh_emc.c | 8 +-- drivers/scsi/device_handler/scsi_dh_hp_sw.c | 10 +-- drivers/scsi/device_handler/scsi_dh_rdac.c | 64 ++++++++++++------------ include/scsi/scsi_device.h | 1 5 files changed, 51 insertions(+), 104 deletions(-) Index: linux-2.6/drivers/scsi/device_handler/scsi_dh_alua.c =================================================================== --- linux-2.6.orig/drivers/scsi/device_handler/scsi_dh_alua.c +++ linux-2.6/drivers/scsi/device_handler/scsi_dh_alua.c @@ -128,43 +128,6 @@ static struct request *get_alua_req(stru } /* - * submit_std_inquiry - Issue a standard INQUIRY command - * @sdev: sdev the command should be send to - */ -static int submit_std_inquiry(struct scsi_device *sdev, struct alua_dh_data *h) -{ - struct request *rq; - int err = SCSI_DH_RES_TEMP_UNAVAIL; - - rq = get_alua_req(sdev, h->inq, ALUA_INQUIRY_SIZE, READ); - if (!rq) - goto done; - - /* Prepare the command. */ - rq->cmd[0] = INQUIRY; - rq->cmd[1] = 0; - rq->cmd[2] = 0; - rq->cmd[4] = ALUA_INQUIRY_SIZE; - rq->cmd_len = COMMAND_SIZE(INQUIRY); - - rq->sense = h->sense; - memset(rq->sense, 0, SCSI_SENSE_BUFFERSIZE); - rq->sense_len = h->senselen = 0; - - err = blk_execute_rq(rq->q, NULL, rq, 1); - if (err == -EIO) { - sdev_printk(KERN_INFO, sdev, - "%s: std inquiry failed with %x\n", - ALUA_DH_NAME, rq->errors); - h->senselen = rq->sense_len; - err = SCSI_DH_IO; - } - blk_put_request(rq); -done: - return err; -} - -/* * submit_vpd_inquiry - Issue an INQUIRY VPD page 0x83 command * @sdev: sdev the command should be sent to */ @@ -338,23 +301,19 @@ static unsigned submit_stpg(struct alua_ } /* - * alua_std_inquiry - Evaluate standard INQUIRY command + * alua_check_tpgs - Evaluate TPGS setting * @sdev: device to be checked * - * Just extract the TPGS setting to find out if ALUA + * Just examine the TPGS setting of the device to find out if ALUA * is supported. */ -static int alua_std_inquiry(struct scsi_device *sdev, struct alua_dh_data *h) +static int alua_check_tpgs(struct scsi_device *sdev, struct alua_dh_data *h) { - int err; - - err = submit_std_inquiry(sdev, h); - - if (err != SCSI_DH_OK) - return err; + int err = SCSI_DH_OK; /* Check TPGS setting */ - h->tpgs = (h->inq[5] >> 4) & 0x3; + h->tpgs = scsi_device_tpgs(sdev); + switch (h->tpgs) { case TPGS_MODE_EXPLICIT|TPGS_MODE_IMPLICIT: sdev_printk(KERN_INFO, sdev, @@ -642,7 +601,7 @@ static int alua_initialize(struct scsi_d { int err; - err = alua_std_inquiry(sdev, h); + err = alua_check_tpgs(sdev, h); if (err != SCSI_DH_OK) goto out; @@ -721,21 +680,8 @@ static int alua_prep_fn(struct scsi_devi } static const struct scsi_dh_devlist alua_dev_list[] = { - {"HP", "MSA VOLUME" }, - {"HP", "HSV101" }, - {"HP", "HSV111" }, - {"HP", "HSV200" }, - {"HP", "HSV210" }, - {"HP", "HSV300" }, - {"IBM", "2107900" }, - {"IBM", "2145" }, - {"Pillar", "Axiom" }, - {"Intel", "Multi-Flex"}, - {"NETAPP", "LUN"}, - {"NETAPP", "LUN C-Mode"}, - {"AIX", "NVDISK"}, - {"Promise", "VTrak"}, - {NULL, NULL} + {"", "", 3 }, + {NULL, NULL, 0} }; static int alua_bus_attach(struct scsi_device *sdev); Index: linux-2.6/drivers/scsi/device_handler/scsi_dh_emc.c =================================================================== --- linux-2.6.orig/drivers/scsi/device_handler/scsi_dh_emc.c +++ linux-2.6/drivers/scsi/device_handler/scsi_dh_emc.c @@ -622,10 +622,10 @@ done: } static const struct scsi_dh_devlist clariion_dev_list[] = { - {"DGC", "RAID"}, - {"DGC", "DISK"}, - {"DGC", "VRAID"}, - {NULL, NULL}, + {"DGC", "RAID", 0}, + {"DGC", "DISK", 0}, + {"DGC", "VRAID", 0}, + {NULL, NULL, 0}, }; static int clariion_bus_attach(struct scsi_device *sdev); Index: linux-2.6/drivers/scsi/device_handler/scsi_dh_hp_sw.c =================================================================== --- linux-2.6.orig/drivers/scsi/device_handler/scsi_dh_hp_sw.c +++ linux-2.6/drivers/scsi/device_handler/scsi_dh_hp_sw.c @@ -312,11 +312,11 @@ static int hp_sw_activate(struct scsi_de } static const struct scsi_dh_devlist hp_sw_dh_data_list[] = { - {"COMPAQ", "MSA1000 VOLUME"}, - {"COMPAQ", "HSV110"}, - {"HP", "HSV100"}, - {"DEC", "HSG80"}, - {NULL, NULL}, + {"COMPAQ", "MSA1000 VOLUME", 0}, + {"COMPAQ", "HSV110", 0}, + {"HP", "HSV100", 0}, + {"DEC", "HSG80", 0}, + {NULL, NULL, 0}, }; static int hp_sw_bus_attach(struct scsi_device *sdev); Index: linux-2.6/drivers/scsi/device_handler/scsi_dh_rdac.c =================================================================== --- linux-2.6.orig/drivers/scsi/device_handler/scsi_dh_rdac.c +++ linux-2.6/drivers/scsi/device_handler/scsi_dh_rdac.c @@ -743,38 +743,38 @@ static int rdac_check_sense(struct scsi_ } static const struct scsi_dh_devlist rdac_dev_list[] = { - {"IBM", "1722"}, - {"IBM", "1724"}, - {"IBM", "1726"}, - {"IBM", "1742"}, - {"IBM", "1745"}, - {"IBM", "1746"}, - {"IBM", "1814"}, - {"IBM", "1815"}, - {"IBM", "1818"}, - {"IBM", "3526"}, - {"SGI", "TP9400"}, - {"SGI", "TP9500"}, - {"SGI", "IS"}, - {"STK", "OPENstorage D280"}, - {"SUN", "CSM200_R"}, - {"SUN", "LCSM100_I"}, - {"SUN", "LCSM100_S"}, - {"SUN", "LCSM100_E"}, - {"SUN", "LCSM100_F"}, - {"DELL", "MD3000"}, - {"DELL", "MD3000i"}, - {"DELL", "MD32xx"}, - {"DELL", "MD32xxi"}, - {"DELL", "MD36xxi"}, - {"DELL", "MD36xxf"}, - {"LSI", "INF-01-00"}, - {"ENGENIO", "INF-01-00"}, - {"STK", "FLEXLINE 380"}, - {"SUN", "CSM100_R_FC"}, - {"SUN", "STK6580_6780"}, - {"SUN", "SUN_6180"}, - {NULL, NULL}, + {"IBM", "1722", 0}, + {"IBM", "1724", 0}, + {"IBM", "1726", 0}, + {"IBM", "1742", 0}, + {"IBM", "1745", 0}, + {"IBM", "1746", 0}, + {"IBM", "1814", 0}, + {"IBM", "1815", 0}, + {"IBM", "1818", 0}, + {"IBM", "3526", 0}, + {"SGI", "TP9400", 0}, + {"SGI", "TP9500", 0}, + {"SGI", "IS", 0}, + {"STK", "OPENstorage D280", 0}, + {"SUN", "CSM200_R", 0}, + {"SUN", "LCSM100_I", 0}, + {"SUN", "LCSM100_S", 0}, + {"SUN", "LCSM100_E", 0}, + {"SUN", "LCSM100_F", 0}, + {"DELL", "MD3000", 0}, + {"DELL", "MD3000i", 0}, + {"DELL", "MD32xx", 0}, + {"DELL", "MD32xxi", 0}, + {"DELL", "MD36xxi", 0}, + {"DELL", "MD36xxf", 0}, + {"LSI", "INF-01-00", 0}, + {"ENGENIO", "INF-01-00", 0}, + {"STK", "FLEXLINE 380", 0}, + {"SUN", "CSM100_R_FC", 0}, + {"SUN", "STK6580_6780", 0}, + {"SUN", "SUN_6180", 0}, + {NULL, NULL, 0}, }; static int rdac_bus_attach(struct scsi_device *sdev); Index: linux-2.6/include/scsi/scsi_device.h =================================================================== --- linux-2.6.orig/include/scsi/scsi_device.h +++ linux-2.6/include/scsi/scsi_device.h @@ -178,6 +178,7 @@ struct scsi_device { struct scsi_dh_devlist { char *vendor; char *model; + char tpgs; }; typedef void (*activate_complete)(void *, int);