[PATCH] scsi: ibmvscsi: protect abort handler from done-scmd in flight

2014-06-05 Thread Liu Ping Fan
Take the following scene in guest:
seqA: scsi_done() - gapX (before taking REQ_ATOM_COMPLETE)
seqB: scmd_eh_abort_handler()- ...- ibmvscsi_eh_abort_handler()-
  ...-scsi_put_command(scmd)

If seqA is scheduled at gapX, and seqB reclaims scmd. Then when seqA
comes back, it tries to access the scmd when is turned back to mempool.

This patch fixes the race by ensuring when ibmvscsi_eh_abort_handler()
returns, no scsi_done is in flight

Signed-off-by: Liu Ping Fan pingf...@linux.vnet.ibm.com
---
When trying to figure the scsi_cmnd in flight issue, I learned from Paolo 
(thanks).
He showed me the way how virtscsi resolves the race between abort-handler
and scsi_done in flight. And I think that this method is also needed by 
ibmvscsi.
---
 drivers/scsi/ibmvscsi/ibmvscsi.c | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index fa76440..325cef6 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -1828,16 +1828,19 @@ static void ibmvscsi_handle_crq(struct viosrp_crq *crq,
 
if ((crq-status != VIOSRP_OK  crq-status != VIOSRP_OK2)  
evt_struct-cmnd)
evt_struct-cmnd-result = DID_ERROR  16;
-   if (evt_struct-done)
-   evt_struct-done(evt_struct);
-   else
-   dev_err(hostdata-dev, returned done() is NULL; not running 
it!\n);
 
/*
 * Lock the host_lock before messing with these structures, since we
 * are running in a task context
+* Also, this lock helps ibmvscsi_eh_abort_handler() to shield the
+* scsi_done() in flight.
 */
spin_lock_irqsave(evt_struct-hostdata-host-host_lock, flags);
+   if (evt_struct-done)
+   evt_struct-done(evt_struct);
+   else
+   dev_err(hostdata-dev, returned done() is NULL; not running 
it!\n);
+
list_del(evt_struct-list);
free_event_struct(evt_struct-hostdata-pool, evt_struct);
spin_unlock_irqrestore(evt_struct-hostdata-host-host_lock, flags);
-- 
1.8.1.4

--
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


Re: [PATCH] scsi: bfa: bfad_attr.c: Optimization of the Code

2014-06-05 Thread Bart Van Assche
On 06/04/14 20:08, Rickard Strandqvist wrote:
 Minimized the use of snprintf()
 And removed a variable that was only used for the temporary storage.
 
 This was partly found using a static code analysis program called cppcheck.
 
 Signed-off-by: Rickard Strandqvist rickard_strandqv...@spectrumdigital.se
 ---
  drivers/scsi/bfa/bfad_attr.c |   14 --
  1 file changed, 8 insertions(+), 6 deletions(-)
 
 diff --git a/drivers/scsi/bfa/bfad_attr.c b/drivers/scsi/bfa/bfad_attr.c
 index 40be670..5f5917a 100644
 --- a/drivers/scsi/bfa/bfad_attr.c
 +++ b/drivers/scsi/bfa/bfad_attr.c
 @@ -839,12 +839,10 @@ bfad_im_symbolic_name_show(struct device *dev, struct 
 device_attribute *attr,
   (struct bfad_im_port_s *) shost-hostdata[0];
   struct bfad_s *bfad = im_port-bfad;
   struct bfa_lport_attr_s port_attr;
 - char symname[BFA_SYMNAME_MAXLEN];
  
   bfa_fcs_lport_get_attr(bfad-bfa_fcs.fabric.bport, port_attr);
 - strncpy(symname, port_attr.port_cfg.sym_name.symname,
 - BFA_SYMNAME_MAXLEN);
 - return snprintf(buf, PAGE_SIZE, %s\n, symname);
 + return snprintf(buf, PAGE_SIZE, %s\n,
 + port_attr.port_cfg.sym_name.symname);
  }
  
  static ssize_t
 @@ -865,7 +863,9 @@ static ssize_t
  bfad_im_drv_version_show(struct device *dev, struct device_attribute *attr,
   char *buf)
  {
 - return snprintf(buf, PAGE_SIZE, %s\n, BFAD_DRIVER_VERSION);
 + strncpy(buf, BFAD_DRIVER_VERSION  \n , PAGE_SIZE);
 + buf[PAGE_SIZE - 1] = '\0';
 + return strlen(buf);
  }
  
  static ssize_t
 @@ -913,7 +913,9 @@ static ssize_t
  bfad_im_drv_name_show(struct device *dev, struct device_attribute *attr,
   char *buf)
  {
 - return snprintf(buf, PAGE_SIZE, %s\n, BFAD_DRIVER_NAME);
 + strncpy(buf, BFAD_DRIVER_NAME  \n , PAGE_SIZE);
 + buf[PAGE_SIZE - 1] = '\0';
 + return strlen(buf);
  }

This is ugly. Please use sprintf(buf, %.*s\n, PAGE_SIZE - 1, str)
instead of strncpy() + strlen().

Bart.

--
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


Re: [PATCH] scsi: bfa: bfad_attr.c: Optimization of the Code

2014-06-05 Thread Bart Van Assche
On 06/05/14 08:55, Bart Van Assche wrote:
 On 06/04/14 20:08, Rickard Strandqvist wrote:
 This is ugly. Please use sprintf(buf, %.*s\n, PAGE_SIZE - 1, str)
 instead of strncpy() + strlen().

(replying to my own e-mail)

The above should of course have read sprintf(buf, %.*s\n, PAGE_SIZE -
2, str) to avoid that the terminating '\0' triggers a buffer overflow.

Bart.
--
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 2/2] scsi: Handle power-on reset unit attention

2014-06-05 Thread Hannes Reinecke
As per SAM there is a status precedence, with any sense code 29/XX
taking second place just after an ACA ACTIVE status.
Additionally, each target might prefer to not queue any unit
attention conditions but just report one.
Due to the above this will be that one with the highest precedence.
This results in the sense code 29/XX effectively overwriting any
other unit attention.
Hence we should report the power-on reset to userland so that
it can take appropriate action.

Signed-off-by: Hannes Reinecke h...@suse.de
---
 drivers/scsi/scsi_error.c  | 6 ++
 drivers/scsi/scsi_lib.c| 4 
 include/scsi/scsi_device.h | 3 ++-
 3 files changed, 12 insertions(+), 1 deletion(-)

diff --git a/drivers/scsi/scsi_error.c b/drivers/scsi/scsi_error.c
index 47a1ffc..65ed333 100644
--- a/drivers/scsi/scsi_error.c
+++ b/drivers/scsi/scsi_error.c
@@ -420,6 +420,12 @@ static void scsi_report_sense(struct scsi_device *sdev,
threshold.\n);
}
 
