Re: 2.6.24-rc4-mm1: hostbyte=0x01 driverbyte=0x00 (now bisected)

2007-12-06 Thread Jens Axboe
On Thu, Dec 06 2007, Hannes Reinecke wrote:
 Alexey Dobriyan wrote:
   git-scsi-misc.patch
  
  Apologies for not looking into the problem earlier. See
  http://marc.info/?t=11962802235r=1w=2
  2.6.24-rc3-mm2: Result: hostbyte=0x01 driverbyte=0x00\nend_request: I/O 
  error
  for previous installment.
  
  I've bisected it to the following patch in git-scsi-misc branch.
  Revert on top of 2.6.24-rc4-mm1 also helps.
  
  commit 8655a546c83fc43f0a73416bbd126d02de7ad6c0
  Author: Hannes Reinecke [EMAIL PROTECTED]
  Date:   Tue Nov 6 09:23:40 2007 +0100
  
  [SCSI] Do not requeue requests if REQ_FAILFAST is set
  
  Any requests with the REQ_FAILFAST flag set should not be requeued
  to the requeust queue, but rather terminated directly.
  Otherwise the multipath failover will stall until the command
  timeout triggers.
  
  Signed-off-by: Hannes Reinecke [EMAIL PROTECTED]
  Signed-off-by: James Bottomley [EMAIL PROTECTED]
  
  diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
  index 0f44bdb..0da0dd0 100644
  --- a/drivers/scsi/scsi_lib.c
  +++ b/drivers/scsi/scsi_lib.c
  @@ -1286,6 +1286,11 @@ int scsi_prep_state_check(struct scsi_device *sdev, 
  struct request *req)
   */
  if (!(req-cmd_flags  REQ_PREEMPT))
  ret = BLKPREP_DEFER;
  +   /*
  +* Return failfast requests immediately
  +*/
  +   if (req-cmd_flags  REQ_FAILFAST)
  +   ret = BLKPREP_KILL;
  break;
  default:
  /*
  @@ -1414,6 +1419,17 @@ static inline int scsi_host_queue_ready(struct 
  request_queue *q,
  return 1;
   }
   
  +static void __scsi_kill_request(struct request *req)
  +{
  +   struct scsi_cmnd *cmd = req-special;
  +   struct scsi_device *sdev = cmd-device;
  +
  +   cmd-result = DID_NO_CONNECT  16;
  +   atomic_inc(cmd-device-iorequest_cnt);
  +   sdev-device_busy--;
  +   __scsi_done(cmd);
  +}
  +
   /*
* Kill a request for a dead device
*/
  @@ -1527,8 +1543,16 @@ static void scsi_request_fn(struct request_queue *q)
   * accept it.
   */
  req = elv_next_request(q);
  -   if (!req || !scsi_dev_queue_ready(q, sdev))
  +   if (!req)
  +   break;
  +
  +   if (!scsi_dev_queue_ready(q, sdev)) {
  +   if (req-cmd_flags  REQ_FAILFAST) {
  +   scsi_kill_request(req, q);
  +   continue;
  +   }
  break;
  +   }
   
  if (unlikely(!scsi_device_online(sdev))) {
  sdev_printk(KERN_ERR, sdev,
  @@ -1609,8 +1633,12 @@ static void scsi_request_fn(struct request_queue *q)
   * later time.
   */
  spin_lock_irq(q-queue_lock);
  -   blk_requeue_request(q, req);
  -   sdev-device_busy--;
  +   if (unlikely(req-cmd_flags  REQ_FAILFAST))
  +   __scsi_kill_request(req);
  +   else {
  +   blk_requeue_request(q, req);
  +   sdev-device_busy--;
  +   }
  if(sdev-device_busy == 0)
  blk_plug_device(q);
out:
 Yeah, sorry. That patch was bad. Please use the attached one instead.
 Andrew, can you replace them?
 
 Cheers,
 
 Hannes
 -- 
 Dr. Hannes Reinecke zSeries  Storage
 [EMAIL PROTECTED]   +49 911 74053 688
 SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
 GF: Markus Rex, HRB 16746 (AG Nürnberg)

 diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
 index 13e7e09..9ec1566 100644
 --- a/drivers/scsi/scsi_lib.c
 +++ b/drivers/scsi/scsi_lib.c
 @@ -1284,13 +1284,15 @@ int scsi_prep_state_check(struct scsi_device *sdev, 
 struct request *req)
   /*
* If the devices is blocked we defer normal commands.
*/
 - if (!(req-cmd_flags  REQ_PREEMPT))
 - ret = BLKPREP_DEFER;
 - /*
 -  * Return failfast requests immediately
 -  */
 - if (req-cmd_flags  REQ_FAILFAST)
 - ret = BLKPREP_KILL;
 + if (!(req-cmd_flags  REQ_PREEMPT)) {
 + /*
 +  * Return failfast requests immediately
 +  */
 + if (req-cmd_flags  REQ_FAILFAST)
 + ret = BLKPREP_KILL;
 + else
 + ret = BLKPREP_DEFER;
 + }
   break;
   default:
   /*

can we please stick to using blk_noretry_request() consistently, instead
of thwrowing REQ_FAILFAST tests in there?


-- 
Jens Axboe

-
To 

Re: 2.6.24-rc4-mm1: hostbyte=0x01 driverbyte=0x00 (now bisected)

2007-12-06 Thread Alexey Dobriyan
On Thu, Dec 06, 2007 at 08:52:29AM +0100, Hannes Reinecke wrote:
 Alexey Dobriyan wrote:
   git-scsi-misc.patch
  
  Apologies for not looking into the problem earlier. See
  http://marc.info/?t=11962802235r=1w=2
  2.6.24-rc3-mm2: Result: hostbyte=0x01 driverbyte=0x00\nend_request: I/O 
  error
  for previous installment.
  
  I've bisected it to the following patch in git-scsi-misc branch.
  Revert on top of 2.6.24-rc4-mm1 also helps.
  
  commit 8655a546c83fc43f0a73416bbd126d02de7ad6c0
  Author: Hannes Reinecke [EMAIL PROTECTED]
  Date:   Tue Nov 6 09:23:40 2007 +0100
  
  [SCSI] Do not requeue requests if REQ_FAILFAST is set
  
  Any requests with the REQ_FAILFAST flag set should not be requeued
  to the requeust queue, but rather terminated directly.
  Otherwise the multipath failover will stall until the command
  timeout triggers.
  
  Signed-off-by: Hannes Reinecke [EMAIL PROTECTED]
  Signed-off-by: James Bottomley [EMAIL PROTECTED]
  
  diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
  index 0f44bdb..0da0dd0 100644
  --- a/drivers/scsi/scsi_lib.c
  +++ b/drivers/scsi/scsi_lib.c
  @@ -1286,6 +1286,11 @@ int scsi_prep_state_check(struct scsi_device *sdev, 
  struct request *req)
   */
  if (!(req-cmd_flags  REQ_PREEMPT))
  ret = BLKPREP_DEFER;
  +   /*
  +* Return failfast requests immediately
  +*/
  +   if (req-cmd_flags  REQ_FAILFAST)
  +   ret = BLKPREP_KILL;
  break;
  default:
  /*
  @@ -1414,6 +1419,17 @@ static inline int scsi_host_queue_ready(struct 
  request_queue *q,
  return 1;
   }
   
  +static void __scsi_kill_request(struct request *req)
  +{
  +   struct scsi_cmnd *cmd = req-special;
  +   struct scsi_device *sdev = cmd-device;
  +
  +   cmd-result = DID_NO_CONNECT  16;
  +   atomic_inc(cmd-device-iorequest_cnt);
  +   sdev-device_busy--;
  +   __scsi_done(cmd);
  +}
  +
   /*
* Kill a request for a dead device
*/
  @@ -1527,8 +1543,16 @@ static void scsi_request_fn(struct request_queue *q)
   * accept it.
   */
  req = elv_next_request(q);
  -   if (!req || !scsi_dev_queue_ready(q, sdev))
  +   if (!req)
  +   break;
  +
  +   if (!scsi_dev_queue_ready(q, sdev)) {
  +   if (req-cmd_flags  REQ_FAILFAST) {
  +   scsi_kill_request(req, q);
  +   continue;
  +   }
  break;
  +   }
   
  if (unlikely(!scsi_device_online(sdev))) {
  sdev_printk(KERN_ERR, sdev,
  @@ -1609,8 +1633,12 @@ static void scsi_request_fn(struct request_queue *q)
   * later time.
   */
  spin_lock_irq(q-queue_lock);
  -   blk_requeue_request(q, req);
  -   sdev-device_busy--;
  +   if (unlikely(req-cmd_flags  REQ_FAILFAST))
  +   __scsi_kill_request(req);
  +   else {
  +   blk_requeue_request(q, req);
  +   sdev-device_busy--;
  +   }
  if(sdev-device_busy == 0)
  blk_plug_device(q);
out:
 Yeah, sorry. That patch was bad. Please use the attached one instead.
 Andrew, can you replace them?

Instead? It won't apply. And it doesn't help on top of git-scsi.
It helps if 3 hunks involving __scsi_kill_request() are ducked.

 --- a/drivers/scsi/scsi_lib.c
 +++ b/drivers/scsi/scsi_lib.c
 @@ -1284,13 +1284,15 @@ int scsi_prep_state_check(struct scsi_device *sdev, 
 struct request *req)
   /*
* If the devices is blocked we defer normal commands.
*/
 - if (!(req-cmd_flags  REQ_PREEMPT))
 - ret = BLKPREP_DEFER;
 - /*
 -  * Return failfast requests immediately
 -  */
 - if (req-cmd_flags  REQ_FAILFAST)
 - ret = BLKPREP_KILL;
 + if (!(req-cmd_flags  REQ_PREEMPT)) {
 + /*
 +  * Return failfast requests immediately
 +  */
 + if (req-cmd_flags  REQ_FAILFAST)
 + ret = BLKPREP_KILL;
 + else
 + ret = BLKPREP_DEFER;
 + }
   break;
   default:
   /*

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


Re: 2.6.24-rc4-mm1: hostbyte=0x01 driverbyte=0x00 (now bisected)

2007-12-05 Thread Hannes Reinecke
Alexey Dobriyan wrote:
  git-scsi-misc.patch
 
 Apologies for not looking into the problem earlier. See
 http://marc.info/?t=11962802235r=1w=2
 2.6.24-rc3-mm2: Result: hostbyte=0x01 driverbyte=0x00\nend_request: I/O 
 error
 for previous installment.
 
 I've bisected it to the following patch in git-scsi-misc branch.
 Revert on top of 2.6.24-rc4-mm1 also helps.
 
 commit 8655a546c83fc43f0a73416bbd126d02de7ad6c0
 Author: Hannes Reinecke [EMAIL PROTECTED]
 Date:   Tue Nov 6 09:23:40 2007 +0100
 
 [SCSI] Do not requeue requests if REQ_FAILFAST is set
 
 Any requests with the REQ_FAILFAST flag set should not be requeued
 to the requeust queue, but rather terminated directly.
 Otherwise the multipath failover will stall until the command
 timeout triggers.
 
 Signed-off-by: Hannes Reinecke [EMAIL PROTECTED]
 Signed-off-by: James Bottomley [EMAIL PROTECTED]
 
 diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
 index 0f44bdb..0da0dd0 100644
 --- a/drivers/scsi/scsi_lib.c
 +++ b/drivers/scsi/scsi_lib.c
 @@ -1286,6 +1286,11 @@ int scsi_prep_state_check(struct scsi_device *sdev, 
 struct request *req)
*/
   if (!(req-cmd_flags  REQ_PREEMPT))
   ret = BLKPREP_DEFER;
 + /*
 +  * Return failfast requests immediately
 +  */
 + if (req-cmd_flags  REQ_FAILFAST)
 + ret = BLKPREP_KILL;
   break;
   default:
   /*
 @@ -1414,6 +1419,17 @@ static inline int scsi_host_queue_ready(struct 
 request_queue *q,
   return 1;
  }
  
 +static void __scsi_kill_request(struct request *req)
 +{
 + struct scsi_cmnd *cmd = req-special;
 + struct scsi_device *sdev = cmd-device;
 +
 + cmd-result = DID_NO_CONNECT  16;
 + atomic_inc(cmd-device-iorequest_cnt);
 + sdev-device_busy--;
 + __scsi_done(cmd);
 +}
 +
  /*
   * Kill a request for a dead device
   */
 @@ -1527,8 +1543,16 @@ static void scsi_request_fn(struct request_queue *q)
* accept it.
*/
   req = elv_next_request(q);
 - if (!req || !scsi_dev_queue_ready(q, sdev))
 + if (!req)
 + break;
 +
 + if (!scsi_dev_queue_ready(q, sdev)) {
 + if (req-cmd_flags  REQ_FAILFAST) {
 + scsi_kill_request(req, q);
 + continue;
 + }
   break;
 + }
  
   if (unlikely(!scsi_device_online(sdev))) {
   sdev_printk(KERN_ERR, sdev,
 @@ -1609,8 +1633,12 @@ static void scsi_request_fn(struct request_queue *q)
* later time.
*/
   spin_lock_irq(q-queue_lock);
 - blk_requeue_request(q, req);
 - sdev-device_busy--;
 + if (unlikely(req-cmd_flags  REQ_FAILFAST))
 + __scsi_kill_request(req);
 + else {
 + blk_requeue_request(q, req);
 + sdev-device_busy--;
 + }
   if(sdev-device_busy == 0)
   blk_plug_device(q);
   out:
Yeah, sorry. That patch was bad. Please use the attached one instead.
Andrew, can you replace them?

Cheers,

Hannes
-- 
Dr. Hannes Reinecke   zSeries  Storage
[EMAIL PROTECTED] +49 911 74053 688
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg
GF: Markus Rex, HRB 16746 (AG Nürnberg)
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index 13e7e09..9ec1566 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -1284,13 +1284,15 @@ int scsi_prep_state_check(struct scsi_device *sdev, 
struct request *req)
/*
 * If the devices is blocked we defer normal commands.
 */
-   if (!(req-cmd_flags  REQ_PREEMPT))
-   ret = BLKPREP_DEFER;
-   /*
-* Return failfast requests immediately
-*/
-   if (req-cmd_flags  REQ_FAILFAST)
-   ret = BLKPREP_KILL;
+   if (!(req-cmd_flags  REQ_PREEMPT)) {
+   /*
+* Return failfast requests immediately
+*/
+   if (req-cmd_flags  REQ_FAILFAST)
+   ret = BLKPREP_KILL;
+   else
+   ret = BLKPREP_DEFER;
+   }
break;
default:
/*