On Tue, May 17, 2016 at 11:28 AM, Johannes Thumshirn <jthumshirn@xxxxxxx> wrote: > On Fri, May 13, 2016 at 12:04:06PM -0700, James Bottomley wrote: >> When SCSI was written, all commands coming from the filesystem >> (REQ_TYPE_FS commands) had data. This meant that our signal for >> needing to complete the command was the number of bytes completed being >> equal to the number of bytes in the request. Unfortunately, with the >> advent of flush barriers, we can now get zero length REQ_TYPE_FS >> commands, which confuse this logic because they satisfy the condition >> every time. This means they never get retried even for retryable >> conditions, like UNIT ATTENTION because we complete them early assuming >> they're done. Fix this by special casing the early completion >> condition to recognise zero length commands with errors and let them >> drop through to the retry code. >> >> Reported-by: Sebastian Parschauer <s.parschauer@xxxxxx> >> Signed-off-by: James E.J. Bottomley <jejb@xxxxxxxxxxxxxxxxxx> >> >> --- >> >> diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c >> index 8106515..f704d02 100644 >> --- a/drivers/scsi/scsi_lib.c >> +++ b/drivers/scsi/scsi_lib.c >> @@ -911,9 +911,12 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes) >> } >> >> /* >> - * If we finished all bytes in the request we are done now. >> + * special case: failed zero length commands always need to >> + * drop down into the retry code. Otherwise, if we finished >> + * all bytes in the request we are done now. >> */ >> - if (!scsi_end_request(req, error, good_bytes, 0)) >> + if (!(blk_rq_bytes(req) == 0 && error) && >> + !scsi_end_request(req, error, good_bytes, 0)) >> return; > > > Naive question, why aren't we checking for blk_rq_bytes(req) == 0 && error in > scsi_end_request()? > Hi Johannes, Hannes also suggested this way, but that lead to BUG see: http://www.spinics.net/lists/linux-scsi/msg96908.html -- Mit freundlichen Grüßen, Best Regards, Jack Wang Linux Kernel Developer Storage ProfitBricks GmbH The IaaS-Company. -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html