[SCSI] fix error handling in scsi_io_completion
authorJames Bottomley <James.Bottomley@steeleye.com>
Sun, 2 Jul 2006 15:06:28 +0000 (10:06 -0500)
committerJames Bottomley <jejb@mulgrave.il.steeleye.com>
Sun, 2 Jul 2006 16:17:19 +0000 (11:17 -0500)
There was a logic fault in scsi_io_completion() where zero transfer
commands that complete successfully were sent to the block layer as
not up to date.  This patch removes the if (good_bytes > 0) gate
around the successful completion, since zero transfer commands do have
good_bytes == 0.

Signed-off-by: James Bottomley <James.Bottomley@SteelEye.com>
drivers/scsi/scsi_lib.c

index bf5191f..08af9aa 100644 (file)
@@ -920,22 +920,20 @@ void scsi_io_completion(struct scsi_cmnd *cmd, unsigned int good_bytes)
         * Next deal with any sectors which we were able to correctly
         * handle.
         */
-       if (good_bytes > 0) {
-               SCSI_LOG_HLCOMPLETE(1, printk("%ld sectors total, "
-                                             "%d bytes done.\n",
-                                             req->nr_sectors, good_bytes));
-               SCSI_LOG_HLCOMPLETE(1, printk("use_sg is %d\n", cmd->use_sg));
-
-               if (clear_errors)
-                       req->errors = 0;
-
-               /* A number of bytes were successfully read.  If there
-                * is leftovers and there is some kind of error
-                * (result != 0), retry the rest.
-                */
-               if (scsi_end_request(cmd, 1, good_bytes, !!result) == NULL)
-                       return;
-       }
+       SCSI_LOG_HLCOMPLETE(1, printk("%ld sectors total, "
+                                     "%d bytes done.\n",
+                                     req->nr_sectors, good_bytes));
+       SCSI_LOG_HLCOMPLETE(1, printk("use_sg is %d\n", cmd->use_sg));
+
+       if (clear_errors)
+               req->errors = 0;
+
+       /* A number of bytes were successfully read.  If there
+        * are leftovers and there is some kind of error
+        * (result != 0), retry the rest.
+        */
+       if (scsi_end_request(cmd, 1, good_bytes, result == 0) == NULL)
+               return;
 
        /* good_bytes = 0, or (inclusive) there were leftovers and
         * result = 0, so scsi_end_request couldn't retry.