+   if (sshdr-asc == 0x29) {
+   evt_type = SDEV_EVT_POWER_ON_RESET_OCCURRED;
+   sdev_printk(KERN_WARNING, sdev,
+   Power-on or device reset occurred\n);
+   }
+
if (sshdr-asc == 0x2a  sshdr-ascq == 0x01) {
evt_type = SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED;
sdev_printk(KERN_WARNING, sdev,
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 9f841df..ee158c1 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -2183,6 +2183,9 @@ static void scsi_evt_emit(struct scsi_device *sdev, 
struct scsi_event *evt)
case SDEV_EVT_LUN_CHANGE_REPORTED:
envp[idx++] = SDEV_UA=REPORTED_LUNS_DATA_HAS_CHANGED;
break;
+   case SDEV_EVT_POWER_ON_RESET_OCCURRED:
+   envp[idx++] = SDEV_UA=POWER_ON_RESET_OCCURRED;
+   break;
default:
/* do nothing */
break;
@@ -2286,6 +2289,7 @@ struct scsi_event *sdev_evt_alloc(enum scsi_device_event 
evt_type,
case SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED:
case SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED:
case SDEV_EVT_LUN_CHANGE_REPORTED:
+   case SDEV_EVT_POWER_ON_RESET_OCCURRED:
default:
/* do nothing */
break;
diff --git a/include/scsi/scsi_device.h b/include/scsi/scsi_device.h
index 5853c91..7b9a886 100644
--- a/include/scsi/scsi_device.h
+++ b/include/scsi/scsi_device.h
@@ -57,9 +57,10 @@ enum scsi_device_event {
SDEV_EVT_SOFT_THRESHOLD_REACHED_REPORTED,   /* 38 07  UA reported */
SDEV_EVT_MODE_PARAMETER_CHANGE_REPORTED,/* 2A 01  UA reported */
SDEV_EVT_LUN_CHANGE_REPORTED,   /* 3F 0E  UA reported */
+   SDEV_EVT_POWER_ON_RESET_OCCURRED,   /* 29 00  UA reported */
 
SDEV_EVT_FIRST  = SDEV_EVT_MEDIA_CHANGE,
-   SDEV_EVT_LAST   = SDEV_EVT_LUN_CHANGE_REPORTED,
+   SDEV_EVT_LAST   = SDEV_EVT_POWER_ON_RESET_OCCURRED,
 
SDEV_EVT_MAXBITS= SDEV_EVT_LAST + 1
 };
-- 
1.7.12.4

--
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 1/2] scsi_scan: Send TEST UNIT READY to the LUN before scanning

2014-06-05 Thread Hannes Reinecke
REPORT_LUN_SCAN does not report any outstanding unit attention
condition as per SAM. However, the target might not be fully
initialized at that time, so we might end up getting a
default entry (or even a partially filled one).
But as we're not able to process the REPORT LUN DATA HAS CHANGED
unit attention correctly we'll be missing out some LUNs during
startup.
So it's better to send a TEST UNIT READY for modern implementations
and wait until the unit attention condition goes away.

Signed-off-by: Hannes Reinecke h...@suse.de
---
 drivers/scsi/scsi_scan.c | 86 
 1 file changed, 73 insertions(+), 13 deletions(-)

diff --git a/drivers/scsi/scsi_scan.c b/drivers/scsi/scsi_scan.c
index e02b3aa..a8e59c3 100644
--- a/drivers/scsi/scsi_scan.c
+++ b/drivers/scsi/scsi_scan.c
@@ -123,6 +123,13 @@ MODULE_PARM_DESC(inq_timeout,
 Timeout (in seconds) waiting for devices to answer INQUIRY.
  Default is 20. Some devices may need more; most need less.);
 
+static unsigned int scsi_scan_timeout = SCSI_TIMEOUT/HZ + 58;
+
+module_param_named(scan_timeout, scsi_scan_timeout, uint, S_IRUGO|S_IWUSR);
+MODULE_PARM_DESC(scan_timeout,
+Timeout (in seconds) waiting for devices to become ready
+ after INQUIRY. Default is 60.);
+
 /* This lock protects only this list */
 static DEFINE_SPINLOCK(async_scan_lock);
 static LIST_HEAD(scanning_hosts);
@@ -712,19 +719,6 @@ static int scsi_probe_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
}
 
/*
-* Related to the above issue:
-*
-* XXX Devices (disk or all?) should be sent a TEST UNIT READY,
-* and if not ready, sent a START_STOP to start (maybe spin up) and
-* then send the INQUIRY again, since the INQUIRY can change after
-* a device is initialized.
-*
-* Ideally, start a device if explicitly asked to do so.  This
-* assumes that a device is spun up on power on, spun down on
-* request, and then spun up on request.
-*/
-
-   /*
 * The scanning code needs to know the scsi_level, even if no
 * device is attached at LUN 0 (SCSI_SCAN_TARGET_PRESENT) so
 * non-zero LUNs can be scanned.
@@ -739,6 +733,65 @@ static int scsi_probe_lun(struct scsi_device *sdev, 
unsigned char *inq_result,
 }
 
 /**
+ * scsi_test_lun - waiting for a LUN to become ready
+ * @sdev:  scsi_device to test
+ *
+ * Description:
+ * Wait for the lun associated with @sdev to become ready
+ *
+ * Send a TEST UNIT READY to detect any unit attention conditions.
+ * Retry TEST UNIT READY for up to @scsi_scan_timeout if the
+ * returned sense key is 02/04/01 (Not ready, Logical Unit is
+ * in process of becoming ready)
+ **/
+static int
+scsi_test_lun(struct scsi_device *sdev)
+{
+   struct scsi_sense_hdr sshdr;
+   int res = SCSI_SCAN_TARGET_PRESENT;
+   int tur_result;
+   unsigned long tur_timeout = jiffies + scsi_scan_timeout * HZ;
+
+   /* Skip for older devices */
+   if (sdev-scsi_level = SCSI_3)
+   return SCSI_SCAN_LUN_PRESENT;
+
+   /*
+* Wait for the device to become ready.
+*
+* Some targets take some time before the firmware is
+* fully initialized, during which time they might not
+* be able to fill out any REPORT_LUN command correctly.
+* And as we're not capable of handling the
+* INQUIRY DATA CHANGED unit attention correctly we'd
+* rather wait here.
+*/
+   do {
+   tur_result = scsi_test_unit_ready(sdev, SCSI_TIMEOUT,
+ 3, sshdr);
+   if (!tur_result) {
+   res = SCSI_SCAN_LUN_PRESENT;
+   break;
+   }
+   if ((driver_byte(tur_result)  DRIVER_SENSE) 
+   scsi_sense_valid(sshdr)) {
+   SCSI_LOG_SCAN_BUS(3, sdev_printk(KERN_INFO, sdev,
+   scsi_scan: tur returned %02x/%02x/%02x\n,
+   sshdr.sense_key, sshdr.asc, sshdr.ascq));
+   if (sshdr.sense_key == NOT_READY 
+   sshdr.asc == 0x04  sshdr.ascq == 0x01) {
+   /* Logical Unit is in process
+* of becoming ready */
+   msleep(100);
+   continue;
+   }
+   }
+   res = SCSI_SCAN_LUN_PRESENT;
+   } while (time_before_eq(jiffies, tur_timeout));
+   return res;
+}
+
+/**
  * scsi_add_lun - allocate and fully initialze a scsi_device
  * @sdev:  holds information to be stored in the new scsi_device
  * @inq_result:holds the result of a previous INQUIRY to the LUN
@@ -1142,6 +1195,13 @@ static int scsi_probe_and_add_lun(struct 

[PATCH 0/2] scanning fixes

2014-06-05 Thread Hannes Reinecke
Hi all,

here are two fixes for the scanning logic which resolve two long-standing
issues:

1) We need to send a 'TEST UNIT READY' to the LUN before scanning.
The INQUIRY command does _not_ clear any unit attentions,
so if there are any outstanding unit attention conditions they'll
be attached to the first command after INQUIRY.
Which typically wouldn't be too bad, as most of the commands
are now equipped with at least rudimentary error checking.
However, the problem arises when we're sending a REPORT LUN command
to that LUN. As per spec the REPORT LUN command will _always_
return something, but the list might not be fully populated if
the firmware is still starting up (see SPC for details here).
This will cause us to miss some devices during startup.
Added to that we're not handling the unit attention
'REPORT LUN DATA HAS CHANGED', so the kernel will never be
able to rescan all disks.
To fix this we should be issuing a TEST UNIT READY after
INQUIRY, and wait until any pending unit attention goes away.

2) Power-on/Reset handling
While we're not sending out uevents for various unit attention
conditions, we fail to observe the status precedence as per SAM.
This might cause any 29/XX sense code to effectively overwrite
any preceding unit attentions, causing us to miss those events.
Hence as a minimal fix we need to report the power-on reset
event via uevents, too.

Hannes Reinecke (2):
  scsi_scan: Send TEST UNIT READY to the LUN before scanning
  scsi: Handle power-on reset unit attention

 drivers/scsi/scsi_error.c  |  6 
 drivers/scsi/scsi_lib.c|  4 +++
 drivers/scsi/scsi_scan.c   | 86 +++---
 include/scsi/scsi_device.h |  3 +-
 4 files changed, 85 insertions(+), 14 deletions(-)

-- 
1.7.12.4

--
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


Re: [PATCH] scsi: ibmvscsi: protect abort handler from done-scmd in flight

2014-06-05 Thread Paolo Bonzini

Il 05/06/2014 08:16, Liu Ping Fan ha scritto:

Take the following scene in guest:
seqA: scsi_done() - gapX (before taking REQ_ATOM_COMPLETE)
seqB: scmd_eh_abort_handler()- ...- ibmvscsi_eh_abort_handler()-
  ...-scsi_put_command(scmd)

If seqA is scheduled at gapX, and seqB reclaims scmd. Then when seqA
comes back, it tries to access the scmd when is turned back to mempool.

This patch fixes the race by ensuring when ibmvscsi_eh_abort_handler()
returns, no scsi_done is in flight

Signed-off-by: Liu Ping Fan pingf...@linux.vnet.ibm.com
---
When trying to figure the scsi_cmnd in flight issue, I learned from Paolo 
(thanks).
He showed me the way how virtscsi resolves the race between abort-handler
and scsi_done in flight. And I think that this method is also needed by 
ibmvscsi.
---
 drivers/scsi/ibmvscsi/ibmvscsi.c | 11 +++
 1 file changed, 7 insertions(+), 4 deletions(-)

diff --git a/drivers/scsi/ibmvscsi/ibmvscsi.c b/drivers/scsi/ibmvscsi/ibmvscsi.c
index fa76440..325cef6 100644
--- a/drivers/scsi/ibmvscsi/ibmvscsi.c
+++ b/drivers/scsi/ibmvscsi/ibmvscsi.c
@@ -1828,16 +1828,19 @@ static void ibmvscsi_handle_crq(struct viosrp_crq *crq,

if ((crq-status != VIOSRP_OK  crq-status != VIOSRP_OK2)  
evt_struct-cmnd)
evt_struct-cmnd-result = DID_ERROR  16;
-   if (evt_struct-done)
-   evt_struct-done(evt_struct);
-   else
-   dev_err(hostdata-dev, returned done() is NULL; not running 
it!\n);

/*
 * Lock the host_lock before messing with these structures, since we
 * are running in a task context
+* Also, this lock helps ibmvscsi_eh_abort_handler() to shield the
+* scsi_done() in flight.
 */
spin_lock_irqsave(evt_struct-hostdata-host-host_lock, flags);
+   if (evt_struct-done)
+   evt_struct-done(evt_struct);
+   else
+   dev_err(hostdata-dev, returned done() is NULL; not running 
it!\n);
+
list_del(evt_struct-list);
free_event_struct(evt_struct-hostdata-pool, evt_struct);
spin_unlock_irqrestore(evt_struct-hostdata-host-host_lock, flags);



I think this is not necessary because ibmvscsi places TMFs and commands 
in the same queue; virtio-scsi instead uses two different queues.


So ibmvscsi_handle_crq processes all completed requests, which naturally 
serializes the processing of the TMF and the command.


Paolo
--
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


Re: [PATCH v2] sg: add SG_FLAG_Q_AT_TAIL flag

2014-06-05 Thread Christoph Hellwig
On Wed, Jun 04, 2014 at 10:58:30AM -0400, Douglas Gilbert wrote:
 When the SG_IO ioctl was copied into the block layer and
 later into the bsg driver, subtle differences emerged.
 
 One difference is the way injected commands are queued through
 the block layer (i.e. this is not SCSI device queueing nor SATA
 NCQ). Summarizing:
   - SG_IO in the block layer: blk_exec*(at_head=false)
   - sg SG_IO: at_head=true
   - bsg SG_IO: at_head=true
 
 Some time ago Boaz Harrosh introduced a sg v4 flag called
 BSG_FLAG_Q_AT_TAIL to override the bsg driver default.
 This patch does the equivalent for the sg driver.

Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de

Any chance to get a patch for the block-layer SG_IO code, too?

--
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


Re: [PATCH 1/7] mptfusion: mark file-private functions as static

2014-06-05 Thread Christoph Hellwig
Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de
--
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


Re: [PATCH 2/7] mptfusion: remove redundant kfree checks

2014-06-05 Thread Christoph Hellwig
Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de
--
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


Re: [PATCH 3/7] mptfusion: initChainBuffers should return errno

2014-06-05 Thread Christoph Hellwig
On Wed, Jun 04, 2014 at 12:49:45PM -0400, Joe Lawrence wrote:
 The lone caller of initChainBuffers checks the return code for  0, so
 it is safe to appease smatch and return the proper errno value.

I don't think this is useful on it's own as the whole callchain around
it uses the same -1 for error convention.  Returning proper errnos
seems useful to me, but without converting the whole chain it would
just introduce more inconsistencies.

--
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


Re: [PATCH 4/7] mptfusion: zero kernel-space source of copy_to_user

2014-06-05 Thread Christoph Hellwig
On Wed, Jun 04, 2014 at 12:58:36PM -0400, Joe Lawrence wrote:
 Hi Dan,
 
 kzalloc silenced that smatch warning, but the code looks like:
 
   (calculate data_size)
   ...
   karg = kmalloc(data_size, GFP_KERNEL);
   ...
   if (copy_from_user(karg, uarg, data_size)) {
   ...
   if (copy_to_user((char __user *)arg, karg, data_size)) {
 
 where 'data_size' once calculated, is unchanged.  Since the size
 allocated is the same copied from the user and the same copied back out
 to the user, would this really be considered an info leak?

I think the stastic checker is wrong here.  But the code would still
benefit from switching to memdup_user, which should shut up the checker
in addition to simplifying the code.

--
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


Re: [PATCH 5/7] mptfusion: make adapter prod_name[] a pointer

2014-06-05 Thread Christoph Hellwig
On Wed, Jun 04, 2014 at 12:51:55PM -0400, Joe Lawrence wrote:
 The struct _MPT_ADAPTER doesn't need a full copy of the product string,
 so prod_name can point to the string literal storage that the driver
 already provides.
 
 Avoids the following sparse warning:
 
   drivers/message/fusion/mptbase.c:2858 MptDisplayIocCapabilities()
 warn: this array is probably non-NULL. 'ioc-prod_name'

Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de
--
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


Re: [PATCH 6/7] mptfusion: combine fw_event_work and its event_data

2014-06-05 Thread Christoph Hellwig
  
 - sz = offsetof(struct fw_event_work, event_data) +
 - sizeof(MpiEventDataSasDeviceStatusChange_t);
 + sz = sizeof(*fw_event) +
 + sizeof(MpiEventDataSasDeviceStatusChange_t);
   fw_event = kzalloc(sz, GFP_ATOMIC);

Seems like there is no point in keeping the sz variable here and at
the other occurances.  Not that it really matters, but if we make a pass
over this code we might as well fix that up, too.

 - sz = offsetof(struct fw_event_work, event_data);
 + sz = sizeof(*fw_event);

Eww, using offsetoff for an allocation size.  Good riddance that this
gets sorted out.

Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de
--
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


Re: [PATCH 7/7] mptfusion: tweak null pointer checks

2014-06-05 Thread Christoph Hellwig
 JL: Comments on the above warnings, in order:

Can you move these comments into the actual commit message instead of
the part that gets discarded?
 
 No-brainer, the enclosing switch statement dereferences 'reply',
 so we can't get here unless 'reply' is valid.

ok.

 Retry target reset needs to know the target ID and channel, so
 enclose that entire block inside a if (pScsiTmReply) block.

Reading the code in mptsas_taskmgmt_complete it's pretty obvious
that it can't do anything useful if mr/pScsiTmReply are NULL, so I
suspect it would be best to just return at the beginning of the
function.

I'd love to understand if it actually could ever be zero, which I doubt.
Maybe the LSI people can shed some light on that?

 The code before the loop checks for 'port_info-phy_info', but not
 many other places in the driver bother.  Not sure what to do here.

It's pretty obvious from reading mptsas_sas_io_unit_pg0 that we never
register a port_info with a NULL phy_info in the lists, so all NULL
checks on it could be deleted.

 'hostdata' is checked and then immediately dereferenced after
 that block.  How about a default return string of N/A to indicate
 one isn't available? 

shost_priv can't return NULL, so the if (h) should be removed.

 Not sure what to do here.  'vdevice' is needed to set up the
 message frame target ID and channel, so it should probably return
 an error in in this case.

vdevice can't ever be NULL here, it's allocated in -slave_alloc and
thus guaranteed to be around when -queuecommand is called.

--
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


Re: [PATCH v3 1/6] virtio_scsi: remove ACCESS_ONCE() and smp_read_barrier_depends()

2014-06-05 Thread Christoph Hellwig
On Wed, Jun 04, 2014 at 01:34:54PM +0200, Paolo Bonzini wrote:
 From: Ming Lei tom.leim...@gmail.com
 
 Access to tgt-req_vq is strictly serialized by spin_lock
 of tgt-tgt_lock, so the ACCESS_ONCE() isn't necessary.
 
 smp_read_barrier_depends() in virtscsi_req_done was introduced
 to order reading req_vq and decreasing tgt-reqs, but it isn't
 needed now because req_vq is read from
 scsi-req_vqs[vq-index - VIRTIO_SCSI_VQ_BASE] instead of
 tgt-req_vq, so remove the unnecessary barrier.
 
 Also remove related comment about the barrier.

Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de
--
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


Re: [PATCH v3 4/6] scsi_error: fix invalid setting of host byte

2014-06-05 Thread Christoph Hellwig
On Wed, Jun 04, 2014 at 01:34:57PM +0200, Paolo Bonzini wrote:
 From: Ulrich Obergfell uober...@redhat.com
 
 After scsi_try_to_abort_cmd returns, the eh_abort_handler may have
 already found that the command has completed in the device, causing
 the host_byte to be nonzero (e.g. it could be DID_ABORT).  When
 this happens, ORing DID_TIME_OUT into the host byte will corrupt
 the result field and initiate an unwanted command retry.
 
 Fix this by using set_host_byte instead, following the model of
 commit 2082ebc45af9c9c648383b8cde0dc1948eadbf31.
 
 Cc: sta...@vger.kernel.org
 Signed-off-by: Ulrich Obergfell uober...@redhat.com
 [Fix all instances according to review comments. - Paolo]
 Signed-off-by: Paolo Bonzini pbonz...@redhat.com

Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de
--
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


Re: [PATCH v3 3/6] virtio-scsi: avoid cancelling uninitialized work items

2014-06-05 Thread Christoph Hellwig
On Wed, Jun 04, 2014 at 01:34:56PM +0200, Paolo Bonzini wrote:
 Calling the workqueue interface on uninitialized work items isn't a
 good idea even if they're zeroed. It's not failing catastrophically only
 through happy accidents.
 
 Signed-off-by: Paolo Bonzini pbonz...@redhat.com

Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de
--
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


[Resend PATCH V1 4/4] scsi: ufs: Fix queue depth handling for best effort cases

2014-06-05 Thread Dolev Raviv
From: Sujit Reddy Thumma sthu...@codeaurora.org

Some UFS devices may expose bLUQueueDepth field as zero indicating
that the queue depth depends on the number of resources available
for LUN at a particular instant to handle the outstanding transfer
requests. Currently, when response for SCSI command is TASK_FULL
the LLD decrements the queue depth but fails to increment when the
resources are available. The scsi mid-layer handles the change in
queue depth heuristically and offers simple interface with
-change_queue_depth.

Signed-off-by: Sujit Reddy Thumma sthu...@codeaurora.org
Signed-off-by: Dolev Raviv dra...@codeaurora.org
---
 drivers/scsi/ufs/ufshcd.c | 97 ---
 1 file changed, 42 insertions(+), 55 deletions(-)

diff --git a/drivers/scsi/ufs/ufshcd.c b/drivers/scsi/ufs/ufshcd.c
index b301ed8..b103e95 100644
--- a/drivers/scsi/ufs/ufshcd.c
+++ b/drivers/scsi/ufs/ufshcd.c
@@ -1991,27 +1991,55 @@ static int ufshcd_slave_alloc(struct scsi_device *sdev)
 
/* allow SCSI layer to restart the device in case of errors */
sdev-allow_restart = 1;
+
lun_qdepth = ufshcd_read_sdev_qdepth(hba, sdev);
-   if (lun_qdepth == 0 || lun_qdepth  hba-nutrs) {
-   dev_info(hba-dev, %s, lun %d queue depth is %d\n, __func__,
-   sdev-lun, lun_qdepth);
+   if (lun_qdepth = 0)
+   /* eventually, we can figure out the real queue depth */
lun_qdepth = hba-nutrs;
-   } else if (lun_qdepth  0) {
-   lun_qdepth = 1;
-   }
+   else
+   lun_qdepth = min_t(int, lun_qdepth, hba-nutrs);
 
-   /*
-* Inform SCSI Midlayer that the LUN queue depth is same as the
-* controller queue depth. If a LUN queue depth is less than the
-* controller queue depth and if the LUN reports
-* SAM_STAT_TASK_SET_FULL, the LUN queue depth will be adjusted
-* with scsi_adjust_queue_depth.
-*/
+   dev_dbg(hba-dev, %s: activate tcq with queue depth %d\n,
+   __func__, lun_qdepth);
scsi_activate_tcq(sdev, lun_qdepth);
+
return 0;
 }
 
 /**
+ * ufshcd_change_queue_depth - change queue depth
+ * @sdev: pointer to SCSI device
+ * @depth: required depth to set
+ * @reason: reason for changing the depth
+ *
+ * Change queue depth according to the reason and make sure
+ * the max. limits are not crossed.
+ */
+int ufshcd_change_queue_depth(struct scsi_device *sdev, int depth, int reason)
+{
+   struct ufs_hba *hba = shost_priv(sdev-host);
+
+   if (depth  hba-nutrs)
+   depth = hba-nutrs;
+
+   switch (reason) {
+   case SCSI_QDEPTH_DEFAULT:
+   case SCSI_QDEPTH_RAMP_UP:
+   if (!sdev-tagged_supported)
+   depth = 1;
+   scsi_adjust_queue_depth(sdev, scsi_get_tag_type(sdev), depth);
+   break;
+   case SCSI_QDEPTH_QFULL:
+   scsi_track_queue_full(sdev, depth);
+   break;
+   default:
+   return -EOPNOTSUPP;
+   }
+
+   return depth;
+}
+
+/**
  * ufshcd_slave_destroy - remove SCSI device configurations
  * @sdev: pointer to SCSI device
  */
@@ -2064,42 +2092,6 @@ static int ufshcd_task_req_compl(struct ufs_hba *hba, 
u32 index, u8 *resp)
 }
 
 /**
- * ufshcd_adjust_lun_qdepth - Update LUN queue depth if device responds with
- *   SAM_STAT_TASK_SET_FULL SCSI command status.
- * @cmd: pointer to SCSI command
- */
-static void ufshcd_adjust_lun_qdepth(struct scsi_cmnd *cmd)
-{
-   struct ufs_hba *hba;
-   int i;
-   int lun_qdepth = 0;
-
-   hba = shost_priv(cmd-device-host);
-
-   /*
-* LUN queue depth can be obtained by counting outstanding commands
-* on the LUN.
-*/
-   for (i = 0; i  hba-nutrs; i++) {
-   if (test_bit(i, hba-outstanding_reqs)) {
-
-   /*
-* Check if the outstanding command belongs
-* to the LUN which reported SAM_STAT_TASK_SET_FULL.
-*/
-   if (cmd-device-lun == hba-lrb[i].lun)
-   lun_qdepth++;
-   }
-   }
-
-   /*
-* LUN queue depth will be total outstanding commands, except the
-* command for which the LUN reported SAM_STAT_TASK_SET_FULL.
-*/
-   scsi_adjust_queue_depth(cmd-device, MSG_SIMPLE_TAG, lun_qdepth - 1);
-}
-
-/**
  * ufshcd_scsi_cmd_status - Update SCSI command result based on SCSI status
  * @lrb: pointer to local reference block of completed command
  * @scsi_status: SCSI command status
@@ -2120,12 +2112,6 @@ ufshcd_scsi_cmd_status(struct ufshcd_lrb *lrbp, int 
scsi_status)
  scsi_status;
break;
case SAM_STAT_TASK_SET_FULL:
-   /*
-* If a LUN reports SAM_STAT_TASK_SET_FULL, then the LUN 

[PATCH V1 0/4] LU queue depth manament

2014-06-05 Thread Dolev Raviv
Resending patch 4, to fix the author.

Some UFS devices don't support a LUN queue depth same as the device queue
depth. This requires reading the unit descriptor for extracting the LU's
queue depth.

Dolev Raviv (1):
  scsi: ufs: query descriptor API
  scsi: ufs: device query status and size check
  scsi: ufs: Logical Unit (LU) command queue depth

Sujit Reddy Thumma (1):
  scsi: ufs: Fix queue depth handling for best effort cases

 drivers/scsi/ufs/ufs.h|  38 +-
 drivers/scsi/ufs/ufshcd.c | 318 --
 2 files changed, 261 insertions(+), 95 deletions(-)

-- 
1.8.5.2

-- 
QUALCOMM ISRAEL, on behalf of Qualcomm Innovation Center, Inc. is a member
of Code Aurora Forum, hosted by The Linux Foundation

--
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


Re: [PATCH v5] sg: relax 16 byte cdb restriction

2014-06-05 Thread Christoph Hellwig
Looks good,

Reviewed-by: Christoph Hellwig h...@lst.de

--
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] block SG_IO: add SG_FLAG_Q_AT_HEAD flag

2014-06-05 Thread Douglas Gilbert

After the SG_IO ioctl was copied into the block layer and
later into the bsg driver, subtle differences emerged.

One difference is the way injected commands are queued through
the block layer (i.e. this is not SCSI device queueing nor SATA
NCQ). Summarizing:
  - SG_IO on block layer device: blk_exec*(at_head=false)
  - sg device SG_IO: at_head=true
  - bsg device SG_IO: at_head=true

Some time ago Boaz Harrosh introduced a sg v4 flag called
BSG_FLAG_Q_AT_TAIL to override the bsg driver default. A
recent patch titled: sg: add SG_FLAG_Q_AT_TAIL flag
allowed the sg driver default to be overridden. This patch
allows a SG_IO ioctl sent to a block layer device to have
its default overridden.

ChangeLog:
- introduce SG_FLAG_Q_AT_HEAD flag in sg.h to cause
  commands that are injected via a block layer
  device SG_IO ioctl to set at_head=true
- make comments clearer about queueing in sg.h since the
  header is used both by the sg device and block layer
  device implementations of the SG_IO ioctl.
- introduce BSG_FLAG_Q_AT_HEAD in bsg.h for compatibility
  (it does nothing) and update comments.


Signed-off-by: Douglas Gilbert dgilb...@interlog.com
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
index 2648797..e49b7ef 100644
--- a/block/scsi_ioctl.c
+++ b/block/scsi_ioctl.c
@@ -288,6 +288,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
 	unsigned long start_time;
 	ssize_t ret = 0;
 	int writing = 0;
+	int at_head = 0;
 	struct request *rq;
 	char sense[SCSI_SENSE_BUFFERSIZE];
 	struct bio *bio;
@@ -311,6 +312,8 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
 		case SG_DXFER_FROM_DEV:
 			break;
 		}
+	if (hdr-flags  SG_FLAG_Q_AT_HEAD)
+		at_head = 1;
 
 	rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL);
 	if (!rq)
@@ -366,7 +369,7 @@ static int sg_io(struct request_queue *q, struct gendisk *bd_disk,
 	 * (if he doesn't check that is his problem).
 	 * N.B. a non-zero SCSI status is _not_ necessarily an error.
 	 */
-	blk_execute_rq(q, bd_disk, rq, 0);
+	blk_execute_rq(q, bd_disk, rq, at_head);
 
 	hdr-duration = jiffies_to_msecs(jiffies - start_time);
 
diff --git a/include/scsi/sg.h b/include/scsi/sg.h
index 9859355..750e5db 100644
--- a/include/scsi/sg.h
+++ b/include/scsi/sg.h
@@ -86,7 +86,9 @@ typedef struct sg_io_hdr
 #define SG_FLAG_MMAP_IO 4   /* request memory mapped IO */
 #define SG_FLAG_NO_DXFER 0x1 /* no transfer of kernel buffers to/from */
 /* user space (debug indirect IO) */
-#define SG_FLAG_Q_AT_TAIL 0x10  /* default is Q_AT_HEAD */
+/* defaults:: for sg driver: Q_AT_HEAD; for block layer: Q_AT_TAIL */
+#define SG_FLAG_Q_AT_TAIL 0x10
+#define SG_FLAG_Q_AT_HEAD 0x20
 
 /* following 'info' values are or-ed together */
 #define SG_INFO_OK_MASK 0x1
diff --git a/include/uapi/linux/bsg.h b/include/uapi/linux/bsg.h
index 7a12e1c..02986cf 100644
--- a/include/uapi/linux/bsg.h
+++ b/include/uapi/linux/bsg.h
@@ -10,12 +10,13 @@
 #define BSG_SUB_PROTOCOL_SCSI_TRANSPORT	2
 
 /*
- * For flags member below
- * sg.h sg_io_hdr also has bits defined for it's flags member. However
- * none of these bits are implemented/used by bsg. The bits below are
- * allocated to not conflict with sg.h ones anyway.
+ * For flag constants below:
+ * sg.h sg_io_hdr also has bits defined for it's flags member. These
+ * two flag values (0x10 and 0x20) have the same meaning in sg.h . For
+ * bsg the BSG_FLAG_Q_AT_HEAD flag is ignored since it is the deafult.
  */
-#define BSG_FLAG_Q_AT_TAIL 0x10 /* default, == 0 at this bit, is Q_AT_HEAD */
+#define BSG_FLAG_Q_AT_TAIL 0x10 /* default is Q_AT_HEAD */
+#define BSG_FLAG_Q_AT_HEAD 0x20
 
 struct sg_io_v4 {
 	__s32 guard;		/* [i] 'Q' to differentiate from v3 */


Re: [PATCH] block SG_IO: add SG_FLAG_Q_AT_HEAD flag

2014-06-05 Thread Christoph Hellwig
This would be something for Jens to pick up.

Looks good to me,

Reviewed-by: Christoph Hellwig h...@lst.de

Next step would be to switch to the same default for all
implementations..

On Thu, Jun 05, 2014 at 10:02:22AM -0400, Douglas Gilbert wrote:
 After the SG_IO ioctl was copied into the block layer and
 later into the bsg driver, subtle differences emerged.
 
 One difference is the way injected commands are queued through
 the block layer (i.e. this is not SCSI device queueing nor SATA
 NCQ). Summarizing:
   - SG_IO on block layer device: blk_exec*(at_head=false)
   - sg device SG_IO: at_head=true
   - bsg device SG_IO: at_head=true
 
 Some time ago Boaz Harrosh introduced a sg v4 flag called
 BSG_FLAG_Q_AT_TAIL to override the bsg driver default. A
 recent patch titled: sg: add SG_FLAG_Q_AT_TAIL flag
 allowed the sg driver default to be overridden. This patch
 allows a SG_IO ioctl sent to a block layer device to have
 its default overridden.
 
 ChangeLog:
 - introduce SG_FLAG_Q_AT_HEAD flag in sg.h to cause
   commands that are injected via a block layer
   device SG_IO ioctl to set at_head=true
 - make comments clearer about queueing in sg.h since the
   header is used both by the sg device and block layer
   device implementations of the SG_IO ioctl.
 - introduce BSG_FLAG_Q_AT_HEAD in bsg.h for compatibility
   (it does nothing) and update comments.
 
 
 Signed-off-by: Douglas Gilbert dgilb...@interlog.com

 diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
 index 2648797..e49b7ef 100644
 --- a/block/scsi_ioctl.c
 +++ b/block/scsi_ioctl.c
 @@ -288,6 +288,7 @@ static int sg_io(struct request_queue *q, struct gendisk 
 *bd_disk,
   unsigned long start_time;
   ssize_t ret = 0;
   int writing = 0;
 + int at_head = 0;
   struct request *rq;
   char sense[SCSI_SENSE_BUFFERSIZE];
   struct bio *bio;
 @@ -311,6 +312,8 @@ static int sg_io(struct request_queue *q, struct gendisk 
 *bd_disk,
   case SG_DXFER_FROM_DEV:
   break;
   }
 + if (hdr-flags  SG_FLAG_Q_AT_HEAD)
 + at_head = 1;
  
   rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL);
   if (!rq)
 @@ -366,7 +369,7 @@ static int sg_io(struct request_queue *q, struct gendisk 
 *bd_disk,
* (if he doesn't check that is his problem).
* N.B. a non-zero SCSI status is _not_ necessarily an error.
*/
 - blk_execute_rq(q, bd_disk, rq, 0);
 + blk_execute_rq(q, bd_disk, rq, at_head);
  
   hdr-duration = jiffies_to_msecs(jiffies - start_time);
  
 diff --git a/include/scsi/sg.h b/include/scsi/sg.h
 index 9859355..750e5db 100644
 --- a/include/scsi/sg.h
 +++ b/include/scsi/sg.h
 @@ -86,7 +86,9 @@ typedef struct sg_io_hdr
  #define SG_FLAG_MMAP_IO 4   /* request memory mapped IO */
  #define SG_FLAG_NO_DXFER 0x1 /* no transfer of kernel buffers to/from */
   /* user space (debug indirect IO) */
 -#define SG_FLAG_Q_AT_TAIL 0x10  /* default is Q_AT_HEAD */
 +/* defaults:: for sg driver: Q_AT_HEAD; for block layer: Q_AT_TAIL */
 +#define SG_FLAG_Q_AT_TAIL 0x10
 +#define SG_FLAG_Q_AT_HEAD 0x20
  
  /* following 'info' values are or-ed together */
  #define SG_INFO_OK_MASK 0x1
 diff --git a/include/uapi/linux/bsg.h b/include/uapi/linux/bsg.h
 index 7a12e1c..02986cf 100644
 --- a/include/uapi/linux/bsg.h
 +++ b/include/uapi/linux/bsg.h
 @@ -10,12 +10,13 @@
  #define BSG_SUB_PROTOCOL_SCSI_TRANSPORT  2
  
  /*
 - * For flags member below
 - * sg.h sg_io_hdr also has bits defined for it's flags member. However
 - * none of these bits are implemented/used by bsg. The bits below are
 - * allocated to not conflict with sg.h ones anyway.
 + * For flag constants below:
 + * sg.h sg_io_hdr also has bits defined for it's flags member. These
 + * two flag values (0x10 and 0x20) have the same meaning in sg.h . For
 + * bsg the BSG_FLAG_Q_AT_HEAD flag is ignored since it is the deafult.
   */
 -#define BSG_FLAG_Q_AT_TAIL 0x10 /* default, == 0 at this bit, is Q_AT_HEAD */
 +#define BSG_FLAG_Q_AT_TAIL 0x10 /* default is Q_AT_HEAD */
 +#define BSG_FLAG_Q_AT_HEAD 0x20
  
  struct sg_io_v4 {
   __s32 guard;/* [i] 'Q' to differentiate from v3 */

---end quoted text---
--
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


Re: [PATCH v2] sg: add SG_FLAG_Q_AT_TAIL flag

2014-06-05 Thread Boaz Harrosh
On 06/04/2014 05:58 PM, Douglas Gilbert wrote:
 When the SG_IO ioctl was copied into the block layer and
 later into the bsg driver, subtle differences emerged.
 
 One difference is the way injected commands are queued through
 the block layer (i.e. this is not SCSI device queueing nor SATA
 NCQ). Summarizing:
- SG_IO in the block layer: blk_exec*(at_head=false)
- sg SG_IO: at_head=true
- bsg SG_IO: at_head=true
 
 Some time ago Boaz Harrosh introduced a sg v4 flag called
 BSG_FLAG_Q_AT_TAIL to override the bsg driver default.
 This patch does the equivalent for the sg driver.
 

Yep

 
 ChangeLog:
  Introduce SG_FLAG_Q_AT_TAIL flag to cause commands
  to be injected into the block layer with
  at_head=false.
 
 Changes since v1:
  Make guard condition (only take sg v3 interface or later
  invocations) clearer.
 
 Signed-off-by: Douglas Gilbert dgilb...@interlog.com
 

Douglas Hi

Please I'm just curious? up until now all application users
used SG_FLAG_Q_AT_HEAD. Therefor I deduce that you guys
came across a new application that can make use of the new
SG_FLAG_Q_AT_TAIL facility.

What was the application's writer considerations for using
the old sg interface and not use the newer bsg interface
that already has this support. For me I can see 2 main areas
that I find bsg missing.

1. aio scatter_gather type io. 
   (ie multiple pointers multiple length buffers that are
written / read from same linear range on device)
  [The async aspect of aio can be implemented via bsg
   with the write+read system calls]
2. mmap of direct device range to user vm memory

Which of these, or other, considerations where cardinal
in using of the old interface in new code?

(For me personally both above shortcomings are very
 much missed]

Thanks
Boaz

--
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


Re: [PATCH v5] sg: relax 16 byte cdb restriction

2014-06-05 Thread Boaz Harrosh
On 06/05/2014 06:40 PM, Boaz Harrosh wrote:
 On 06/03/2014 08:18 PM, Douglas Gilbert wrote:
 v4 of this patch was sent 20131201.

 ChangeLog:
  - remove the 16 byte CDB (SCSI command) length limit
from the sg driver by handling longer CDBs the same
way as the bsg driver. Remove comment from sg.h
public interface about the cmd_len field being
limited to 16 bytes.
  - remove some dead code caused by this change
  - cleanup comment block at the top of sg.h, fix urls

 Signed-off-by: Douglas Gilbert dgilb...@interlog.com


 sg_cdb_dg5.patch


 
  
 +/* SG_MAX_CDB_SIZE should be 260 (spc4r37 section 3.1.30) however the type
 + * of sg_io_hdr::cmd_len can only represent 255
 + */
 +#define SG_MAX_CDB_SIZE 255
 +


BTW here too. Why new code is using the old interface?
I thought that the all point for having bsg at all is
that new stuff are implemented there in a cleaner interface
for example large CDBs.
Otherwise what was the point for bsg in the first place?
(It was before my time, It would be nice to know?)

What is then left unique at bsg after this patch? only bidi?

Thanks
Boaz

--
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


Re: [PATCH v2] sg: add SG_FLAG_Q_AT_TAIL flag

2014-06-05 Thread Jeremy Linton
-BEGIN PGP SIGNED MESSAGE-
Hash: SHA1

On 6/5/2014 10:27 AM, Boaz Harrosh wrote:

 1. aio scatter_gather type io. (ie multiple pointers multiple length
 buffers that are written / read from same linear range on device) [The
 async aspect of aio can be implemented via bsg with the write+read system
 calls] 2. mmap of direct device range to user vm memory

I suspect that belies a bit of a gap in the understanding of the kinds 
of
applications that use pass-through (vs just using sd, or using it for a guest 
OS).

These use cases don't tend to be useful for things like SCSI changers, 
tape
devices, or SES devices. What is useful is the ability to reset devices, or
maybe some of the other edge features provided by SG that never managed to
make it into bsg. Nor are they useful for the monitoring type applications
that use pass-through to pull some vendor specific statistic or device state.

Furthermore, i've see a fair number of cases where people slap together 
shell
scripts using the /dev/sg* handles instead of the /dev/bsg/* ones probably
because its simply more convenient.

-BEGIN PGP SIGNATURE-
Version: GnuPG v1.4.10 (MingW32)
Comment: Using GnuPG with Thunderbird - http://www.enigmail.net/

iQEcBAEBAgAGBQJTkKYLAAoJEL5i86xrzcy78ZEIAK9s8hcgtX3bloYbW+09OHWu
M12ySzk6hEOvJcGZwoBobkG5q9cHPk1ehaCtzaTE5MlBaSOSfg+AAHVUusr3PUZR
REmwS+eBZu6wRghXPE6c0oLuBulQ1FeJXkDsfuRhkaoBfZxfc/BiTEb67CCbHPm4
gT34VCiVRB0G0Sp5rnu9S9f1LvRmF2DoMCK+CmCBNh0q/dD3EskQJOh5c9sAKHKJ
0TO1LyuRj5jUILgOma/gHX3LHa7JN9EE+DKK5mm8s75vMKwv8FpWMc6B9LeOfcIn
XDDMM5tdrtbXMvZ6M5jp+bhbnoydxhRHgXBpiTMe3ze4VZXXLdmSBX/am9oVhKA=
=TdvH
-END PGP SIGNATURE-
--
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


Re: [PATCH 2/2] TARGET/sbc,loopback: Adjust command data length in case pi exists on the wire

2014-06-05 Thread Sagi Grimberg

On 6/2/2014 7:54 PM, Martin K. Petersen wrote:

Sagi == Sagi Grimberg sa...@mellanox.com writes:

Sagi,

Sagi In various areas of the code, it is assumed that
Sagi se_cmd- data_length describes pure data. In case
Sagi that protection information exists over the wire (protect bits is
Sagi are on) the target core decrease the protection length from the
Sagi data length (instead of each transport peeking in the cdb).

I completely agree with the notion of including PI in the transport byte
count.

Why do you open code the transfer length adjustment below?


Can't say I have a good reason for that.
I'll move this logic to scsi_cmnd.h.



+   /**
+* Adjust data_length to include
+* protection information
+**/
+   switch (sc-device-sector_size) {
+   case 512:
+   data_len += (data_len  9) * 8;
+   break;
+   case 1024:
+   data_len += (data_len  10) * 8;
+   break;
+   case 2048:
+   data_len += (data_len  11) * 8;
+   break;
+   case 4096:
+   data_len += (data_len  12) * 8;
+   break;
+   default:
+   data_len +=
+   (data_len  ilog2(sc-device-sector_size)) * 
8;
+   }



--
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


Re: [PATCH 0/2] Include protection information in iscsi header

2014-06-05 Thread Sagi Grimberg

On 6/3/2014 9:16 AM, Roland Dreier wrote:

On Sun, Jun 1, 2014 at 9:19 AM, Sagi Grimberg sa...@mellanox.com wrote:

Although these patches involve 3 subsystems with different
maintainers (scsi, iser, target) I would prefer seeing these
patches included together.

Why?  Because they break wire compatibility?

I hate to say it but even if they're merged at the same time, you
can't guarantee that targets and initiators will be updated together.



Yes that's true, but still I would like to avoid a kernel release that 
the target and initiator

can't talk to one another...

Sagi.
--
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


Re: [PATCH 1/2] libiscsi, iser: Adjust data_length to include protection information

2014-06-05 Thread Sagi Grimberg

On 6/3/2014 7:11 PM, Mike Christie wrote:

On 06/01/2014 11:19 AM, Sagi Grimberg wrote:

  /**
+ * iscsi_adjust_dl - Adjust SCSI data length to include PI
+ * @sc: scsi command.
+ * @data_length: command data length.
+ *
+ * Adjust the data length to account for how much data
+ * is actually on the wire.
+ *
+ * returns the adjusted data length
+ **/
+static unsigned
+iscsi_adjust_dl(struct scsi_cmnd *sc, unsigned data_len)

Hey, one other comment. Could you rename this to iscsi_adjust_data_len
or iscsi_adjust_dlength? It is more common in the iscsi code to use
those names for data length.


No need - I moved this logic to a scsi helper anyway (as MKP suggested)...

Thanks!
Sagi.
--
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


Re: [PATCH 1/2] libiscsi, iser: Adjust data_length to include protection information

2014-06-05 Thread Sagi Grimberg

On 6/4/2014 1:18 AM, Martin K. Petersen wrote:

Mike == Mike Christie micha...@cs.wisc.edu writes:

Mike On 06/01/2014 11:19 AM, Sagi Grimberg wrote:

+/*
+ * data integrity helpers
+ */
+static inline unsigned +iscsi_prot_len(unsigned data_len, unsigned
sector_size) +{
+ switch (sector_size) {
+ case 512:
+ return (data_len  9) * 8;
+ case 1024:
+ return (data_len  10) * 8;
+ case 2048:
+ return (data_len  11) * 8;
+ case 4096:
+ return (data_len  12) * 8;
+ default:
+ return (data_len  ilog2(sector_size)) * 8;
+ }
+}
#endif

Mike I do not think this should not be in the iscsi code.

In the data integrity update I posted there's a flag saying transfer PI
on the wire. That was meant to be the thing driver's should key off of
to adjust transfer length. But I'm also happy to provide a unsigned int
scsi_transfer_length(struct scsi_cmnd *) thingy that returns the right
byte count. Just bear in mind that the host-facing DIX transfer length
may be different.



OK, let me prepare v1 moving this logic to a scsi helper and we'll have 
another round of comments.


Thanks,
Sagi.
--
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/4] [SCSI] NCR53c406a: don't call free_dma() by default

2014-06-05 Thread Arnd Bergmann
The NCR53c406a scsi driver normally does not use DMA, unless
the USE_PIO macro is disabled by modifying the source code.

The call to free_dma() for some reason uses #ifdef USE_DMA,
which does not do the right thing, since USE_DMA is defined
as a boolean that is either 0 or 1, but always present.

One case where it gets in the way is randconfig builds on ARM,
which depending on the configuration does not provide a free_dma()
function, causing this build error:

drivers/scsi/NCR53c406a.c: In function 'NCR53c406a_release':
drivers/scsi/NCR53c406a.c:600:3: error: implicit declaration of function 
'free_dma' [-Werror=implicit-function-declaration]
   free_dma(shost-dma_channel);
   ^

This changes the code to use #if USE_DMA, to match the
rest of the file, which seems to be what the author intended.

Signed-off-by: Arnd Bergmann a...@arndb.de
---
 drivers/scsi/NCR53c406a.c | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/NCR53c406a.c b/drivers/scsi/NCR53c406a.c
index c91888a..2c78785 100644
--- a/drivers/scsi/NCR53c406a.c
+++ b/drivers/scsi/NCR53c406a.c
@@ -595,7 +595,7 @@ static int NCR53c406a_release(struct Scsi_Host *shost)
 {
if (shost-irq)
free_irq(shost-irq, NULL);
-#ifdef USE_DMA
+#if USE_DMA
if (shost-dma_channel != 0xff)
free_dma(shost-dma_channel);
 #endif
-- 
1.8.3.2

--
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 1/4] [SCSI] Don't build AdvanSys on ARM

2014-06-05 Thread Arnd Bergmann
The advansys SCSI driver uses the dma_cache_sync function, which is
not available on the ARM architecture, and cannot be implemented
correctly, so we always get this build error:

drivers/scsi/advansys.c: In function 'advansys_get_sense_buffer_dma':
drivers/scsi/advansys.c:7882:2: error: implicit declaration of function 
'dma_cache_sync' [-Werror=implicit-function-declaration]
  dma_cache_sync(board-dev, scp-sense_buffer,
  ^

It seems nobody has missed this driver so far, so let's just
disable it for ARM to help randconfig builds.

Signed-off-by: Arnd Bergmann a...@arndb.de
Cc: Matthew Wilcox matt...@wil.cx
---
 drivers/scsi/Kconfig | 2 +-
 1 file changed, 1 insertion(+), 1 deletion(-)

diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
index baca589..8368e00 100644
--- a/drivers/scsi/Kconfig
+++ b/drivers/scsi/Kconfig
@@ -528,7 +528,7 @@ config SCSI_DPT_I2O
 
 config SCSI_ADVANSYS
tristate AdvanSys SCSI support
-   depends on SCSI  VIRT_TO_BUS
+   depends on SCSI  VIRT_TO_BUS  !ARM
depends on ISA || EISA || PCI
help
  This is a driver for all SCSI host adapters manufactured by
-- 
1.8.3.2

--
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 3/4] [SCSI] qlogicfas: don't call free_dma()

2014-06-05 Thread Arnd Bergmann
The qlogicfas scsi driver does not use DMA, and the call to free_dma()
in its exit function seems to have been copied incorrectly from
another driver but never caused trouble.

One case where it gets in the way is randconfig builds on ARM,
which depending on the configuration does not provide a free_dma()
function, causing this build error:

drivers/scsi/qlogicfas.c: In function 'qlogicfas_release':
drivers/scsi/qlogicfas.c:175:3: error: implicit declaration of function 
'free_dma' [-Werror=implicit-function-declaration]
   free_dma(shost-dma_channel);
   ^

Removing the incorrect function calls should be the obvious
fix for this, with no downsides.

Signed-off-by: Arnd Bergmann a...@arndb.de
---
 drivers/scsi/qlogicfas.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/scsi/qlogicfas.c b/drivers/scsi/qlogicfas.c
index 13d628b..a22bb1b 100644
--- a/drivers/scsi/qlogicfas.c
+++ b/drivers/scsi/qlogicfas.c
@@ -171,8 +171,6 @@ static int qlogicfas_release(struct Scsi_Host *shost)
qlogicfas408_disable_ints(priv);
free_irq(shost-irq, shost);
}
-   if (shost-dma_channel != 0xff)
-   free_dma(shost-dma_channel);
if (shost-io_port  shost-n_io_port)
release_region(shost-io_port, shost-n_io_port);
scsi_host_put(shost);
-- 
1.8.3.2

--
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 2/4] [SCSI] pas16: don't call free_dma()

2014-06-05 Thread Arnd Bergmann
The pas16 scsi driver does not use DMA, and the call to free_dma()
in its exit function seems to have been copied incorrectly from
another driver but never caused trouble.

One case where it gets in the way is randconfig builds on ARM,
which depending on the configuration does not provide a free_dma()
function, causing this build error:

drivers/scsi/pas16.c: In function 'pas16_release':
drivers/scsi/pas16.c:611:3: error: implicit declaration of function 'free_dma' 
[-Werror=implicit-function-declaration]
   free_dma(shost-dma_channel);

Removing the incorrect function calls should be the obvious
fix for this, with no downsides.

Signed-off-by: Arnd Bergmann a...@arndb.de
Cc: Finn Thain fth...@telegraphics.com.au
Cc: Michael Schmitz schmitz...@gmail.com
---
 drivers/scsi/pas16.c | 2 --
 1 file changed, 2 deletions(-)

diff --git a/drivers/scsi/pas16.c b/drivers/scsi/pas16.c
index 0d78a4d..80bacb5 100644
--- a/drivers/scsi/pas16.c
+++ b/drivers/scsi/pas16.c
@@ -607,8 +607,6 @@ static int pas16_release(struct Scsi_Host *shost)
if (shost-irq)
free_irq(shost-irq, shost);
NCR5380_exit(shost);
-   if (shost-dma_channel != 0xff)
-   free_dma(shost-dma_channel);
if (shost-io_port  shost-n_io_port)
release_region(shost-io_port, shost-n_io_port);
scsi_unregister(shost);
-- 
1.8.3.2

--
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 0/4] ARM randconfig fixes for SCSI

2014-06-05 Thread Arnd Bergmann
Hi James,

These are some fixes for ancient randconfig build bugs I
ran into on ARM. Clearly none of these are urgent, but it
would be nice to have them merged for 3.17 if they look
good to you.

Arnd Bergmann (4):
  [SCSI] Don't build AdvanSys on ARM
  [SCSI] pas16: don't call free_dma()
  [SCSI] qlogicfas: don't call free_dma()
  [SCSI] NCR53c406a: don't call free_dma() by default

 drivers/scsi/Kconfig  | 2 +-
 drivers/scsi/NCR53c406a.c | 2 +-
 drivers/scsi/pas16.c  | 2 --
 drivers/scsi/qlogicfas.c  | 2 --
 4 files changed, 2 insertions(+), 6 deletions(-)

-- 
1.8.3.2

Cc: Matthew Wilcox matt...@wil.cx
Cc: Finn Thain fth...@telegraphics.com.au
Cc: Michael Schmitz schmitz...@gmail.com
--
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


Re: [PATCH v5] sg: relax 16 byte cdb restriction

2014-06-05 Thread Douglas Gilbert

On 14-06-05 11:40 AM, Boaz Harrosh wrote:

On 06/03/2014 08:18 PM, Douglas Gilbert wrote:

v4 of this patch was sent 20131201.

ChangeLog:
  - remove the 16 byte CDB (SCSI command) length limit
from the sg driver by handling longer CDBs the same
way as the bsg driver. Remove comment from sg.h
public interface about the cmd_len field being
limited to 16 bytes.
  - remove some dead code caused by this change
  - cleanup comment block at the top of sg.h, fix urls

Signed-off-by: Douglas Gilbert dgilb...@interlog.com


sg_cdb_dg5.patch






+/* SG_MAX_CDB_SIZE should be 260 (spc4r37 section 3.1.30) however the type
+ * of sg_io_hdr::cmd_len can only represent 255
+ */
+#define SG_MAX_CDB_SIZE 255
+


Just a nit on above comment (code is all good). CDB bigger then 16 is 8 bytes 
aligned
So the maximum for sg is 252 not 255 as above.
(As you said theoretical max is 260 but since it would not fit then the
  next allowed size is 252)


Yes, a multiple of four so 252 would be better.

Doug Gilbert


  /*
   * Suppose you want to calculate the formula muldiv(x,m,d)=int(x * m / d)
   * Then when using 32 bit integers x * m may overflow during the calculation.
@@ -161,7 +164,7 @@ typedef struct sg_fd {  /* holds the state of a 
file descriptor */
char low_dma;   /* as in parent but possibly overridden to 1 */
char force_packid;  /* 1 - pack_id input to read(), 0 - ignored */
char cmd_q; /* 1 - allow command queuing, 0 - don't */
-   char next_cmd_len;  /* 0 - automatic (def), 0 - use on next 
write() */
+   unsigned char next_cmd_len; /* 0: automatic, 0: use on next write() */
char keep_orphan;   /* 0 - drop orphan (def), 1 - keep for read() 
*/
char mmap_called;   /* 0 - mmap() never called on this fd */
struct kref f_ref;
@@ -566,7 +569,7 @@ sg_write(struct file *filp, const char __user *buf, size_t 
count, loff_t * ppos)
Sg_request *srp;
struct sg_header old_hdr;
sg_io_hdr_t *hp;
-   unsigned char cmnd[MAX_COMMAND_SIZE];
+   unsigned char cmnd[SG_MAX_CDB_SIZE];

if ((!(sfp = (Sg_fd *) filp-private_data)) || (!(sdp = sfp-parentdp)))
return -ENXIO;
@@ -598,12 +601,6 @@ sg_write(struct file *filp, const char __user *buf, size_t 
count, loff_t * ppos)
buf += SZ_SG_HEADER;
__get_user(opcode, buf);
if (sfp-next_cmd_len  0) {
-   if (sfp-next_cmd_len  MAX_COMMAND_SIZE) {
-   SCSI_LOG_TIMEOUT(1, printk(sg_write: command length too 
long\n));
-   sfp-next_cmd_len = 0;
-   sg_remove_request(sfp, srp);
-   return -EIO;
-   }
cmd_size = sfp-next_cmd_len;
sfp-next_cmd_len = 0;   /* reset so only this write() 
effected */
} else {
@@ -675,7 +672,7 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char 
__user *buf,
int k;
Sg_request *srp;
sg_io_hdr_t *hp;
-   unsigned char cmnd[MAX_COMMAND_SIZE];
+   unsigned char cmnd[SG_MAX_CDB_SIZE];
int timeout;
unsigned long ul_timeout;

@@ -1645,14 +1642,24 @@ static int sg_start_req(Sg_request *srp, unsigned char 
*cmd)
struct request_queue *q = sfp-parentdp-device-request_queue;
struct rq_map_data *md, map_data;
int rw = hp-dxfer_direction == SG_DXFER_TO_DEV ? WRITE : READ;
+   unsigned char *long_cmdp = NULL;

SCSI_LOG_TIMEOUT(4, printk(KERN_INFO sg_start_req: dxfer_len=%d\n,
   dxfer_len));
+   if (hp-cmd_len  BLK_MAX_CDB) {
+   long_cmdp = kzalloc(hp-cmd_len, GFP_KERNEL);
+   if (!long_cmdp)
+   return -ENOMEM;
+   }

rq = blk_get_request(q, rw, GFP_ATOMIC);
-   if (!rq)
+   if (!rq) {
+   kfree(long_cmdp);
return -ENOMEM;
+   }

+   if (hp-cmd_len  BLK_MAX_CDB)
+   rq-cmd = long_cmdp;
memcpy(rq-cmd, cmd, hp-cmd_len);

rq-cmd_len = hp-cmd_len;
@@ -1739,6 +1746,8 @@ static int sg_finish_rem_req(Sg_request * srp)
if (srp-bio)
ret = blk_rq_unmap_user(srp-bio);

+   if (srp-rq-cmd != srp-rq-__cmd)
+   kfree(srp-rq-cmd);
blk_put_request(srp-rq);
}

diff --git a/include/scsi/sg.h b/include/scsi/sg.h
index a9f3c6f..d8c0c43 100644
--- a/include/scsi/sg.h
+++ b/include/scsi/sg.h
@@ -4,77 +4,34 @@
  #include linux/compiler.h

  /*
-   History:
-Started: Aug 9 by Lawrence Foard (entr...@world.std.com), to allow user
- process control of SCSI devices.
-Development Sponsored by Killy Corp. NY NY
-Original driver (sg.h):
-*   Copyright (C) 1992 Lawrence Foard
-Version 2 and 3 extensions to driver:
-*   Copyright (C) 1998 - 2006 Douglas 

SCSI eats error from flush failure during hot plug

2014-06-05 Thread Steven Haber
Hello,

I am testing ATA device durability during hot unplug. I have a power
fault test suite that has turned up issues with the fsync-SCSI-ATA
codepath. If a device is unplugged while an fsync is in progress, ATA
returns a flush error to the SCSI driver but scsi_io_completion()
seems to disregard it. fsync() returns no error, which should mean
that the write was durably flushed to disk. I expect fsync() to return
EIO or something similar when the flush isn't acked by the device.

When the failure occurs, the SCSI sense key is set to ABORTED_COMMAND.
However, scsi_end_command() is called without any of the sense context
and scsi_io_completion() returns early without checking sense at all.

This commit may be related:
d6b0c53723753fc0cfda63f56735b225c43e1e9a
(http://git.opencores.org/?a=commitdiffp=linuxh=d6b0c53723753fc0cfda63f56735b225c43e1e9a)

The following patch fixes the issue, but it's a hack. I only have a
vague understanding of Linux drivers, so I'm looking for advice on how
to make this fix better and get it upstream.

Thanks!

Steven Haber
Qumulo, Inc.





diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 9db097a..789af39 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -822,40 +822,44 @@ void scsi_io_completion(struct scsi_cmnd *cmd,
unsigned int good_bytes)
  /*
  * Recovered errors need reporting, but they're always treated
  * as success, so fiddle the result code here.  For BLOCK_PC
  * we already took a copy of the original into rq-errors which
  * is what gets returned to the user
  */
  if (sense_valid  (sshdr.sense_key == RECOVERED_ERROR)) {
  /* if ATA PASS-THROUGH INFORMATION AVAILABLE skip
  * print since caller wants ATA registers. Only occurs on
  * SCSI ATA PASS_THROUGH commands when CK_COND=1
  */
  if ((sshdr.asc == 0x0)  (sshdr.ascq == 0x1d))
  ;
  else if (!(req-cmd_flags  REQ_QUIET))
  scsi_print_sense(, cmd);
  result = 0;
  /* BLOCK_PC may have set error */
  error = 0;
  }

+ if (sense_valid  (sshdr.sense_key == ABORTED_COMMAND) 
+good_bytes == 0)
+ error = (sshdr.asc == 0x10) ? -EILSEQ : -EIO;
+
  /*
  * A number of bytes were successfully read.  If there
  * are leftovers and there is some kind of error
  * (result != 0), retry the rest.
  */
  if (scsi_end_request(cmd, error, good_bytes, result == 0) == NULL)
  return;

  error = __scsi_error_from_host_byte(cmd, result);

  if (host_byte(result) == DID_RESET) {
  /* Third party bus reset or reset for error recovery
  * reasons.  Just retry the command and see what
  * happens.
  */
  action = ACTION_RETRY;
  } else if (sense_valid  !sense_deferred) {
  switch (sshdr.sense_key) {
  case UNIT_ATTENTION:
  if (cmd-device-removable) {
--
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 2/2] tcm_fc: Generate TASK_SET_FULL status for response failures

2014-06-05 Thread Nicholas A. Bellinger
From: Nicholas Bellinger n...@linux-iscsi.org

This patch changes ft_queue_status() to set SAM_STAT_TASK_SET_FULL
status upon lport-tt.seq_send( failure, and return -EAGAIN to notify
target-core to attempt to requeue the response.

It also does the same for a fc_frame_alloc() failures, in order to
signal the initiator that it should try to reduce it's current
queue_depth, to lower the number of outstanding I/Os on the wire.

Reported-by: Vasu Dev vasu@linux.intel.com
Cc: Vasu Dev vasu@linux.intel.com
Cc: Jun Wu j...@stormojo.com
Signed-off-by: Nicholas Bellinger n...@linux-iscsi.org
---
 drivers/target/tcm_fc/tfc_cmd.c |   19 ---
 1 file changed, 16 insertions(+), 3 deletions(-)

diff --git a/drivers/target/tcm_fc/tfc_cmd.c b/drivers/target/tcm_fc/tfc_cmd.c
index f5fd515..5585038 100644
--- a/drivers/target/tcm_fc/tfc_cmd.c
+++ b/drivers/target/tcm_fc/tfc_cmd.c
@@ -128,6 +128,7 @@ int ft_queue_status(struct se_cmd *se_cmd)
struct fc_lport *lport;
struct fc_exch *ep;
size_t len;
+   int rc;
 
if (cmd-aborted)
return 0;
@@ -137,9 +138,10 @@ int ft_queue_status(struct se_cmd *se_cmd)
len = sizeof(*fcp) + se_cmd-scsi_sense_length;
fp = fc_frame_alloc(lport, len);
if (!fp) {
-   /* XXX shouldn't just drop it - requeue and retry? */
-   return 0;
+   se_cmd-scsi_status = SAM_STAT_TASK_SET_FULL;
+   return -ENOMEM;
}
+
fcp = fc_frame_payload_get(fp, len);
memset(fcp, 0, len);
fcp-resp.fr_status = se_cmd-scsi_status;
@@ -170,7 +172,18 @@ int ft_queue_status(struct se_cmd *se_cmd)
fc_fill_fc_hdr(fp, FC_RCTL_DD_CMD_STATUS, ep-did, ep-sid, FC_TYPE_FCP,
   FC_FC_EX_CTX | FC_FC_LAST_SEQ | FC_FC_END_SEQ, 0);
 
-   lport-tt.seq_send(lport, cmd-seq, fp);
+   rc = lport-tt.seq_send(lport, cmd-seq, fp);
+   if (rc) {
+   pr_err_ratelimited(%s: Failed to send response frame %p, 
+  xid 0x%x\n, __func__, fp, ep-xid);
+   /*
+* Generate a TASK_SET_FULL status to notify the initiator
+* to reduce it's queue_depth after the se_cmd response has
+* been re-queued by target-core.
+*/
+   se_cmd-scsi_status = SAM_STAT_TASK_SET_FULL;
+   return -ENOMEM;
+   }
lport-tt.exch_done(cmd-seq);
return 0;
 }
-- 
1.7.10.4

--
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 0/2] tcm_fc: Generate TASK_SET_FULL for DataIN + response failures

2014-06-05 Thread Nicholas A. Bellinger
From: Nicholas Bellinger n...@linux-iscsi.org

Hi Vasu,

This series generates SAM_STAT_TASK_SET_FULL status for lport-tt.seq_send()
failures in DataIN + response status codepaths, which is done in order to get
the initiator to reduce it's current queue_depth thus reducing the number of
outstanding I/Os permitted in flight on the wire.

For the DataIN case, once a lport-tt.seq_send() failure occurs it will stop
attempting to send subsequent DataIN payload data, and immediately attempt to
send a response packet with SAM_STAT_TASK_SET_FULL status.

For the response case, once a lport-tt.seq_send() failure occurs it will
set SAM_STAT_TASK_SET_FULL status and return -ENOMEM to the target, forcing
the response to be requeued by target-core

Note this series has been compile tested only, so please review + test.

Thank you,

--nab

Nicholas Bellinger (2):
  tcm_fc: Generate TASK_SET_FULL status for DataIN failures
  tcm_fc: Generate TASK_SET_FULL status for response failures

 drivers/target/tcm_fc/tfc_cmd.c |   19 ---
 drivers/target/tcm_fc/tfc_io.c  |   14 +-
 2 files changed, 29 insertions(+), 4 deletions(-)

-- 
1.7.10.4

--
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 1/2] tcm_fc: Generate TASK_SET_FULL status for DataIN failures

2014-06-05 Thread Nicholas A. Bellinger
From: Nicholas Bellinger n...@linux-iscsi.org

This patch changes ft_queue_data_in() to set SAM_STAT_TASK_SET_FULL
status upon a lport-tt.seq_send() failure, where it will now stop
sending subsequent DataIN, and immediately attempt to send the
response with exception status.

Sending a response with SAM_STAT_TASK_SET_FULL status is useful in
order to signal the initiator that it should try to reduce it's
current queue_depth, to lower the number of outstanding I/Os on
the wire.

Also, add a check to skip sending DataIN if TASK_SET_FULL status
has already been set due to a response lport-tt.seq_send()
failure, that has asked target-core to requeue a response.

Reported-by: Vasu Dev vasu@linux.intel.com
Cc: Vasu Dev vasu@linux.intel.com
Cc: Jun Wu j...@stormojo.com
Signed-off-by: Nicholas Bellinger n...@linux-iscsi.org
---
 drivers/target/tcm_fc/tfc_io.c |   14 +-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/target/tcm_fc/tfc_io.c b/drivers/target/tcm_fc/tfc_io.c
index e415af3..140659f 100644
--- a/drivers/target/tcm_fc/tfc_io.c
+++ b/drivers/target/tcm_fc/tfc_io.c
@@ -82,6 +82,10 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
 
if (cmd-aborted)
return 0;
+
+   if (se_cmd-scsi_status == SAM_STAT_TASK_SET_FULL)
+   goto queue_status;
+
ep = fc_seq_exch(cmd-seq);
lport = ep-lp;
cmd-seq = lport-tt.seq_start_next(cmd-seq);
@@ -178,14 +182,22 @@ int ft_queue_data_in(struct se_cmd *se_cmd)
   FC_TYPE_FCP, f_ctl, fh_off);
