Merge branch 'postmerge' into for-linus
authorJames Bottomley <JBottomley@Parallels.com>
Fri, 10 May 2013 14:54:01 +0000 (07:54 -0700)
committerJames Bottomley <JBottomley@Parallels.com>
Fri, 10 May 2013 14:54:01 +0000 (07:54 -0700)
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
1  2 
drivers/scsi/sd.c

diff --combined drivers/scsi/sd.c
@@@ -142,7 -142,6 +142,7 @@@ sd_store_cache_type(struct device *dev
        char *buffer_data;
        struct scsi_mode_data data;
        struct scsi_sense_hdr sshdr;
 +      const char *temp = "temporary ";
        int len;
  
        if (sdp->type != TYPE_DISK)
                 * it's not worth the risk */
                return -EINVAL;
  
 +      if (strncmp(buf, temp, sizeof(temp) - 1) == 0) {
 +              buf += sizeof(temp) - 1;
 +              sdkp->cache_override = 1;
 +      } else {
 +              sdkp->cache_override = 0;
 +      }
 +
        for (i = 0; i < ARRAY_SIZE(sd_cache_types); i++) {
                len = strlen(sd_cache_types[i]);
                if (strncmp(sd_cache_types[i], buf, len) == 0 &&
                return -EINVAL;
        rcd = ct & 0x01 ? 1 : 0;
        wce = ct & 0x02 ? 1 : 0;
 +
 +      if (sdkp->cache_override) {
 +              sdkp->WCE = wce;
 +              sdkp->RCD = rcd;
 +              return count;
 +      }
 +
        if (scsi_mode_sense(sdp, 0x08, 8, buffer, sizeof(buffer), SD_TIMEOUT,
                            SD_MAX_RETRIES, &data, NULL))
                return -EINVAL;
@@@ -1136,10 -1121,6 +1136,6 @@@ static int sd_open(struct block_device 
  
        sdev = sdkp->device;
  
-       retval = scsi_autopm_get_device(sdev);
-       if (retval)
-               goto error_autopm;
        /*
         * If the device is in error recovery, wait until it is done.
         * If the device is offline, then disallow any access to it.
        return 0;
  
  error_out:
-       scsi_autopm_put_device(sdev);
- error_autopm:
        scsi_disk_put(sdkp);
        return retval;  
  }
   *
   *    Locking: called with bdev->bd_mutex held.
   **/
 -static int sd_release(struct gendisk *disk, fmode_t mode)
 +static void sd_release(struct gendisk *disk, fmode_t mode)
  {
        struct scsi_disk *sdkp = scsi_disk(disk);
        struct scsi_device *sdev = sdkp->device;
         * XXX is followed by a "rmmod sd_mod"?
         */
  
-       scsi_autopm_put_device(sdev);
        scsi_disk_put(sdkp);
 -      return 0;
  }
  
  static int sd_getgeo(struct block_device *bdev, struct hd_geometry *geo)
@@@ -1381,14 -1360,9 +1374,9 @@@ static unsigned int sd_check_events(str
        retval = -ENODEV;
  
        if (scsi_block_when_processing_errors(sdp)) {
-               retval = scsi_autopm_get_device(sdp);
-               if (retval)
-                       goto out;
                sshdr  = kzalloc(sizeof(*sshdr), GFP_KERNEL);
                retval = scsi_test_unit_ready(sdp, SD_TIMEOUT, SD_MAX_RETRIES,
                                              sshdr);
-               scsi_autopm_put_device(sdp);
        }
  
        /* failed to execute TUR, assume media not present */
@@@ -1438,8 -1412,9 +1426,9 @@@ static int sd_sync_cache(struct scsi_di
                 * Leave the rest of the command zero to indicate
                 * flush everything.
                 */
-               res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr,
-                                      SD_FLUSH_TIMEOUT, SD_MAX_RETRIES, NULL);
+               res = scsi_execute_req_flags(sdp, cmd, DMA_NONE, NULL, 0,
+                                            &sshdr, SD_FLUSH_TIMEOUT,
+                                            SD_MAX_RETRIES, NULL, REQ_PM);
                if (res == 0)
                        break;
        }
@@@ -2333,10 -2308,6 +2322,10 @@@ sd_read_cache_type(struct scsi_disk *sd
        int old_rcd = sdkp->RCD;
        int old_dpofua = sdkp->DPOFUA;
  
 +
 +      if (sdkp->cache_override)
 +              return;
 +
        first_len = 4;
        if (sdp->skip_ms_page_8) {
                if (sdp->type == TYPE_RBC)
@@@ -2830,7 -2801,6 +2819,7 @@@ static void sd_probe_async(void *data, 
        sdkp->capacity = 0;
        sdkp->media_present = 1;
        sdkp->write_prot = 0;
 +      sdkp->cache_override = 0;
        sdkp->WCE = 0;
        sdkp->RCD = 0;
        sdkp->ATO = 0;
  
        sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n",
                  sdp->removable ? "removable " : "");
+       blk_pm_runtime_init(sdp->request_queue, dev);
        scsi_autopm_put_device(sdp);
        put_device(&sdkp->dev);
  }
@@@ -3040,8 -3011,8 +3030,8 @@@ static int sd_start_stop_device(struct 
        if (!scsi_device_online(sdp))
                return -ENODEV;
  
-       res = scsi_execute_req(sdp, cmd, DMA_NONE, NULL, 0, &sshdr,
-                              SD_TIMEOUT, SD_MAX_RETRIES, NULL);
+       res = scsi_execute_req_flags(sdp, cmd, DMA_NONE, NULL, 0, &sshdr,
+                              SD_TIMEOUT, SD_MAX_RETRIES, NULL, REQ_PM);
        if (res) {
                sd_printk(KERN_WARNING, sdkp, "START_STOP FAILED\n");
                sd_print_result(sdkp, res);