summaryrefslogtreecommitdiff
path: root/drivers/scsi/device_handler/scsi_dh_alua.c
diff options
context:
space:
mode:
authorHannes Reinecke <hare@suse.de>2016-02-19 09:17:06 +0100
committerMartin K. Petersen <martin.petersen@oracle.com>2016-02-23 21:27:02 -0500
commita4253fde53fda56c2116a1cf8df9c93ef272eab4 (patch)
treeccfe9911774dedb9fb95922b0c09b7af9055fd6f /drivers/scsi/device_handler/scsi_dh_alua.c
parent0047220c6c3641eeaf0460fb1cc8bbb7f81bd47e (diff)
scsi_dh_alua: simplify alua_initialize()
Rework alua_check_vpd() to use scsi_vpd_get_tpg() and move the port group selection into the function, too. With that we can simplify alua_initialize() to just call alua_check_tpgs() and alua_check_vpd(); Reviewed-by: Bart Van Assche <bart.vanassche@sandisk.com> Reviewed-by: Christoph Hellwig <hch@lst.de> Signed-off-by: Hannes Reinecke <hare@suse.de> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Diffstat (limited to 'drivers/scsi/device_handler/scsi_dh_alua.c')
-rw-r--r--drivers/scsi/device_handler/scsi_dh_alua.c38
1 files changed, 17 insertions, 21 deletions
diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c b/drivers/scsi/device_handler/scsi_dh_alua.c
index 0bcd901a6435..a6fe3ae50c25 100644
--- a/drivers/scsi/device_handler/scsi_dh_alua.c
+++ b/drivers/scsi/device_handler/scsi_dh_alua.c
@@ -92,6 +92,7 @@ struct alua_dh_data {
#define ALUA_POLICY_SWITCH_CURRENT 0
#define ALUA_POLICY_SWITCH_ALL 1
+static int alua_rtpg(struct scsi_device *, struct alua_port_group *, int);
static char print_alua_state(int);
static void release_port_group(struct kref *kref)
@@ -294,7 +295,8 @@ static int alua_check_tpgs(struct scsi_device *sdev)
* Extract the relative target port and the target port group
* descriptor from the list of identificators.
*/
-static int alua_check_vpd(struct scsi_device *sdev, struct alua_dh_data *h)
+static int alua_check_vpd(struct scsi_device *sdev, struct alua_dh_data *h,
+ int tpgs)
{
int rel_port = -1, group_id;
@@ -310,13 +312,21 @@ static int alua_check_vpd(struct scsi_device *sdev, struct alua_dh_data *h)
ALUA_DH_NAME);
return SCSI_DH_DEV_UNSUPP;
}
- h->group_id = group_id;
+
+ h->pg = alua_alloc_pg(sdev, group_id, tpgs);
+ if (IS_ERR(h->pg)) {
+ if (PTR_ERR(h->pg) == -ENOMEM)
+ return SCSI_DH_NOMEM;
+ return SCSI_DH_DEV_UNSUPP;
+ }
+ h->rel_port = rel_port;
sdev_printk(KERN_INFO, sdev,
- "%s: port group %x rel port %x\n",
- ALUA_DH_NAME, h->group_id, h->rel_port);
+ "%s: device %s port group %x rel port %x\n",
+ ALUA_DH_NAME, h->pg->device_id_str,
+ h->group_id, h->rel_port);
- return 0;
+ return alua_rtpg(sdev, h->pg, 0);
}
static char print_alua_state(int state)
@@ -633,23 +643,9 @@ static int alua_initialize(struct scsi_device *sdev, struct alua_dh_data *h)
int err = SCSI_DH_DEV_UNSUPP, tpgs;
tpgs = alua_check_tpgs(sdev);
- if (tpgs == TPGS_MODE_NONE)
- goto out;
-
- err = alua_check_vpd(sdev, h);
- if (err != SCSI_DH_OK)
- goto out;
+ if (tpgs != TPGS_MODE_NONE)
+ err = alua_check_vpd(sdev, h, tpgs);
- h->pg = alua_alloc_pg(sdev, h->group_id, tpgs);
- if (IS_ERR(h->pg)) {
- if (PTR_ERR(h->pg) == -ENOMEM)
- err = SCSI_DH_NOMEM;
- goto out;
- }
- kref_get(&h->pg->kref);
- err = alua_rtpg(sdev, h->pg, 0);
- kref_put(&h->pg->kref, release_port_group);
-out:
return err;
}
/*