error = lport-tt.seq_send(lport, seq, fp);
if (error) {
-   /* XXX For now, initiator will retry */
pr_err_ratelimited(%s: Failed to send frame %p, 
xid 0x%x, remaining %zu, 
lso_max 0x%x\n,
__func__, fp, ep-xid,
remaining, lport-lso_max);
+   /*
+* Generate a TASK_SET_FULL status to notify the
+* initiator to reduce it's queue_depth, ignoring
+* the rest of the data-in and immediately attempt
+* to send the response.
+*/
+   se_cmd-scsi_status = SAM_STAT_TASK_SET_FULL;
+   break;
}
}
+queue_status:
return ft_queue_status(se_cmd);
 }
 
-- 
1.7.10.4

--
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] mpt3sas: delay scsi_add_host call to work with scsi-mq

2014-06-05 Thread Elliott, Robert (Server Storage)
In _scsih_probe, delay the call to scsi_add_host until
the host template has been completely filled in.

Otherwise, the default .can_queue value of 1 causes
scsi-mq to set the block layer request queue size
to its minimum size, resulting in awful performance.

In _scsih_probe error handling, call mpt3sas_base_detach
rather than scsi_remove_host to properly clean up
in reverse order.

In _scsih_remove, call scsi_remove_host earlier
to clean up in reverse order.

