|
@@ -675,14 +675,37 @@ static int alua_activate(struct scsi_device *sdev,
|
|
|
{
|
|
|
struct alua_dh_data *h = get_alua_data(sdev);
|
|
|
int err = SCSI_DH_OK;
|
|
|
+ int stpg = 0;
|
|
|
|
|
|
err = alua_rtpg(sdev, h);
|
|
|
if (err != SCSI_DH_OK)
|
|
|
goto out;
|
|
|
|
|
|
- if (h->tpgs & TPGS_MODE_EXPLICIT &&
|
|
|
- h->state != TPGS_STATE_OPTIMIZED &&
|
|
|
- h->state != TPGS_STATE_LBA_DEPENDENT) {
|
|
|
+ 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:
|
|
|
+ stpg = 1;
|
|
|
+ break;
|
|
|
+ case TPGS_STATE_UNAVAILABLE:
|
|
|
+ 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);
|