[SCSI] scsi_dh_rdac : decide whether to send mode select based on operating mode
authorMoger, Babu <Babu.Moger@lsi.com>
Fri, 8 Apr 2011 17:39:30 +0000 (11:39 -0600)
committerJames Bottomley <James.Bottomley@suse.de>
Sun, 1 May 2011 15:47:41 +0000 (10:47 -0500)
Based on the operating modes, handler decides whether to send mode
select or not. Purpose here is to reduce io-shipping as much as
possible whenever there is an option.

Signed-off-by: Babu Moger <babu.moger@lsi.com>
Reviewed-by: Yanling Qi <yanling.qi@lsi.com>
Reviewed-by: Sudhir Dachepalli <Sudhir.Dachepalli@lis.com>
Reviewed-by: Somasundaram Krishnasamy <Somasundaram.Krishnasamy@lsi.com>
Reviewed-by: Bob Stankey <Robert.Stankey@lsi.com>
Reviewed-by: Vijay Chauhan <Vijay.Chauhan@lsi.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/device_handler/scsi_dh_rdac.c

index 4efe638036f6d9d4040883757ab425ac6d42d636..e7fc70d6b478734fb2b71f34f91400d331ee8070 100644 (file)
@@ -670,12 +670,27 @@ static int rdac_activate(struct scsi_device *sdev,
 {
        struct rdac_dh_data *h = get_rdac_data(sdev);
        int err = SCSI_DH_OK;
+       int act = 0;
 
        err = check_ownership(sdev, h);
        if (err != SCSI_DH_OK)
                goto done;
 
-       if (h->lun_state == RDAC_LUN_UNOWNED) {
+       switch (h->mode) {
+       case RDAC_MODE:
+               if (h->lun_state == RDAC_LUN_UNOWNED)
+                       act = 1;
+               break;
+       case RDAC_MODE_IOSHIP:
+               if ((h->lun_state == RDAC_LUN_UNOWNED) &&
+                   (h->preferred == RDAC_PREFERRED))
+                       act = 1;
+               break;
+       default:
+               break;
+       }
+
+       if (act) {
                err = queue_mode_select(sdev, fn, data);
                if (err == SCSI_DH_OK)
                        return 0;