Re: [PATCH] sym53c8xx_2: Set DID_REQUEUE return code when aborting squeue

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



On Sat, Jul 05, 2014 at 11:27:30AM -0400, Mikulas Patocka wrote:
> Hi
> 
> This is backport of commit fd1232b214af43a973443aec6a2808f16ee5bf70. It is 
> suitable for all stable branches up to and including 3.14.*
> 
> Mikulas
> 

Thank you Mikulas, I'll queue this patch for the 3.11 kernel.

Cheers,
--
Luís

> 
> commit fd1232b214af43a973443aec6a2808f16ee5bf70
> Author: Mikulas Patocka <mpatocka@xxxxxxxxxx>
> Date:   Tue Apr 8 21:52:05 2014 -0400
> 
>     sym53c8xx_2: Set DID_REQUEUE return code when aborting squeue
>     
>     This patch fixes I/O errors with the sym53c8xx_2 driver when the disk
>     returns QUEUE FULL status.
>     
>     When the controller encounters an error (including QUEUE FULL or BUSY
>     status), it aborts all not yet submitted requests in the function
>     sym_dequeue_from_squeue.
>     
>     This function aborts them with DID_SOFT_ERROR.
>     
>     If the disk has full tag queue, the request that caused the overflow is
>     aborted with QUEUE FULL status (and the scsi midlayer properly retries
>     it until it is accepted by the disk), but the sym53c8xx_2 driver aborts
>     the following requests with DID_SOFT_ERROR --- for them, the midlayer
>     does just a few retries and then signals the error up to sd.
>     
>     The result is that disk returning QUEUE FULL causes request failures.
>     
>     The error was reproduced on 53c895 with COMPAQ BD03685A24 disk
>     (rebranded ST336607LC) with command queue 48 or 64 tags.  The disk has
>     64 tags, but under some access patterns it return QUEUE FULL when there
>     are less than 64 pending tags.  The SCSI specification allows returning
>     QUEUE FULL anytime and it is up to the host to retry.
>     
>     Signed-off-by: Mikulas Patocka <mpatocka@xxxxxxxxxx>
>     Cc: Matthew Wilcox <matthew@xxxxxx>
>     Cc: James Bottomley <JBottomley@xxxxxxxxxxxxx>
>     Signed-off-by: Linus Torvalds <torvalds@xxxxxxxxxxxxxxxxxxxx>
> 
> diff --git a/drivers/scsi/sym53c8xx_2/sym_hipd.c b/drivers/scsi/sym53c8xx_2/sym_hipd.c
> index d92fe40..6b349e3 100644
> --- a/drivers/scsi/sym53c8xx_2/sym_hipd.c
> +++ b/drivers/scsi/sym53c8xx_2/sym_hipd.c
> @@ -3000,7 +3000,11 @@ sym_dequeue_from_squeue(struct sym_hcb *np, int i, int target, int lun, int task
>  		if ((target == -1 || cp->target == target) &&
>  		    (lun    == -1 || cp->lun    == lun)    &&
>  		    (task   == -1 || cp->tag    == task)) {
> +#ifdef SYM_OPT_HANDLE_DEVICE_QUEUEING
>  			sym_set_cam_status(cp->cmd, DID_SOFT_ERROR);
> +#else
> +			sym_set_cam_status(cp->cmd, DID_REQUEUE);
> +#endif
>  			sym_remque(&cp->link_ccbq);
>  			sym_insque_tail(&cp->link_ccbq, &np->comp_ccbq);
>  		}
--
To unsubscribe from this list: send the line "unsubscribe stable" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Kernel]     [Kernel Development Newbies]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite Hiking]     [Linux Kernel]     [Linux SCSI]