"%d bytes done.\n",
                                      req->nr_sectors, good_bytes));
 
-       /* A number of bytes were successfully read.  If there
+       /*
+        * Recovered errors need reporting, but they're always treated
+        * as success, so fiddle the result code here.  For BLOCK_PC
+        * we already took a copy of the original into rq->errors which
+        * is what gets returned to the user
+        */
+       if (sense_valid && sshdr.sense_key == RECOVERED_ERROR) {
+               if (!(req->cmd_flags & REQ_QUIET))
+                       scsi_print_sense("", cmd);
+               result = 0;
+               /* BLOCK_PC may have set error */
+               error = 0;
+       }
+
+       /*
+        * A number of bytes were successfully read.  If there
         * are leftovers and there is some kind of error
         * (result != 0), retry the rest.
         */
 
                good_bytes = sd_completed_bytes(SCpnt);
                break;
        case RECOVERED_ERROR:
-               /* Inform the user, but make sure that it's not treated
-                * as a hard error.
-                */
-               scsi_print_sense("sd", SCpnt);
-               SCpnt->result = 0;
-               memset(SCpnt->sense_buffer, 0, SCSI_SENSE_BUFFERSIZE);
                good_bytes = scsi_bufflen(SCpnt);
                break;
        case NO_SENSE:
 
                        break;
 
                case RECOVERED_ERROR:
-
-                       /*
-                        * An error occured, but it recovered.  Inform the
-                        * user, but make sure that it's not treated as a
-                        * hard error.
-                        */
-                       scsi_print_sense("sr", SCpnt);
-                       SCpnt->result = 0;
-                       SCpnt->sense_buffer[0] = 0x0;
                        good_bytes = this_count;
                        break;