Signed-off-by: Robert Elliott elli...@hp.com
---
 drivers/scsi/mpt3sas/mpt3sas_scsih.c |   20 ++--
 1 files changed, 10 insertions(+), 10 deletions(-)

diff --git a/drivers/scsi/mpt3sas/mpt3sas_scsih.c 
b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
index 18e713d..529b5fd 100644
--- a/drivers/scsi/mpt3sas/mpt3sas_scsih.c
+++ b/drivers/scsi/mpt3sas/mpt3sas_scsih.c
@@ -7431,9 +7431,9 @@ static void _scsih_remove(struct pci_dev *pdev)
}
 
sas_remove_host(shost);
+   scsi_remove_host(shost);
mpt3sas_base_detach(ioc);
list_del(ioc-list);
-   scsi_remove_host(shost);
scsi_host_put(shost);
 }
 
@@ -7801,13 +7801,6 @@ _scsih_probe(struct pci_dev *pdev, const struct 
pci_device_id *id)
}
}
 
-   if ((scsi_add_host(shost, pdev-dev))) {
-   pr_err(MPT3SAS_FMT failure at %s:%d/%s()!\n,
-   ioc-name, __FILE__, __LINE__, __func__);
-   list_del(ioc-list);
-   goto out_add_shost_fail;
-   }
-
/* register EEDP capabilities with SCSI layer */
if (prot_mask  0)
scsi_host_set_prot(shost, prot_mask);
@@ -7835,15 +7828,22 @@ _scsih_probe(struct pci_dev *pdev, const struct 
pci_device_id *id)
ioc-name, __FILE__, __LINE__, __func__);
goto out_attach_fail;
}
+
+   if ((scsi_add_host(shost, pdev-dev))) {
+   pr_err(MPT3SAS_FMT failure at %s:%d/%s()!\n,
+   ioc-name, __FILE__, __LINE__, __func__);
+   goto out_add_shost_fail;
+   }
+
scsi_scan_host(shost);
return 0;
 
