Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[sfrench/cifs-2.6.git] / drivers / scsi / sd.c
index 470ee6dc3f7eb382f4bcc791f9b9ff49c0c621ff..7dc17821f873b772b09fcc1a93f741ffc4050319 100644 (file)
@@ -1702,20 +1702,30 @@ static void sd_rescan(struct device *dev)
 static int sd_compat_ioctl(struct block_device *bdev, fmode_t mode,
                           unsigned int cmd, unsigned long arg)
 {
-       struct scsi_device *sdev = scsi_disk(bdev->bd_disk)->device;
+       struct gendisk *disk = bdev->bd_disk;
+       struct scsi_disk *sdkp = scsi_disk(disk);
+       struct scsi_device *sdev = sdkp->device;
+       void __user *p = compat_ptr(arg);
        int error;
 
+       error = scsi_verify_blk_ioctl(bdev, cmd);
+       if (error < 0)
+               return error;
+
        error = scsi_ioctl_block_when_processing_errors(sdev, cmd,
                        (mode & FMODE_NDELAY) != 0);
        if (error)
                return error;
+
+       if (is_sed_ioctl(cmd))
+               return sed_ioctl(sdkp->opal_dev, cmd, p);
               
        /* 
         * Let the static ioctl translation table take care of it.
         */
        if (!sdev->host->hostt->compat_ioctl)
                return -ENOIOCTLCMD; 
-       return sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
+       return sdev->host->hostt->compat_ioctl(sdev, cmd, p);
 }
 #endif
 
@@ -3380,6 +3390,10 @@ static int sd_probe(struct device *dev)
        }
 
        blk_pm_runtime_init(sdp->request_queue, dev);
+       if (sdp->rpm_autosuspend) {
+               pm_runtime_set_autosuspend_delay(dev,
+                       sdp->host->hostt->rpm_autosuspend_delay);
+       }
        device_add_disk(dev, gd, NULL);
        if (sdkp->capacity)
                sd_dif_config_host(sdkp);