| From 89fb4cd1f717a871ef79fa7debbe840e3225cd54 Mon Sep 17 00:00:00 2001 |
| From: James Bottomley <JBottomley@Parallels.com> |
| Date: Thu, 3 Jul 2014 19:17:34 +0200 |
| Subject: scsi: handle flush errors properly |
| |
| From: James Bottomley <JBottomley@Parallels.com> |
| |
| commit 89fb4cd1f717a871ef79fa7debbe840e3225cd54 upstream. |
| |
| Flush commands don't transfer data and thus need to be special cased |
| in the I/O completion handler so that we can propagate errors to |
| the block layer and filesystem. |
| |
| Signed-off-by: James Bottomley <JBottomley@Parallels.com> |
| Reported-by: Steven Haber <steven@qumulo.com> |
| Tested-by: Steven Haber <steven@qumulo.com> |
| Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> |
| Signed-off-by: Christoph Hellwig <hch@lst.de> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/scsi/scsi_lib.c | 8 ++++++++ |
| 1 file changed, 8 insertions(+) |
| |
| --- a/drivers/scsi/scsi_lib.c |
| +++ b/drivers/scsi/scsi_lib.c |
| @@ -795,6 +795,14 @@ void scsi_io_completion(struct scsi_cmnd |
| scsi_next_command(cmd); |
| return; |
| } |
| + } else if (blk_rq_bytes(req) == 0 && result && !sense_deferred) { |
| + /* |
| + * Certain non BLOCK_PC requests are commands that don't |
| + * actually transfer anything (FLUSH), so cannot use |
| + * good_bytes != blk_rq_bytes(req) as the signal for an error. |
| + * This sets the error explicitly for the problem case. |
| + */ |
| + error = __scsi_error_from_host_byte(cmd, result); |
| } |
| |
| /* no bidi support for !REQ_TYPE_BLOCK_PC yet */ |