]> git.karo-electronics.de Git - karo-tx-linux.git/blobdiff - drivers/scsi/sd.c
Merge tag 'dlm-3.19' of git://git.kernel.org/pub/scm/linux/kernel/git/teigland/linux-dlm
[karo-tx-linux.git] / drivers / scsi / sd.c
index ddf763ad3b83d9d753f5553f1c78f5bf31d9561a..fedab3c21ddf18adcb291a99c49b7b4ac051aa85 100644 (file)
@@ -510,9 +510,9 @@ static const struct dev_pm_ops sd_pm_ops = {
 };
 
 static struct scsi_driver sd_template = {
-       .owner                  = THIS_MODULE,
        .gendrv = {
                .name           = "sd",
+               .owner          = THIS_MODULE,
                .probe          = sd_probe,
                .remove         = sd_remove,
                .shutdown       = sd_shutdown,
@@ -656,7 +656,7 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
        unsigned int logical_block_size = sdkp->device->sector_size;
        unsigned int max_blocks = 0;
 
-       q->limits.discard_zeroes_data = sdkp->lbprz;
+       q->limits.discard_zeroes_data = 0;
        q->limits.discard_alignment = sdkp->unmap_alignment *
                logical_block_size;
        q->limits.discard_granularity =
@@ -680,11 +680,13 @@ static void sd_config_discard(struct scsi_disk *sdkp, unsigned int mode)
        case SD_LBP_WS16:
                max_blocks = min_not_zero(sdkp->max_ws_blocks,
                                          (u32)SD_MAX_WS16_BLOCKS);
+               q->limits.discard_zeroes_data = sdkp->lbprz;
                break;
 
        case SD_LBP_WS10:
                max_blocks = min_not_zero(sdkp->max_ws_blocks,
                                          (u32)SD_MAX_WS10_BLOCKS);
+               q->limits.discard_zeroes_data = sdkp->lbprz;
                break;
 
        case SD_LBP_ZERO:
@@ -784,7 +786,7 @@ static int sd_setup_discard_cmnd(struct scsi_cmnd *cmd)
         * amount of blocks described by the request.
         */
        blk_add_request_payload(rq, page, len);
-       ret = scsi_init_io(cmd, GFP_ATOMIC);
+       ret = scsi_init_io(cmd);
        rq->__data_len = nr_bytes;
 
 out:
@@ -878,7 +880,7 @@ static int sd_setup_write_same_cmnd(struct scsi_cmnd *cmd)
         * knows how much to actually write.
         */
        rq->__data_len = sdp->sector_size;
-       ret = scsi_init_io(cmd, GFP_ATOMIC);
+       ret = scsi_init_io(cmd);
        rq->__data_len = nr_bytes;
        return ret;
 }
@@ -912,7 +914,7 @@ static int sd_setup_read_write_cmnd(struct scsi_cmnd *SCpnt)
        int ret;
        unsigned char protect;
 
-       ret = scsi_init_io(SCpnt, GFP_ATOMIC);
+       ret = scsi_init_io(SCpnt);
        if (ret != BLKPREP_OK)
                goto out;
        SCpnt = rq->special;
@@ -1541,31 +1543,19 @@ 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;
-       int ret;
-
-       ret = scsi_verify_blk_ioctl(bdev, cmd);
-       if (ret < 0)
-               return ret;
+       int error;
 
-       /*
-        * If we are in the middle of error recovery, don't let anyone
-        * else try and use this device.  Also, if error recovery fails, it
-        * may try and take the device offline, in which case all further
-        * access to the device is prohibited.
-        */
-       if (!scsi_block_when_processing_errors(sdev))
-               return -ENODEV;
+       error = scsi_ioctl_block_when_processing_errors(sdev, cmd,
+                       (mode & FMODE_NDELAY) != 0);
+       if (error)
+               return error;
               
-       if (sdev->host->hostt->compat_ioctl) {
-               ret = sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
-
-               return ret;
-       }
-
        /* 
         * Let the static ioctl translation table take care of it.
         */
-       return -ENOIOCTLCMD; 
+       if (!sdev->host->hostt->compat_ioctl)
+               return -ENOIOCTLCMD; 
+       return sdev->host->hostt->compat_ioctl(sdev, cmd, (void __user *)arg);
 }
 #endif
 
@@ -1992,7 +1982,7 @@ static int read_capacity_16(struct scsi_disk *sdkp, struct scsi_device *sdp,
 
        do {
                memset(cmd, 0, 16);
-               cmd[0] = SERVICE_ACTION_IN;
+               cmd[0] = SERVICE_ACTION_IN_16;
                cmd[1] = SAI_READ_CAPACITY_16;
                cmd[13] = RC16_LEN;
                memset(buffer, 0, RC16_LEN);
@@ -2634,12 +2624,12 @@ static void sd_read_block_limits(struct scsi_disk *sdkp)
 
                } else {        /* LBP VPD page tells us what to use */
 
-                       if (sdkp->lbpu && sdkp->max_unmap_blocks)
-                               sd_config_discard(sdkp, SD_LBP_UNMAP);
-                       else if (sdkp->lbpws)
+                       if (sdkp->lbpws)
                                sd_config_discard(sdkp, SD_LBP_WS16);
                        else if (sdkp->lbpws10)
                                sd_config_discard(sdkp, SD_LBP_WS10);
+                       else if (sdkp->lbpu && sdkp->max_unmap_blocks)
+                               sd_config_discard(sdkp, SD_LBP_UNMAP);
                        else
                                sd_config_discard(sdkp, SD_LBP_DISABLE);
                }