On 10/02/2015 02:07 AM, Bart Van Assche wrote: > On 09/29/2015 03:47 AM, Hannes Reinecke wrote: >> Seperate out SET TARGET PORT GROUP functionality into a separate > ^ Separate ? >> function alua_stpg(). >> >> Signed-off-by: Hannes Reinecke <hare@xxxxxxx> >> --- >> drivers/scsi/device_handler/scsi_dh_alua.c | 86 >> ++++++++++++++++++------------ >> 1 file changed, 52 insertions(+), 34 deletions(-) >> >> diff --git a/drivers/scsi/device_handler/scsi_dh_alua.c >> b/drivers/scsi/device_handler/scsi_dh_alua.c >> index 63423b2..59fe3e9 100644 >> --- a/drivers/scsi/device_handler/scsi_dh_alua.c >> +++ b/drivers/scsi/device_handler/scsi_dh_alua.c >> @@ -614,6 +614,56 @@ static int alua_rtpg(struct scsi_device >> *sdev, struct alua_dh_data *h, int wait_ >> } >> >> /* >> + * alua_stpg - Issue a SET TARGET GROUP STATES command >> + * >> + * Issue a SET TARGET GROUP STATES command and evaluate the >> + * response. Returns SCSI_DH_RETRY per default to trigger >> + * a re-evaluation of the target group state. >> + */ > > In SPC-4 I found the following description next to the STPG command: > "SET TARGET PORT GROUPS". How about using the official SPC-4 > description ? > >> +static unsigned alua_stpg(struct scsi_device *sdev, struct >> alua_dh_data *h, >> + activate_complete fn, void *data) >> +{ >> + int err = SCSI_DH_OK; >> + int stpg = 0; >> + >> + if (!(h->tpgs & TPGS_MODE_EXPLICIT)) { >> + /* Only implicit ALUA supported */ >> + return err; >> + } >> + >> + switch (h->state) { >> + case TPGS_STATE_NONOPTIMIZED: >> + stpg = 1; >> + if ((h->flags & ALUA_OPTIMIZE_STPG) && >> + !h->pref && >> + (h->tpgs & TPGS_MODE_IMPLICIT)) >> + stpg = 0; >> + break; >> + case TPGS_STATE_STANDBY: >> + case TPGS_STATE_UNAVAILABLE: >> + stpg = 1; >> + break; >> + case TPGS_STATE_OFFLINE: >> + err = SCSI_DH_IO; >> + break; >> + case TPGS_STATE_TRANSITIONING: >> + err = SCSI_DH_RETRY; >> + break; >> + default: >> + break; >> + } >> + >> + if (stpg) { >> + h->callback_fn = fn; >> + h->callback_data = data; >> + err = submit_stpg(h); >> + if (err != SCSI_DH_OK) >> + h->callback_fn = h->callback_data = NULL; >> + } >> + return err; >> +} >> + >> +/* >> * alua_initialize - Initialize ALUA state >> * @sdev: the device to be initialized >> * >> @@ -690,7 +740,6 @@ static int alua_activate(struct scsi_device >> *sdev, >> { >> struct alua_dh_data *h = sdev->handler_data; >> int err = SCSI_DH_OK; >> - int stpg = 0; >> >> err = alua_rtpg(sdev, h, 1); >> if (err != SCSI_DH_OK) >> @@ -699,41 +748,10 @@ static int alua_activate(struct scsi_device >> *sdev, >> if (optimize_stpg) >> h->flags |= ALUA_OPTIMIZE_STPG; >> >> - if (h->tpgs & TPGS_MODE_EXPLICIT) { >> - switch (h->state) { >> - case TPGS_STATE_NONOPTIMIZED: >> - stpg = 1; >> - if ((h->flags & ALUA_OPTIMIZE_STPG) && >> - (!h->pref) && >> - (h->tpgs & TPGS_MODE_IMPLICIT)) >> - stpg = 0; >> - break; >> - case TPGS_STATE_STANDBY: >> - case TPGS_STATE_UNAVAILABLE: >> - stpg = 1; >> - break; >> - case TPGS_STATE_OFFLINE: >> - err = SCSI_DH_IO; >> - break; >> - case TPGS_STATE_TRANSITIONING: >> - err = SCSI_DH_RETRY; >> - break; >> - default: >> - break; >> - } >> - } >> - >> - if (stpg) { >> - h->callback_fn = fn; >> - h->callback_data = data; >> - err = submit_stpg(h); >> - if (err == SCSI_DH_OK) >> - return 0; >> - h->callback_fn = h->callback_data = NULL; >> - } >> + err = alua_stpg(sdev, h, fn, data); >> >> out: >> - if (fn) >> + if (err != SCSI_DH_OK && fn) >> fn(data, err); >> return 0; >> } >> > > The old implementation calls the callback function 'fn' if the flag > TPGS_MODE_EXPLICIT has not been set but the new implementation not. > Please mention this in the patch description if this behavior change > is intentional. > Actually, this looks more like an error with the old implementation. 'fn' is the callback signalling that the failover command has been completed, and the caller (in most case dm-multipath) relies on 'fn' to be executed for further processing. So 'fn' should be executed, irrespective of the TPGS_MODE_EXPLICIT flag. Cheers, Hannes -- Dr. Hannes Reinecke zSeries & Storage hare@xxxxxxx +49 911 74053 688 SUSE LINUX GmbH, Maxfeldstr. 5, 90409 Nürnberg GF: F. Imendörffer, J. Smithard, J. Guild, D. Upmanyu, G. Norton HRB 21284 (AG Nürnberg) -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html