Re: [PATCH 4/5] ibmvfc: Suppress ABTS if target gone

2013-04-16 Thread Robert Jennings
* Brian King (brk...@linux.vnet.ibm.com) wrote:
 
 Adds support for a new VIOS feature that allows ibmvfc to
 optimize terminate_rport_io by telling the VIOS the target
 is no longer accessible on the fabric and that it should
 not send an ABTS out on the fabric to the device.
 
 Signed-off-by: Brian King brk...@linux.vnet.ibm.com
Acked-by: Robert Jennings r...@linux.vnet.ibm.com
 ---
 
  drivers/scsi/ibmvscsi/ibmvfc.c |   13 +++--
  drivers/scsi/ibmvscsi/ibmvfc.h |3 ++-
  2 files changed, 9 insertions(+), 7 deletions(-)
 
 diff -puN drivers/scsi/ibmvscsi/ibmvfc.c~ibmvfc_supress_abts 
 drivers/scsi/ibmvscsi/ibmvfc.c
 --- linux-2.6/drivers/scsi/ibmvscsi/ibmvfc.c~ibmvfc_supress_abts  
 2013-01-25 14:29:11.0 -0600
 +++ linux-2.6-bjking1/drivers/scsi/ibmvscsi/ibmvfc.c  2013-01-25 
 14:29:24.0 -0600
 @@ -2190,10 +2190,12 @@ static int ibmvfc_cancel_all(struct scsi
   tmf-common.length = sizeof(*tmf);
   tmf-scsi_id = rport-port_id;
   int_to_scsilun(sdev-lun, tmf-lun);
 + if (!(vhost-login_buf-resp.capabilities  
 IBMVFC_CAN_SUPPRESS_ABTS))
 + type = ~IBMVFC_TMF_SUPPRESS_ABTS;
   if (vhost-state == IBMVFC_ACTIVE)
   tmf-flags = (type | IBMVFC_TMF_LUA_VALID);
   else
 - tmf-flags = IBMVFC_TMF_LUA_VALID;
 + tmf-flags = ((type  IBMVFC_TMF_SUPPRESS_ABTS) | 
 IBMVFC_TMF_LUA_VALID);
   tmf-cancel_key = (unsigned long)sdev-hostdata;
   tmf-my_cancel_key = (unsigned long)starget-hostdata;
 
 @@ -2402,7 +2404,7 @@ static int ibmvfc_eh_abort_handler(struc
   cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_ABORT_TASK_SET);
   ibmvfc_abort_task_set(sdev);
   } else
 - cancel_rc = ibmvfc_cancel_all(sdev, 0);
 + cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
 
   if (!cancel_rc)
   rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
 @@ -2435,7 +2437,7 @@ static int ibmvfc_eh_device_reset_handle
   cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_LUN_RESET);
   reset_rc = ibmvfc_reset_device(sdev, IBMVFC_LUN_RESET, LUN);
   } else
 - cancel_rc = ibmvfc_cancel_all(sdev, 0);
 + cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
 
   if (!cancel_rc  !reset_rc)
   rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
 @@ -2456,7 +2458,7 @@ static int ibmvfc_eh_device_reset_handle
  static void ibmvfc_dev_cancel_all_noreset(struct scsi_device *sdev, void 
 *data)
  {
   unsigned long *rc = data;
 - *rc |= ibmvfc_cancel_all(sdev, 0);
 + *rc |= ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
  }
 
  /**
 @@ -2547,8 +2549,7 @@ static void ibmvfc_terminate_rport_io(st
   dev_rport = starget_to_rport(scsi_target(sdev));
   if (dev_rport != rport)
   continue;
 - ibmvfc_cancel_all(sdev, IBMVFC_TMF_ABORT_TASK_SET);
 - ibmvfc_abort_task_set(sdev);
 + ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
   }
 
   rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport);
 diff -puN drivers/scsi/ibmvscsi/ibmvfc.h~ibmvfc_supress_abts 
 drivers/scsi/ibmvscsi/ibmvfc.h
 --- linux-2.6/drivers/scsi/ibmvscsi/ibmvfc.h~ibmvfc_supress_abts  
 2013-01-25 14:29:11.0 -0600
 +++ linux-2.6-bjking1/drivers/scsi/ibmvscsi/ibmvfc.h  2013-01-25 
 14:29:11.0 -0600
 @@ -208,10 +208,10 @@ struct ibmvfc_npiv_login_resp {
   u16 error;
   u32 flags;
  #define IBMVFC_NATIVE_FC 0x01
 -#define IBMVFC_CAN_FLUSH_ON_HALT 0x08
   u32 reserved;
   u64 capabilities;
  #define IBMVFC_CAN_FLUSH_ON_HALT 0x08
 +#define IBMVFC_CAN_SUPPRESS_ABTS 0x10
   u32 max_cmds;
   u32 scsi_id_sz;
   u64 max_dma_len;
 @@ -351,6 +351,7 @@ struct ibmvfc_tmf {
  #define IBMVFC_TMF_LUN_RESET 0x10
  #define IBMVFC_TMF_TGT_RESET 0x20
  #define IBMVFC_TMF_LUA_VALID 0x40
 +#define IBMVFC_TMF_SUPPRESS_ABTS 0x80
   u32 cancel_key;
   u32 my_cancel_key;
   u32 pad;
 _

--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[PATCH 4/5] ibmvfc: Suppress ABTS if target gone

2013-04-12 Thread Brian King

Adds support for a new VIOS feature that allows ibmvfc to
optimize terminate_rport_io by telling the VIOS the target
is no longer accessible on the fabric and that it should
not send an ABTS out on the fabric to the device.

Signed-off-by: Brian King brk...@linux.vnet.ibm.com
---

 drivers/scsi/ibmvscsi/ibmvfc.c |   13 +++--
 drivers/scsi/ibmvscsi/ibmvfc.h |3 ++-
 2 files changed, 9 insertions(+), 7 deletions(-)

diff -puN drivers/scsi/ibmvscsi/ibmvfc.c~ibmvfc_supress_abts 
drivers/scsi/ibmvscsi/ibmvfc.c
--- linux-2.6/drivers/scsi/ibmvscsi/ibmvfc.c~ibmvfc_supress_abts
2013-01-25 14:29:11.0 -0600
+++ linux-2.6-bjking1/drivers/scsi/ibmvscsi/ibmvfc.c2013-01-25 
14:29:24.0 -0600
@@ -2190,10 +2190,12 @@ static int ibmvfc_cancel_all(struct scsi
tmf-common.length = sizeof(*tmf);
tmf-scsi_id = rport-port_id;
int_to_scsilun(sdev-lun, tmf-lun);
+   if (!(vhost-login_buf-resp.capabilities  
IBMVFC_CAN_SUPPRESS_ABTS))
+   type = ~IBMVFC_TMF_SUPPRESS_ABTS;
if (vhost-state == IBMVFC_ACTIVE)
tmf-flags = (type | IBMVFC_TMF_LUA_VALID);
else
-   tmf-flags = IBMVFC_TMF_LUA_VALID;
+   tmf-flags = ((type  IBMVFC_TMF_SUPPRESS_ABTS) | 
IBMVFC_TMF_LUA_VALID);
tmf-cancel_key = (unsigned long)sdev-hostdata;
tmf-my_cancel_key = (unsigned long)starget-hostdata;
 
@@ -2402,7 +2404,7 @@ static int ibmvfc_eh_abort_handler(struc
cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_ABORT_TASK_SET);
ibmvfc_abort_task_set(sdev);
} else
-   cancel_rc = ibmvfc_cancel_all(sdev, 0);
+   cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
 
if (!cancel_rc)
rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
@@ -2435,7 +2437,7 @@ static int ibmvfc_eh_device_reset_handle
cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_LUN_RESET);
reset_rc = ibmvfc_reset_device(sdev, IBMVFC_LUN_RESET, LUN);
} else
-   cancel_rc = ibmvfc_cancel_all(sdev, 0);
+   cancel_rc = ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
 
if (!cancel_rc  !reset_rc)
rc = ibmvfc_wait_for_ops(vhost, sdev, ibmvfc_match_lun);
@@ -2456,7 +2458,7 @@ static int ibmvfc_eh_device_reset_handle
 static void ibmvfc_dev_cancel_all_noreset(struct scsi_device *sdev, void *data)
 {
unsigned long *rc = data;
-   *rc |= ibmvfc_cancel_all(sdev, 0);
+   *rc |= ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
 }
 
 /**
@@ -2547,8 +2549,7 @@ static void ibmvfc_terminate_rport_io(st
dev_rport = starget_to_rport(scsi_target(sdev));
if (dev_rport != rport)
continue;
-   ibmvfc_cancel_all(sdev, IBMVFC_TMF_ABORT_TASK_SET);
-   ibmvfc_abort_task_set(sdev);
+   ibmvfc_cancel_all(sdev, IBMVFC_TMF_SUPPRESS_ABTS);
}
 
rc = ibmvfc_wait_for_ops(vhost, rport, ibmvfc_match_rport);
diff -puN drivers/scsi/ibmvscsi/ibmvfc.h~ibmvfc_supress_abts 
drivers/scsi/ibmvscsi/ibmvfc.h
--- linux-2.6/drivers/scsi/ibmvscsi/ibmvfc.h~ibmvfc_supress_abts
2013-01-25 14:29:11.0 -0600
+++ linux-2.6-bjking1/drivers/scsi/ibmvscsi/ibmvfc.h2013-01-25 
14:29:11.0 -0600
@@ -208,10 +208,10 @@ struct ibmvfc_npiv_login_resp {
u16 error;
u32 flags;
 #define IBMVFC_NATIVE_FC   0x01
-#define IBMVFC_CAN_FLUSH_ON_HALT   0x08
u32 reserved;
u64 capabilities;
 #define IBMVFC_CAN_FLUSH_ON_HALT   0x08
+#define IBMVFC_CAN_SUPPRESS_ABTS   0x10
u32 max_cmds;
u32 scsi_id_sz;
u64 max_dma_len;
@@ -351,6 +351,7 @@ struct ibmvfc_tmf {
 #define IBMVFC_TMF_LUN_RESET   0x10
 #define IBMVFC_TMF_TGT_RESET   0x20
 #define IBMVFC_TMF_LUA_VALID   0x40
+#define IBMVFC_TMF_SUPPRESS_ABTS   0x80
u32 cancel_key;
u32 my_cancel_key;
u32 pad;
_

--
To unsubscribe from this list: send the line unsubscribe linux-scsi in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html