Merge branch 'async-scsi-resume' of git://git.kernel.org/pub/scm/linux/kernel/git...
[linux.git] / drivers / scsi / sd.c
index 470954aba7289a758a650cd82b2f1dfe50ae54f1..efcbcd182863318f296936bc7fa16c96bc58efe5 100644 (file)
@@ -1463,8 +1463,8 @@ static int sd_sync_cache(struct scsi_disk *sdkp)
                        sd_print_sense_hdr(sdkp, &sshdr);
                /* we need to evaluate the error return  */
                if (scsi_sense_valid(&sshdr) &&
-                       /* 0x3a is medium not present */
-                       sshdr.asc == 0x3a)
+                       (sshdr.asc == 0x3a ||   /* medium not present */
+                        sshdr.asc == 0x20))    /* invalid command */
                                /* this is no error here */
                                return 0;
 
@@ -2281,7 +2281,7 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
 
        set_disk_ro(sdkp->disk, 0);
        if (sdp->skip_ms_page_3f) {
-               sd_printk(KERN_NOTICE, sdkp, "Assuming Write Enabled\n");
+               sd_first_printk(KERN_NOTICE, sdkp, "Assuming Write Enabled\n");
                return;
        }
 
@@ -2313,7 +2313,7 @@ sd_read_write_protect_flag(struct scsi_disk *sdkp, unsigned char *buffer)
        }
 
        if (!scsi_status_is_good(res)) {
-               sd_printk(KERN_WARNING, sdkp,
+               sd_first_printk(KERN_WARNING, sdkp,
                          "Test WP failed, assume Write Enabled\n");
        } else {
                sdkp->write_prot = ((data.device_specific & 0x80) != 0);
@@ -2381,7 +2381,8 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
        if (!data.header_length) {
                modepage = 6;
                first_len = 0;
-               sd_printk(KERN_ERR, sdkp, "Missing header in MODE_SENSE response\n");
+               sd_first_printk(KERN_ERR, sdkp,
+                               "Missing header in MODE_SENSE response\n");
        }
 
        /* that went OK, now ask for the proper length */
@@ -2394,7 +2395,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
        if (len < 3)
                goto bad_sense;
        else if (len > SD_BUF_SIZE) {
-               sd_printk(KERN_NOTICE, sdkp, "Truncating mode parameter "
+               sd_first_printk(KERN_NOTICE, sdkp, "Truncating mode parameter "
                          "data from %d to %d bytes\n", len, SD_BUF_SIZE);
                len = SD_BUF_SIZE;
        }
@@ -2417,8 +2418,9 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
                                /* We're interested only in the first 3 bytes.
                                 */
                                if (len - offset <= 2) {
-                                       sd_printk(KERN_ERR, sdkp, "Incomplete "
-                                                 "mode parameter data\n");
+                                       sd_first_printk(KERN_ERR, sdkp,
+                                               "Incomplete mode parameter "
+                                                       "data\n");
                                        goto defaults;
                                } else {
                                        modepage = page_code;
@@ -2432,14 +2434,15 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
                                else if (!spf && len - offset > 1)
                                        offset += 2 + buffer[offset+1];
                                else {
-                                       sd_printk(KERN_ERR, sdkp, "Incomplete "
-                                                 "mode parameter data\n");
+                                       sd_first_printk(KERN_ERR, sdkp,
+                                                       "Incomplete mode "
+                                                       "parameter data\n");
                                        goto defaults;
                                }
                        }
                }
 
-               sd_printk(KERN_ERR, sdkp, "No Caching mode page found\n");
+               sd_first_printk(KERN_ERR, sdkp, "No Caching mode page found\n");
                goto defaults;
 
        Page_found:
@@ -2453,7 +2456,7 @@ sd_read_cache_type(struct scsi_disk *sdkp, unsigned char *buffer)
 
                sdkp->DPOFUA = (data.device_specific & 0x10) != 0;
                if (sdkp->DPOFUA && !sdkp->device->use_10_for_rw) {
-                       sd_printk(KERN_NOTICE, sdkp,
+                       sd_first_printk(KERN_NOTICE, sdkp,
                                  "Uses READ/WRITE(6), disabling FUA\n");
                        sdkp->DPOFUA = 0;
                }
@@ -2475,16 +2478,19 @@ bad_sense:
            sshdr.sense_key == ILLEGAL_REQUEST &&
            sshdr.asc == 0x24 && sshdr.ascq == 0x0)
                /* Invalid field in CDB */
-               sd_printk(KERN_NOTICE, sdkp, "Cache data unavailable\n");
+               sd_first_printk(KERN_NOTICE, sdkp, "Cache data unavailable\n");
        else
-               sd_printk(KERN_ERR, sdkp, "Asking for cache data failed\n");
+               sd_first_printk(KERN_ERR, sdkp,
+                               "Asking for cache data failed\n");
 
 defaults:
        if (sdp->wce_default_on) {
-               sd_printk(KERN_NOTICE, sdkp, "Assuming drive cache: write back\n");
+               sd_first_printk(KERN_NOTICE, sdkp,
+                               "Assuming drive cache: write back\n");
                sdkp->WCE = 1;
        } else {
-               sd_printk(KERN_ERR, sdkp, "Assuming drive cache: write through\n");
+               sd_first_printk(KERN_ERR, sdkp,
+                               "Assuming drive cache: write through\n");
                sdkp->WCE = 0;
        }
        sdkp->RCD = 0;
@@ -2513,7 +2519,7 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
 
        if (!scsi_status_is_good(res) || !data.header_length ||
            data.length < 6) {
-               sd_printk(KERN_WARNING, sdkp,
+               sd_first_printk(KERN_WARNING, sdkp,
                          "getting Control mode page failed, assume no ATO\n");
 
                if (scsi_sense_valid(&sshdr))
@@ -2525,7 +2531,7 @@ static void sd_read_app_tag_own(struct scsi_disk *sdkp, unsigned char *buffer)
        offset = data.header_length + data.block_descriptor_length;
 
        if ((buffer[offset] & 0x3f) != 0x0a) {
-               sd_printk(KERN_ERR, sdkp, "ATO Got wrong page\n");
+               sd_first_printk(KERN_ERR, sdkp, "ATO Got wrong page\n");
                return;
        }
 
@@ -3020,6 +3026,7 @@ static int sd_remove(struct device *dev)
        devt = disk_devt(sdkp->disk);
        scsi_autopm_get_device(sdkp->device);
 
+       async_synchronize_full_domain(&scsi_sd_pm_domain);
        async_synchronize_full_domain(&scsi_sd_probe_domain);
        blk_queue_prep_rq(sdkp->device->request_queue, scsi_prep_fn);
        blk_queue_unprep_rq(sdkp->device->request_queue, NULL);