]> git.kernelconcepts.de Git - karo-tx-linux.git/blobdiff - drivers/scsi/sd_zbc.c
Merge tag 'scsi-misc' of git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi
[karo-tx-linux.git] / drivers / scsi / sd_zbc.c
index 1994f7799fceddfb7705a6ab4b36a370ece0fcbd..96855df9f49ddf3756b8fc6ee98b127727d9bbeb 100644 (file)
@@ -237,7 +237,6 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
        struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
        sector_t sector = blk_rq_pos(rq);
        sector_t block = sectors_to_logical(sdkp->device, sector);
-       unsigned int zno = block >> sdkp->zone_shift;
 
        if (!sd_is_zoned(sdkp))
                /* Not a zoned device */
@@ -250,11 +249,6 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
                /* Unaligned request */
                return BLKPREP_KILL;
 
-       /* Do not allow concurrent reset and writes */
-       if (sdkp->zones_wlock &&
-           test_and_set_bit(zno, sdkp->zones_wlock))
-               return BLKPREP_DEFER;
-
        cmd->cmd_len = 16;
        memset(cmd->cmnd, 0, cmd->cmd_len);
        cmd->cmnd[0] = ZBC_OUT;
@@ -269,7 +263,7 @@ int sd_zbc_setup_reset_cmnd(struct scsi_cmnd *cmd)
        return BLKPREP_OK;
 }
 
-int sd_zbc_setup_write_cmnd(struct scsi_cmnd *cmd)
+int sd_zbc_write_lock_zone(struct scsi_cmnd *cmd)
 {
        struct request *rq = cmd->request;
        struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
@@ -303,8 +297,9 @@ int sd_zbc_setup_write_cmnd(struct scsi_cmnd *cmd)
        return BLKPREP_OK;
 }
 
-static void sd_zbc_unlock_zone(struct request *rq)
+void sd_zbc_write_unlock_zone(struct scsi_cmnd *cmd)
 {
+       struct request *rq = cmd->request;
        struct scsi_disk *sdkp = scsi_disk(rq->rq_disk);
 
        if (sdkp->zones_wlock) {
@@ -315,11 +310,6 @@ static void sd_zbc_unlock_zone(struct request *rq)
        }
 }
 
-void sd_zbc_cancel_write_cmnd(struct scsi_cmnd *cmd)
-{
-       sd_zbc_unlock_zone(cmd->request);
-}
-
 void sd_zbc_complete(struct scsi_cmnd *cmd,
                     unsigned int good_bytes,
                     struct scsi_sense_hdr *sshdr)
@@ -328,39 +318,35 @@ void sd_zbc_complete(struct scsi_cmnd *cmd,
        struct request *rq = cmd->request;
 
        switch (req_op(rq)) {
+       case REQ_OP_ZONE_RESET:
+
+               if (result &&
+                   sshdr->sense_key == ILLEGAL_REQUEST &&
+                   sshdr->asc == 0x24)
+                       /*
+                        * INVALID FIELD IN CDB error: reset of a conventional
+                        * zone was attempted. Nothing to worry about, so be
+                        * quiet about the error.
+                        */
+                       rq->rq_flags |= RQF_QUIET;
+               break;
+
        case REQ_OP_WRITE:
        case REQ_OP_WRITE_ZEROES:
        case REQ_OP_WRITE_SAME:
-       case REQ_OP_ZONE_RESET:
 
                /* Unlock the zone */
-               sd_zbc_unlock_zone(rq);
+               sd_zbc_write_unlock_zone(cmd);
 
-               if (!result ||
-                   sshdr->sense_key != ILLEGAL_REQUEST)
-                       break;
-
-               switch (sshdr->asc) {
-               case 0x24:
-                       /*
-                        * INVALID FIELD IN CDB error: For a zone reset,
-                        * this means that a reset of a conventional
-                        * zone was attempted. Nothing to worry about in
-                        * this case, so be quiet about the error.
-                        */
-                       if (req_op(rq) == REQ_OP_ZONE_RESET)
-                               rq->rq_flags |= RQF_QUIET;
-                       break;
-               case 0x21:
+               if (result &&
+                   sshdr->sense_key == ILLEGAL_REQUEST &&
+                   sshdr->asc == 0x21)
                        /*
                         * INVALID ADDRESS FOR WRITE error: It is unlikely that
                         * retrying write requests failed with any kind of
                         * alignement error will result in success. So don't.
                         */
                        cmd->allowed = 0;
-                       break;
-               }
-
                break;
 
        case REQ_OP_ZONE_REPORT:
@@ -565,8 +551,7 @@ static int sd_zbc_setup(struct scsi_disk *sdkp)
 int sd_zbc_read_zones(struct scsi_disk *sdkp,
                      unsigned char *buf)
 {
-       sector_t capacity;
-       int ret = 0;
+       int ret;
 
        if (!sd_is_zoned(sdkp))
                /*
@@ -598,7 +583,6 @@ int sd_zbc_read_zones(struct scsi_disk *sdkp,
        ret = sd_zbc_check_capacity(sdkp, buf);
        if (ret)
                goto err;
-       capacity = logical_to_sectors(sdkp->device, sdkp->capacity);
 
        /*
         * Check zone size: only devices with a constant zone size (except