+ out_add_shost_fail:
+   mpt3sas_base_detach(ioc);
  out_attach_fail:
destroy_workqueue(ioc-firmware_event_thread);
  out_thread_fail:
list_del(ioc-list);
-   scsi_remove_host(shost);
- out_add_shost_fail:
scsi_host_put(shost);
return -ENODEV;
 }

---
Rob ElliottHP Server Storage



N�r��yb�X��ǧv�^�)޺{.n�+{{ay�ʇڙ�,j��f���h���z��w���
���j:+v���w�j�mzZ+�ݢj��!�i

Re: [PATCH 1/1] [SCSI] Fix a bug in deriving the FLUSH_TIMEOUT from the basic I/O timeout

2014-06-05 Thread Mike Christie
On 06/04/2014 12:15 PM, KY Srinivasan wrote:
 
 
 -Original Message-
 From: James Bottomley [mailto:jbottom...@parallels.com]
 Sent: Wednesday, June 4, 2014 10:02 AM
 To: KY Srinivasan
 Cc: linux-ker...@vger.kernel.org; a...@canonical.com;
 de...@linuxdriverproject.org; h...@infradead.org; linux-
 s...@vger.kernel.org; oher...@suse.com; gre...@linuxfoundation.org;
 jasow...@redhat.com
 Subject: Re: [PATCH 1/1] [SCSI] Fix a bug in deriving the FLUSH_TIMEOUT
 from the basic I/O timeout

 On Wed, 2014-06-04 at 09:33 -0700, K. Y. Srinivasan wrote:
 Commit ID: 7e660100d85af860e7ad763202fff717adcdaacd added code to
 derive the FLUSH_TIMEOUT from the basic I/O timeout. However, this
 patch did not use the basic I/O timeout of the device. Fix this bug.

 Signed-off-by: K. Y. Srinivasan k...@microsoft.com
 ---
  drivers/scsi/sd.c |4 +++-
  1 files changed, 3 insertions(+), 1 deletions(-)

 diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index
 e9689d5..54150b1 100644
 --- a/drivers/scsi/sd.c
 +++ b/drivers/scsi/sd.c
 @@ -832,7 +832,9 @@ static int sd_setup_write_same_cmnd(struct
 scsi_device *sdp, struct request *rq)

  static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct
 request *rq)  {
 -   rq-timeout *= SD_FLUSH_TIMEOUT_MULTIPLIER;
 +   int timeout = sdp-request_queue-rq_timeout;
 +
 +   rq-timeout = (timeout * SD_FLUSH_TIMEOUT_MULTIPLIER);

 Could you share where you found this to be a problem?  It looks like a bug in
 block because all inbound requests being prepared should have a timeout
 set, so block would be the place to fix it.
 
 Perhaps; what I found was that the value in rq-timeout was 0 coming into
 this function and thus multiplying obviously has no effect.
 

I think you are right. We hit this problem because we are doing:

scsi_request_fn - blk_peek_request - sd_prep_fn - scsi_setup_flush_cmnd.

At this time request-timeout is zero so the multiplication does
nothing. See how sd_setup_write_same_cmnd will set the request-timeout
at this time.

Then in scsi_request_fn we do:

scsi_request_fn - blk_start_request - blk_add_timer.

At this time it will set the request-timeout if something like req
block pc users (like scsi_execute() or block/scsi_ioctl.c) or the write
same code mentioned above have not set the timeout.



--
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


RE: [PATCH 1/1] [SCSI] Fix a bug in deriving the FLUSH_TIMEOUT from the basic I/O timeout

2014-06-05 Thread KY Srinivasan


 -Original Message-
 From: Mike Christie [mailto:micha...@cs.wisc.edu]
 Sent: Thursday, June 5, 2014 6:33 PM
 To: KY Srinivasan
 Cc: James Bottomley; linux-ker...@vger.kernel.org; a...@canonical.com;
 de...@linuxdriverproject.org; h...@infradead.org; linux-
 s...@vger.kernel.org; oher...@suse.com; gre...@linuxfoundation.org;
 jasow...@redhat.com
 Subject: Re: [PATCH 1/1] [SCSI] Fix a bug in deriving the FLUSH_TIMEOUT
 from the basic I/O timeout
 
 On 06/04/2014 12:15 PM, KY Srinivasan wrote:
 
 
  -Original Message-
  From: James Bottomley [mailto:jbottom...@parallels.com]
  Sent: Wednesday, June 4, 2014 10:02 AM
  To: KY Srinivasan
  Cc: linux-ker...@vger.kernel.org; a...@canonical.com;
  de...@linuxdriverproject.org; h...@infradead.org; linux-
  s...@vger.kernel.org; oher...@suse.com; gre...@linuxfoundation.org;
  jasow...@redhat.com
  Subject: Re: [PATCH 1/1] [SCSI] Fix a bug in deriving the
  FLUSH_TIMEOUT from the basic I/O timeout
 
  On Wed, 2014-06-04 at 09:33 -0700, K. Y. Srinivasan wrote:
  Commit ID: 7e660100d85af860e7ad763202fff717adcdaacd added code to
  derive the FLUSH_TIMEOUT from the basic I/O timeout. However, this
  patch did not use the basic I/O timeout of the device. Fix this bug.
 
  Signed-off-by: K. Y. Srinivasan k...@microsoft.com
  ---
   drivers/scsi/sd.c |4 +++-
   1 files changed, 3 insertions(+), 1 deletions(-)
 
  diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index
  e9689d5..54150b1 100644
  --- a/drivers/scsi/sd.c
  +++ b/drivers/scsi/sd.c
  @@ -832,7 +832,9 @@ static int sd_setup_write_same_cmnd(struct
  scsi_device *sdp, struct request *rq)
 
   static int scsi_setup_flush_cmnd(struct scsi_device *sdp, struct
  request *rq)  {
  - rq-timeout *= SD_FLUSH_TIMEOUT_MULTIPLIER;
  + int timeout = sdp-request_queue-rq_timeout;
  +
  + rq-timeout = (timeout * SD_FLUSH_TIMEOUT_MULTIPLIER);
 
  Could you share where you found this to be a problem?  It looks like
  a bug in block because all inbound requests being prepared should
  have a timeout set, so block would be the place to fix it.
 
  Perhaps; what I found was that the value in rq-timeout was 0 coming
  into this function and thus multiplying obviously has no effect.
 
 
 I think you are right. We hit this problem because we are doing:
 
 scsi_request_fn - blk_peek_request - sd_prep_fn -
 scsi_setup_flush_cmnd.
 
 At this time request-timeout is zero so the multiplication does nothing. See
 how sd_setup_write_same_cmnd will set the request-timeout at this time.
 
 Then in scsi_request_fn we do:
 
 scsi_request_fn - blk_start_request - blk_add_timer.
 
 At this time it will set the request-timeout if something like req block pc
 users (like scsi_execute() or block/scsi_ioctl.c) or the write same code
 mentioned above have not set the timeout.

I don't think this is a recent change. Prior to this commit, we were setting 
the timeout
value in this function; it just happened to be a different constant unrelated 
to the I/O
timeout.

K. Y
 
 

--
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