diff options
Diffstat (limited to 'drivers/block/ub.c')
-rw-r--r-- | drivers/block/ub.c | 54 |
1 files changed, 22 insertions, 32 deletions
diff --git a/drivers/block/ub.c b/drivers/block/ub.c index 689cd27ac890..cc54473b8e77 100644 --- a/drivers/block/ub.c +++ b/drivers/block/ub.c | |||
@@ -360,8 +360,7 @@ static void ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | |||
360 | static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | 360 | static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, |
361 | struct ub_scsi_cmd *cmd, struct ub_request *urq); | 361 | struct ub_scsi_cmd *cmd, struct ub_request *urq); |
362 | static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | 362 | static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd); |
363 | static void ub_end_rq(struct request *rq, unsigned int status, | 363 | static void ub_end_rq(struct request *rq, unsigned int status); |
364 | unsigned int cmd_len); | ||
365 | static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun, | 364 | static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun, |
366 | struct ub_request *urq, struct ub_scsi_cmd *cmd); | 365 | struct ub_request *urq, struct ub_scsi_cmd *cmd); |
367 | static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd); | 366 | static int ub_submit_scsi(struct ub_dev *sc, struct ub_scsi_cmd *cmd); |
@@ -627,7 +626,7 @@ static void ub_request_fn(struct request_queue *q) | |||
627 | struct ub_lun *lun = q->queuedata; | 626 | struct ub_lun *lun = q->queuedata; |
628 | struct request *rq; | 627 | struct request *rq; |
629 | 628 | ||
630 | while ((rq = elv_next_request(q)) != NULL) { | 629 | while ((rq = blk_peek_request(q)) != NULL) { |
631 | if (ub_request_fn_1(lun, rq) != 0) { | 630 | if (ub_request_fn_1(lun, rq) != 0) { |
632 | blk_stop_queue(q); | 631 | blk_stop_queue(q); |
633 | break; | 632 | break; |
@@ -643,14 +642,14 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | |||
643 | int n_elem; | 642 | int n_elem; |
644 | 643 | ||
645 | if (atomic_read(&sc->poison)) { | 644 | if (atomic_read(&sc->poison)) { |
646 | blkdev_dequeue_request(rq); | 645 | blk_start_request(rq); |
647 | ub_end_rq(rq, DID_NO_CONNECT << 16, blk_rq_bytes(rq)); | 646 | ub_end_rq(rq, DID_NO_CONNECT << 16); |
648 | return 0; | 647 | return 0; |
649 | } | 648 | } |
650 | 649 | ||
651 | if (lun->changed && !blk_pc_request(rq)) { | 650 | if (lun->changed && !blk_pc_request(rq)) { |
652 | blkdev_dequeue_request(rq); | 651 | blk_start_request(rq); |
653 | ub_end_rq(rq, SAM_STAT_CHECK_CONDITION, blk_rq_bytes(rq)); | 652 | ub_end_rq(rq, SAM_STAT_CHECK_CONDITION); |
654 | return 0; | 653 | return 0; |
655 | } | 654 | } |
656 | 655 | ||
@@ -660,7 +659,7 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | |||
660 | return -1; | 659 | return -1; |
661 | memset(cmd, 0, sizeof(struct ub_scsi_cmd)); | 660 | memset(cmd, 0, sizeof(struct ub_scsi_cmd)); |
662 | 661 | ||
663 | blkdev_dequeue_request(rq); | 662 | blk_start_request(rq); |
664 | 663 | ||
665 | urq = &lun->urq; | 664 | urq = &lun->urq; |
666 | memset(urq, 0, sizeof(struct ub_request)); | 665 | memset(urq, 0, sizeof(struct ub_request)); |
@@ -702,7 +701,7 @@ static int ub_request_fn_1(struct ub_lun *lun, struct request *rq) | |||
702 | 701 | ||
703 | drop: | 702 | drop: |
704 | ub_put_cmd(lun, cmd); | 703 | ub_put_cmd(lun, cmd); |
705 | ub_end_rq(rq, DID_ERROR << 16, blk_rq_bytes(rq)); | 704 | ub_end_rq(rq, DID_ERROR << 16); |
706 | return 0; | 705 | return 0; |
707 | } | 706 | } |
708 | 707 | ||
@@ -723,11 +722,11 @@ static void ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | |||
723 | /* | 722 | /* |
724 | * build the command | 723 | * build the command |
725 | * | 724 | * |
726 | * The call to blk_queue_hardsect_size() guarantees that request | 725 | * The call to blk_queue_logical_block_size() guarantees that request |
727 | * is aligned, but it is given in terms of 512 byte units, always. | 726 | * is aligned, but it is given in terms of 512 byte units, always. |
728 | */ | 727 | */ |
729 | block = rq->sector >> lun->capacity.bshift; | 728 | block = blk_rq_pos(rq) >> lun->capacity.bshift; |
730 | nblks = rq->nr_sectors >> lun->capacity.bshift; | 729 | nblks = blk_rq_sectors(rq) >> lun->capacity.bshift; |
731 | 730 | ||
732 | cmd->cdb[0] = (cmd->dir == UB_DIR_READ)? READ_10: WRITE_10; | 731 | cmd->cdb[0] = (cmd->dir == UB_DIR_READ)? READ_10: WRITE_10; |
733 | /* 10-byte uses 4 bytes of LBA: 2147483648KB, 2097152MB, 2048GB */ | 732 | /* 10-byte uses 4 bytes of LBA: 2147483648KB, 2097152MB, 2048GB */ |
@@ -739,7 +738,7 @@ static void ub_cmd_build_block(struct ub_dev *sc, struct ub_lun *lun, | |||
739 | cmd->cdb[8] = nblks; | 738 | cmd->cdb[8] = nblks; |
740 | cmd->cdb_len = 10; | 739 | cmd->cdb_len = 10; |
741 | 740 | ||
742 | cmd->len = rq->nr_sectors * 512; | 741 | cmd->len = blk_rq_bytes(rq); |
743 | } | 742 | } |
744 | 743 | ||
745 | static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | 744 | static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, |
@@ -747,7 +746,7 @@ static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | |||
747 | { | 746 | { |
748 | struct request *rq = urq->rq; | 747 | struct request *rq = urq->rq; |
749 | 748 | ||
750 | if (rq->data_len == 0) { | 749 | if (blk_rq_bytes(rq) == 0) { |
751 | cmd->dir = UB_DIR_NONE; | 750 | cmd->dir = UB_DIR_NONE; |
752 | } else { | 751 | } else { |
753 | if (rq_data_dir(rq) == WRITE) | 752 | if (rq_data_dir(rq) == WRITE) |
@@ -762,7 +761,7 @@ static void ub_cmd_build_packet(struct ub_dev *sc, struct ub_lun *lun, | |||
762 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); | 761 | memcpy(&cmd->cdb, rq->cmd, rq->cmd_len); |
763 | cmd->cdb_len = rq->cmd_len; | 762 | cmd->cdb_len = rq->cmd_len; |
764 | 763 | ||
765 | cmd->len = rq->data_len; | 764 | cmd->len = blk_rq_bytes(rq); |
766 | 765 | ||
767 | /* | 766 | /* |
768 | * To reapply this to every URB is not as incorrect as it looks. | 767 | * To reapply this to every URB is not as incorrect as it looks. |
@@ -777,16 +776,15 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
777 | struct ub_request *urq = cmd->back; | 776 | struct ub_request *urq = cmd->back; |
778 | struct request *rq; | 777 | struct request *rq; |
779 | unsigned int scsi_status; | 778 | unsigned int scsi_status; |
780 | unsigned int cmd_len; | ||
781 | 779 | ||
782 | rq = urq->rq; | 780 | rq = urq->rq; |
783 | 781 | ||
784 | if (cmd->error == 0) { | 782 | if (cmd->error == 0) { |
785 | if (blk_pc_request(rq)) { | 783 | if (blk_pc_request(rq)) { |
786 | if (cmd->act_len >= rq->data_len) | 784 | if (cmd->act_len >= rq->resid_len) |
787 | rq->data_len = 0; | 785 | rq->resid_len = 0; |
788 | else | 786 | else |
789 | rq->data_len -= cmd->act_len; | 787 | rq->resid_len -= cmd->act_len; |
790 | scsi_status = 0; | 788 | scsi_status = 0; |
791 | } else { | 789 | } else { |
792 | if (cmd->act_len != cmd->len) { | 790 | if (cmd->act_len != cmd->len) { |
@@ -818,17 +816,14 @@ static void ub_rw_cmd_done(struct ub_dev *sc, struct ub_scsi_cmd *cmd) | |||
818 | 816 | ||
819 | urq->rq = NULL; | 817 | urq->rq = NULL; |
820 | 818 | ||
821 | cmd_len = cmd->len; | ||
822 | ub_put_cmd(lun, cmd); | 819 | ub_put_cmd(lun, cmd); |
823 | ub_end_rq(rq, scsi_status, cmd_len); | 820 | ub_end_rq(rq, scsi_status); |
824 | blk_start_queue(lun->disk->queue); | 821 | blk_start_queue(lun->disk->queue); |
825 | } | 822 | } |
826 | 823 | ||
827 | static void ub_end_rq(struct request *rq, unsigned int scsi_status, | 824 | static void ub_end_rq(struct request *rq, unsigned int scsi_status) |
828 | unsigned int cmd_len) | ||
829 | { | 825 | { |
830 | int error; | 826 | int error; |
831 | long rqlen; | ||
832 | 827 | ||
833 | if (scsi_status == 0) { | 828 | if (scsi_status == 0) { |
834 | error = 0; | 829 | error = 0; |
@@ -836,12 +831,7 @@ static void ub_end_rq(struct request *rq, unsigned int scsi_status, | |||
836 | error = -EIO; | 831 | error = -EIO; |
837 | rq->errors = scsi_status; | 832 | rq->errors = scsi_status; |
838 | } | 833 | } |
839 | rqlen = blk_rq_bytes(rq); /* Oddly enough, this is the residue. */ | 834 | __blk_end_request_all(rq, error); |
840 | if (__blk_end_request(rq, error, cmd_len)) { | ||
841 | printk(KERN_WARNING DRV_NAME | ||
842 | ": __blk_end_request blew, %s-cmd total %u rqlen %ld\n", | ||
843 | blk_pc_request(rq)? "pc": "fs", cmd_len, rqlen); | ||
844 | } | ||
845 | } | 835 | } |
846 | 836 | ||
847 | static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun, | 837 | static int ub_rw_cmd_retry(struct ub_dev *sc, struct ub_lun *lun, |
@@ -1759,7 +1749,7 @@ static int ub_bd_revalidate(struct gendisk *disk) | |||
1759 | ub_revalidate(lun->udev, lun); | 1749 | ub_revalidate(lun->udev, lun); |
1760 | 1750 | ||
1761 | /* XXX Support sector size switching like in sr.c */ | 1751 | /* XXX Support sector size switching like in sr.c */ |
1762 | blk_queue_hardsect_size(disk->queue, lun->capacity.bsize); | 1752 | blk_queue_logical_block_size(disk->queue, lun->capacity.bsize); |
1763 | set_capacity(disk, lun->capacity.nsec); | 1753 | set_capacity(disk, lun->capacity.nsec); |
1764 | // set_disk_ro(sdkp->disk, lun->readonly); | 1754 | // set_disk_ro(sdkp->disk, lun->readonly); |
1765 | 1755 | ||
@@ -2334,7 +2324,7 @@ static int ub_probe_lun(struct ub_dev *sc, int lnum) | |||
2334 | blk_queue_max_phys_segments(q, UB_MAX_REQ_SG); | 2324 | blk_queue_max_phys_segments(q, UB_MAX_REQ_SG); |
2335 | blk_queue_segment_boundary(q, 0xffffffff); /* Dubious. */ | 2325 | blk_queue_segment_boundary(q, 0xffffffff); /* Dubious. */ |
2336 | blk_queue_max_sectors(q, UB_MAX_SECTORS); | 2326 | blk_queue_max_sectors(q, UB_MAX_SECTORS); |
2337 | blk_queue_hardsect_size(q, lun->capacity.bsize); | 2327 | blk_queue_logical_block_size(q, lun->capacity.bsize); |
2338 | 2328 | ||
2339 | lun->disk = disk; | 2329 | lun->disk = disk; |
2340 | q->queuedata = lun; | 2330 | q->queuedata = lun; |