aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorLinus Torvalds <torvalds@linux-foundation.org>2014-07-31 13:00:42 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2014-07-31 13:00:42 -0400
commit48418bb6e33f6b7f9a306a68414c0f72a2da9181 (patch)
tree157a7beb69186ce50ba6f7c9e555a93a183c2dc7
parent3a1122d26c62d4e8c61ef9a0eaba6e21c0862c77 (diff)
parent89fb4cd1f717a871ef79fa7debbe840e3225cd54 (diff)
Merge tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
Pull SCSI barrier fix from James Bottomley: "This is a potential data corruption fix: If we get an error sending down a barrier, we simply ignore it meaning the barrier semantics get violated without anyone being any the wiser. If the system crashes at this point, the filesystem potentially becomes corrupt. Fix is to report errors on failed barriers" * tag 'scsi-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi: scsi: handle flush errors properly
-rw-r--r--drivers/scsi/scsi_lib.c8
1 files changed, 8 insertions, 0 deletions
diff --git a/drivers/scsi/scsi_lib.c b/drivers/scsi/scsi_lib.c
index f7e316368c99..3f50dfcb3227 100644
--- a/drivers/scsi/scsi_lib.c
+++ b/drivers/scsi/scsi_lib.c
@@ -733,6 +733,14 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
733 scsi_next_command(cmd); 733 scsi_next_command(cmd);
734 return; 734 return;
735 } 735 }
736 } else if (blk_rq_bytes(req) == 0 && result && !sense_deferred) {
737 /*
738 * Certain non BLOCK_PC requests are commands that don't
739 * actually transfer anything (FLUSH), so cannot use
740 * good_bytes != blk_rq_bytes(req) as the signal for an error.
741 * This sets the error explicitly for the problem case.
742 */
743 error = __scsi_error_from_host_byte(cmd, result);
736 } 744 }
737 745
738 /* no bidi support for !REQ_TYPE_BLOCK_PC yet */ 746 /* no bidi support for !REQ_TYPE_BLOCK_PC yet */