Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[linux-2.6-microblaze.git] / drivers / scsi / sd.c
index 93edccb..cea6259 100644 (file)
@@ -1164,11 +1164,12 @@ static blk_status_t sd_setup_read_write_cmnd(struct scsi_cmnd *cmd)
        sector_t lba = sectors_to_logical(sdp, blk_rq_pos(rq));
        sector_t threshold;
        unsigned int nr_blocks = sectors_to_logical(sdp, blk_rq_sectors(rq));
-       bool dif, dix;
        unsigned int mask = logical_to_sectors(sdp, 1) - 1;
        bool write = rq_data_dir(rq) == WRITE;
        unsigned char protect, fua;
        blk_status_t ret;
+       unsigned int dif;
+       bool dix;
 
        ret = scsi_init_io(cmd);
        if (ret != BLK_STS_OK)
@@ -1288,9 +1289,17 @@ static blk_status_t sd_init_command(struct scsi_cmnd *cmd)
        case REQ_OP_WRITE:
                return sd_setup_read_write_cmnd(cmd);
        case REQ_OP_ZONE_RESET:
-               return sd_zbc_setup_reset_cmnd(cmd, false);
+               return sd_zbc_setup_zone_mgmt_cmnd(cmd, ZO_RESET_WRITE_POINTER,
+                                                  false);
        case REQ_OP_ZONE_RESET_ALL:
-               return sd_zbc_setup_reset_cmnd(cmd, true);
+               return sd_zbc_setup_zone_mgmt_cmnd(cmd, ZO_RESET_WRITE_POINTER,
+                                                  true);
+       case REQ_OP_ZONE_OPEN:
+               return sd_zbc_setup_zone_mgmt_cmnd(cmd, ZO_OPEN_ZONE, false);
+       case REQ_OP_ZONE_CLOSE:
+               return sd_zbc_setup_zone_mgmt_cmnd(cmd, ZO_CLOSE_ZONE, false);
+       case REQ_OP_ZONE_FINISH:
+               return sd_zbc_setup_zone_mgmt_cmnd(cmd, ZO_FINISH_ZONE, false);
        default:
                WARN_ON_ONCE(1);
                return BLK_STS_NOTSUPP;
@@ -1691,20 +1700,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
 
@@ -1958,6 +1977,9 @@ static int sd_done(struct scsi_cmnd *SCpnt)
        case REQ_OP_WRITE_SAME:
        case REQ_OP_ZONE_RESET:
        case REQ_OP_ZONE_RESET_ALL:
+       case REQ_OP_ZONE_OPEN:
+       case REQ_OP_ZONE_CLOSE:
+       case REQ_OP_ZONE_FINISH:
                if (!result) {
                        good_bytes = blk_rq_bytes(req);
                        scsi_set_resid(SCpnt, 0);