diff options
author | Kees Cook <keescook@chromium.org> | 2018-08-02 17:22:13 -0400 |
---|---|---|
committer | Jens Axboe <axboe@kernel.dk> | 2018-08-02 17:22:13 -0400 |
commit | e7d0748dd71695b94f3a35c8bdc05226a7f3d919 (patch) | |
tree | 77184457d67207941673fcb9b02648ef2fdbdc1e | |
parent | 8a39a0478355e9dfdd2f35038d07c4ebe3192441 (diff) |
block: Switch struct packet_command to use struct scsi_sense_hdr
There is a lot of needless struct request_sense usage in the CDROM
code. These can all be struct scsi_sense_hdr instead, to avoid any
confusion over their respective structure sizes. This patch is a lot
of noise changing "sense" to "sshdr", but the final code is more
readable to distinguish between "sense" meaning "struct request_sense"
and "sshdr" meaning "struct scsi_sense_hdr".
Reviewed-by: Christoph Hellwig <hch@lst.de>
Signed-off-by: Kees Cook <keescook@chromium.org>
Signed-off-by: Jens Axboe <axboe@kernel.dk>
-rw-r--r-- | drivers/block/pktcdvd.c | 36 | ||||
-rw-r--r-- | drivers/cdrom/cdrom.c | 22 | ||||
-rw-r--r-- | drivers/ide/ide-cd.c | 11 | ||||
-rw-r--r-- | drivers/ide/ide-cd.h | 4 | ||||
-rw-r--r-- | drivers/ide/ide-cd_ioctl.c | 30 | ||||
-rw-r--r-- | drivers/scsi/sr_ioctl.c | 22 | ||||
-rw-r--r-- | include/linux/cdrom.h | 3 |
7 files changed, 63 insertions, 65 deletions
diff --git a/drivers/block/pktcdvd.c b/drivers/block/pktcdvd.c index 9bb7721c26fc..e285413d4a75 100644 --- a/drivers/block/pktcdvd.c +++ b/drivers/block/pktcdvd.c | |||
@@ -748,13 +748,13 @@ static const char *sense_key_string(__u8 index) | |||
748 | static void pkt_dump_sense(struct pktcdvd_device *pd, | 748 | static void pkt_dump_sense(struct pktcdvd_device *pd, |
749 | struct packet_command *cgc) | 749 | struct packet_command *cgc) |
750 | { | 750 | { |
751 | struct request_sense *sense = cgc->sense; | 751 | struct scsi_sense_hdr *sshdr = cgc->sshdr; |
752 | 752 | ||
753 | if (sense) | 753 | if (sshdr) |
754 | pkt_err(pd, "%*ph - sense %02x.%02x.%02x (%s)\n", | 754 | pkt_err(pd, "%*ph - sense %02x.%02x.%02x (%s)\n", |
755 | CDROM_PACKET_SIZE, cgc->cmd, | 755 | CDROM_PACKET_SIZE, cgc->cmd, |
756 | sense->sense_key, sense->asc, sense->ascq, | 756 | sshdr->sense_key, sshdr->asc, sshdr->ascq, |
757 | sense_key_string(sense->sense_key)); | 757 | sense_key_string(sshdr->sense_key)); |
758 | else | 758 | else |
759 | pkt_err(pd, "%*ph - no sense\n", CDROM_PACKET_SIZE, cgc->cmd); | 759 | pkt_err(pd, "%*ph - no sense\n", CDROM_PACKET_SIZE, cgc->cmd); |
760 | } | 760 | } |
@@ -787,11 +787,11 @@ static noinline_for_stack int pkt_set_speed(struct pktcdvd_device *pd, | |||
787 | unsigned write_speed, unsigned read_speed) | 787 | unsigned write_speed, unsigned read_speed) |
788 | { | 788 | { |
789 | struct packet_command cgc; | 789 | struct packet_command cgc; |
790 | struct request_sense sense; | 790 | struct scsi_sense_hdr sshdr; |
791 | int ret; | 791 | int ret; |
792 | 792 | ||
793 | init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE); | 793 | init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE); |
794 | cgc.sense = &sense; | 794 | cgc.sshdr = &sshdr; |
795 | cgc.cmd[0] = GPCMD_SET_SPEED; | 795 | cgc.cmd[0] = GPCMD_SET_SPEED; |
796 | cgc.cmd[2] = (read_speed >> 8) & 0xff; | 796 | cgc.cmd[2] = (read_speed >> 8) & 0xff; |
797 | cgc.cmd[3] = read_speed & 0xff; | 797 | cgc.cmd[3] = read_speed & 0xff; |
@@ -1651,7 +1651,7 @@ static noinline_for_stack int pkt_get_last_written(struct pktcdvd_device *pd, | |||
1651 | static noinline_for_stack int pkt_set_write_settings(struct pktcdvd_device *pd) | 1651 | static noinline_for_stack int pkt_set_write_settings(struct pktcdvd_device *pd) |
1652 | { | 1652 | { |
1653 | struct packet_command cgc; | 1653 | struct packet_command cgc; |
1654 | struct request_sense sense; | 1654 | struct scsi_sense_hdr sshdr; |
1655 | write_param_page *wp; | 1655 | write_param_page *wp; |
1656 | char buffer[128]; | 1656 | char buffer[128]; |
1657 | int ret, size; | 1657 | int ret, size; |
@@ -1662,7 +1662,7 @@ static noinline_for_stack int pkt_set_write_settings(struct pktcdvd_device *pd) | |||
1662 | 1662 | ||
1663 | memset(buffer, 0, sizeof(buffer)); | 1663 | memset(buffer, 0, sizeof(buffer)); |
1664 | init_cdrom_command(&cgc, buffer, sizeof(*wp), CGC_DATA_READ); | 1664 | init_cdrom_command(&cgc, buffer, sizeof(*wp), CGC_DATA_READ); |
1665 | cgc.sense = &sense; | 1665 | cgc.sshdr = &sshdr; |
1666 | ret = pkt_mode_sense(pd, &cgc, GPMODE_WRITE_PARMS_PAGE, 0); | 1666 | ret = pkt_mode_sense(pd, &cgc, GPMODE_WRITE_PARMS_PAGE, 0); |
1667 | if (ret) { | 1667 | if (ret) { |
1668 | pkt_dump_sense(pd, &cgc); | 1668 | pkt_dump_sense(pd, &cgc); |
@@ -1678,7 +1678,7 @@ static noinline_for_stack int pkt_set_write_settings(struct pktcdvd_device *pd) | |||
1678 | * now get it all | 1678 | * now get it all |
1679 | */ | 1679 | */ |
1680 | init_cdrom_command(&cgc, buffer, size, CGC_DATA_READ); | 1680 | init_cdrom_command(&cgc, buffer, size, CGC_DATA_READ); |
1681 | cgc.sense = &sense; | 1681 | cgc.sshdr = &sshdr; |
1682 | ret = pkt_mode_sense(pd, &cgc, GPMODE_WRITE_PARMS_PAGE, 0); | 1682 | ret = pkt_mode_sense(pd, &cgc, GPMODE_WRITE_PARMS_PAGE, 0); |
1683 | if (ret) { | 1683 | if (ret) { |
1684 | pkt_dump_sense(pd, &cgc); | 1684 | pkt_dump_sense(pd, &cgc); |
@@ -1916,12 +1916,12 @@ static noinline_for_stack int pkt_write_caching(struct pktcdvd_device *pd, | |||
1916 | int set) | 1916 | int set) |
1917 | { | 1917 | { |
1918 | struct packet_command cgc; | 1918 | struct packet_command cgc; |
1919 | struct request_sense sense; | 1919 | struct scsi_sense_hdr sshdr; |
1920 | unsigned char buf[64]; | 1920 | unsigned char buf[64]; |
1921 | int ret; | 1921 | int ret; |
1922 | 1922 | ||
1923 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ); | 1923 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_READ); |
1924 | cgc.sense = &sense; | 1924 | cgc.sshdr = &sshdr; |
1925 | cgc.buflen = pd->mode_offset + 12; | 1925 | cgc.buflen = pd->mode_offset + 12; |
1926 | 1926 | ||
1927 | /* | 1927 | /* |
@@ -1962,14 +1962,14 @@ static noinline_for_stack int pkt_get_max_speed(struct pktcdvd_device *pd, | |||
1962 | unsigned *write_speed) | 1962 | unsigned *write_speed) |
1963 | { | 1963 | { |
1964 | struct packet_command cgc; | 1964 | struct packet_command cgc; |
1965 | struct request_sense sense; | 1965 | struct scsi_sense_hdr sshdr; |
1966 | unsigned char buf[256+18]; | 1966 | unsigned char buf[256+18]; |
1967 | unsigned char *cap_buf; | 1967 | unsigned char *cap_buf; |
1968 | int ret, offset; | 1968 | int ret, offset; |
1969 | 1969 | ||
1970 | cap_buf = &buf[sizeof(struct mode_page_header) + pd->mode_offset]; | 1970 | cap_buf = &buf[sizeof(struct mode_page_header) + pd->mode_offset]; |
1971 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_UNKNOWN); | 1971 | init_cdrom_command(&cgc, buf, sizeof(buf), CGC_DATA_UNKNOWN); |
1972 | cgc.sense = &sense; | 1972 | cgc.sshdr = &sshdr; |
1973 | 1973 | ||
1974 | ret = pkt_mode_sense(pd, &cgc, GPMODE_CAPABILITIES_PAGE, 0); | 1974 | ret = pkt_mode_sense(pd, &cgc, GPMODE_CAPABILITIES_PAGE, 0); |
1975 | if (ret) { | 1975 | if (ret) { |
@@ -2023,13 +2023,13 @@ static noinline_for_stack int pkt_media_speed(struct pktcdvd_device *pd, | |||
2023 | unsigned *speed) | 2023 | unsigned *speed) |
2024 | { | 2024 | { |
2025 | struct packet_command cgc; | 2025 | struct packet_command cgc; |
2026 | struct request_sense sense; | 2026 | struct scsi_sense_hdr sshdr; |
2027 | unsigned char buf[64]; | 2027 | unsigned char buf[64]; |
2028 | unsigned int size, st, sp; | 2028 | unsigned int size, st, sp; |
2029 | int ret; | 2029 | int ret; |
2030 | 2030 | ||
2031 | init_cdrom_command(&cgc, buf, 2, CGC_DATA_READ); | 2031 | init_cdrom_command(&cgc, buf, 2, CGC_DATA_READ); |
2032 | cgc.sense = &sense; | 2032 | cgc.sshdr = &sshdr; |
2033 | cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; | 2033 | cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; |
2034 | cgc.cmd[1] = 2; | 2034 | cgc.cmd[1] = 2; |
2035 | cgc.cmd[2] = 4; /* READ ATIP */ | 2035 | cgc.cmd[2] = 4; /* READ ATIP */ |
@@ -2044,7 +2044,7 @@ static noinline_for_stack int pkt_media_speed(struct pktcdvd_device *pd, | |||
2044 | size = sizeof(buf); | 2044 | size = sizeof(buf); |
2045 | 2045 | ||
2046 | init_cdrom_command(&cgc, buf, size, CGC_DATA_READ); | 2046 | init_cdrom_command(&cgc, buf, size, CGC_DATA_READ); |
2047 | cgc.sense = &sense; | 2047 | cgc.sshdr = &sshdr; |
2048 | cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; | 2048 | cgc.cmd[0] = GPCMD_READ_TOC_PMA_ATIP; |
2049 | cgc.cmd[1] = 2; | 2049 | cgc.cmd[1] = 2; |
2050 | cgc.cmd[2] = 4; | 2050 | cgc.cmd[2] = 4; |
@@ -2095,13 +2095,13 @@ static noinline_for_stack int pkt_media_speed(struct pktcdvd_device *pd, | |||
2095 | static noinline_for_stack int pkt_perform_opc(struct pktcdvd_device *pd) | 2095 | static noinline_for_stack int pkt_perform_opc(struct pktcdvd_device *pd) |
2096 | { | 2096 | { |
2097 | struct packet_command cgc; | 2097 | struct packet_command cgc; |
2098 | struct request_sense sense; | 2098 | struct scsi_sense_hdr sshdr; |
2099 | int ret; | 2099 | int ret; |
2100 | 2100 | ||
2101 | pkt_dbg(2, pd, "Performing OPC\n"); | 2101 | pkt_dbg(2, pd, "Performing OPC\n"); |
2102 | 2102 | ||
2103 | init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE); | 2103 | init_cdrom_command(&cgc, NULL, 0, CGC_DATA_NONE); |
2104 | cgc.sense = &sense; | 2104 | cgc.sshdr = &sshdr; |
2105 | cgc.timeout = 60*HZ; | 2105 | cgc.timeout = 60*HZ; |
2106 | cgc.cmd[0] = GPCMD_SEND_OPC; | 2106 | cgc.cmd[0] = GPCMD_SEND_OPC; |
2107 | cgc.cmd[1] = 1; | 2107 | cgc.cmd[1] = 1; |
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c index a78b8e7085e9..86619472d916 100644 --- a/drivers/cdrom/cdrom.c +++ b/drivers/cdrom/cdrom.c | |||
@@ -345,10 +345,10 @@ static LIST_HEAD(cdrom_list); | |||
345 | int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi, | 345 | int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi, |
346 | struct packet_command *cgc) | 346 | struct packet_command *cgc) |
347 | { | 347 | { |
348 | if (cgc->sense) { | 348 | if (cgc->sshdr) { |
349 | cgc->sense->sense_key = 0x05; | 349 | cgc->sshdr->sense_key = 0x05; |
350 | cgc->sense->asc = 0x20; | 350 | cgc->sshdr->asc = 0x20; |
351 | cgc->sense->ascq = 0x00; | 351 | cgc->sshdr->ascq = 0x00; |
352 | } | 352 | } |
353 | 353 | ||
354 | cgc->stat = -EIO; | 354 | cgc->stat = -EIO; |
@@ -2943,7 +2943,7 @@ static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, | |||
2943 | struct packet_command *cgc, | 2943 | struct packet_command *cgc, |
2944 | int cmd) | 2944 | int cmd) |
2945 | { | 2945 | { |
2946 | struct request_sense sense; | 2946 | struct scsi_sense_hdr sshdr; |
2947 | struct cdrom_msf msf; | 2947 | struct cdrom_msf msf; |
2948 | int blocksize = 0, format = 0, lba; | 2948 | int blocksize = 0, format = 0, lba; |
2949 | int ret; | 2949 | int ret; |
@@ -2971,13 +2971,13 @@ static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, | |||
2971 | if (cgc->buffer == NULL) | 2971 | if (cgc->buffer == NULL) |
2972 | return -ENOMEM; | 2972 | return -ENOMEM; |
2973 | 2973 | ||
2974 | memset(&sense, 0, sizeof(sense)); | 2974 | memset(&sshdr, 0, sizeof(sshdr)); |
2975 | cgc->sense = &sense; | 2975 | cgc->sshdr = &sshdr; |
2976 | cgc->data_direction = CGC_DATA_READ; | 2976 | cgc->data_direction = CGC_DATA_READ; |
2977 | ret = cdrom_read_block(cdi, cgc, lba, 1, format, blocksize); | 2977 | ret = cdrom_read_block(cdi, cgc, lba, 1, format, blocksize); |
2978 | if (ret && sense.sense_key == 0x05 && | 2978 | if (ret && sshdr.sense_key == 0x05 && |
2979 | sense.asc == 0x20 && | 2979 | sshdr.asc == 0x20 && |
2980 | sense.ascq == 0x00) { | 2980 | sshdr.ascq == 0x00) { |
2981 | /* | 2981 | /* |
2982 | * SCSI-II devices are not required to support | 2982 | * SCSI-II devices are not required to support |
2983 | * READ_CD, so let's try switching block size | 2983 | * READ_CD, so let's try switching block size |
@@ -2986,7 +2986,7 @@ static noinline int mmc_ioctl_cdrom_read_data(struct cdrom_device_info *cdi, | |||
2986 | ret = cdrom_switch_blocksize(cdi, blocksize); | 2986 | ret = cdrom_switch_blocksize(cdi, blocksize); |
2987 | if (ret) | 2987 | if (ret) |
2988 | goto out; | 2988 | goto out; |
2989 | cgc->sense = NULL; | 2989 | cgc->sshdr = NULL; |
2990 | ret = cdrom_read_cd(cdi, cgc, lba, blocksize, 1); | 2990 | ret = cdrom_read_cd(cdi, cgc, lba, blocksize, 1); |
2991 | ret |= cdrom_switch_blocksize(cdi, blocksize); | 2991 | ret |= cdrom_switch_blocksize(cdi, blocksize); |
2992 | } | 2992 | } |
diff --git a/drivers/ide/ide-cd.c b/drivers/ide/ide-cd.c index a37dd381d307..a24cdff01865 100644 --- a/drivers/ide/ide-cd.c +++ b/drivers/ide/ide-cd.c | |||
@@ -419,7 +419,7 @@ static void ide_cd_request_sense_fixup(ide_drive_t *drive, struct ide_cmd *cmd) | |||
419 | 419 | ||
420 | int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | 420 | int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, |
421 | int write, void *buffer, unsigned *bufflen, | 421 | int write, void *buffer, unsigned *bufflen, |
422 | struct request_sense *sense, int timeout, | 422 | struct scsi_sense_hdr *sshdr, int timeout, |
423 | req_flags_t rq_flags) | 423 | req_flags_t rq_flags) |
424 | { | 424 | { |
425 | struct cdrom_info *info = drive->driver_data; | 425 | struct cdrom_info *info = drive->driver_data; |
@@ -456,8 +456,9 @@ int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, | |||
456 | 456 | ||
457 | if (buffer) | 457 | if (buffer) |
458 | *bufflen = scsi_req(rq)->resid_len; | 458 | *bufflen = scsi_req(rq)->resid_len; |
459 | if (sense) | 459 | if (sshdr) |
460 | memcpy(sense, scsi_req(rq)->sense, sizeof(*sense)); | 460 | scsi_normalize_sense(scsi_req(rq)->sense, |
461 | scsi_req(rq)->sense_len, sshdr); | ||
461 | 462 | ||
462 | /* | 463 | /* |
463 | * FIXME: we should probably abort/retry or something in case of | 464 | * FIXME: we should probably abort/retry or something in case of |
@@ -864,7 +865,7 @@ static void msf_from_bcd(struct atapi_msf *msf) | |||
864 | msf->frame = bcd2bin(msf->frame); | 865 | msf->frame = bcd2bin(msf->frame); |
865 | } | 866 | } |
866 | 867 | ||
867 | int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) | 868 | int cdrom_check_status(ide_drive_t *drive, struct scsi_sense_hdr *sshdr) |
868 | { | 869 | { |
869 | struct cdrom_info *info = drive->driver_data; | 870 | struct cdrom_info *info = drive->driver_data; |
870 | struct cdrom_device_info *cdi; | 871 | struct cdrom_device_info *cdi; |
@@ -886,7 +887,7 @@ int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) | |||
886 | */ | 887 | */ |
887 | cmd[7] = cdi->sanyo_slot % 3; | 888 | cmd[7] = cdi->sanyo_slot % 3; |
888 | 889 | ||
889 | return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, sense, 0, RQF_QUIET); | 890 | return ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, sshdr, 0, RQF_QUIET); |
890 | } | 891 | } |
891 | 892 | ||
892 | static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, | 893 | static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, |
diff --git a/drivers/ide/ide-cd.h b/drivers/ide/ide-cd.h index fc162fbb6629..a69dc7f61c4d 100644 --- a/drivers/ide/ide-cd.h +++ b/drivers/ide/ide-cd.h | |||
@@ -98,11 +98,11 @@ void ide_cd_log_error(const char *, struct request *, struct request_sense *); | |||
98 | 98 | ||
99 | /* ide-cd.c functions used by ide-cd_ioctl.c */ | 99 | /* ide-cd.c functions used by ide-cd_ioctl.c */ |
100 | int ide_cd_queue_pc(ide_drive_t *, const unsigned char *, int, void *, | 100 | int ide_cd_queue_pc(ide_drive_t *, const unsigned char *, int, void *, |
101 | unsigned *, struct request_sense *, int, req_flags_t); | 101 | unsigned *, struct scsi_sense_hdr *, int, req_flags_t); |
102 | int ide_cd_read_toc(ide_drive_t *); | 102 | int ide_cd_read_toc(ide_drive_t *); |
103 | int ide_cdrom_get_capabilities(ide_drive_t *, u8 *); | 103 | int ide_cdrom_get_capabilities(ide_drive_t *, u8 *); |
104 | void ide_cdrom_update_speed(ide_drive_t *, u8 *); | 104 | void ide_cdrom_update_speed(ide_drive_t *, u8 *); |
105 | int cdrom_check_status(ide_drive_t *, struct request_sense *); | 105 | int cdrom_check_status(ide_drive_t *, struct scsi_sense_hdr *); |
106 | 106 | ||
107 | /* ide-cd_ioctl.c */ | 107 | /* ide-cd_ioctl.c */ |
108 | int ide_cdrom_open_real(struct cdrom_device_info *, int); | 108 | int ide_cdrom_open_real(struct cdrom_device_info *, int); |
diff --git a/drivers/ide/ide-cd_ioctl.c b/drivers/ide/ide-cd_ioctl.c index 14540544413c..4a6e1a413ead 100644 --- a/drivers/ide/ide-cd_ioctl.c +++ b/drivers/ide/ide-cd_ioctl.c | |||
@@ -43,14 +43,14 @@ int ide_cdrom_drive_status(struct cdrom_device_info *cdi, int slot_nr) | |||
43 | { | 43 | { |
44 | ide_drive_t *drive = cdi->handle; | 44 | ide_drive_t *drive = cdi->handle; |
45 | struct media_event_desc med; | 45 | struct media_event_desc med; |
46 | struct request_sense sense; | 46 | struct scsi_sense_hdr sshdr; |
47 | int stat; | 47 | int stat; |
48 | 48 | ||
49 | if (slot_nr != CDSL_CURRENT) | 49 | if (slot_nr != CDSL_CURRENT) |
50 | return -EINVAL; | 50 | return -EINVAL; |
51 | 51 | ||
52 | stat = cdrom_check_status(drive, &sense); | 52 | stat = cdrom_check_status(drive, &sshdr); |
53 | if (!stat || sense.sense_key == UNIT_ATTENTION) | 53 | if (!stat || sshdr.sense_key == UNIT_ATTENTION) |
54 | return CDS_DISC_OK; | 54 | return CDS_DISC_OK; |
55 | 55 | ||
56 | if (!cdrom_get_media_event(cdi, &med)) { | 56 | if (!cdrom_get_media_event(cdi, &med)) { |
@@ -62,8 +62,8 @@ int ide_cdrom_drive_status(struct cdrom_device_info *cdi, int slot_nr) | |||
62 | return CDS_NO_DISC; | 62 | return CDS_NO_DISC; |
63 | } | 63 | } |
64 | 64 | ||
65 | if (sense.sense_key == NOT_READY && sense.asc == 0x04 | 65 | if (sshdr.sense_key == NOT_READY && sshdr.asc == 0x04 |
66 | && sense.ascq == 0x04) | 66 | && sshdr.ascq == 0x04) |
67 | return CDS_DISC_OK; | 67 | return CDS_DISC_OK; |
68 | 68 | ||
69 | /* | 69 | /* |
@@ -71,8 +71,8 @@ int ide_cdrom_drive_status(struct cdrom_device_info *cdi, int slot_nr) | |||
71 | * just return TRAY_OPEN since ATAPI doesn't provide | 71 | * just return TRAY_OPEN since ATAPI doesn't provide |
72 | * any other way to detect this... | 72 | * any other way to detect this... |
73 | */ | 73 | */ |
74 | if (sense.sense_key == NOT_READY) { | 74 | if (sshdr.sense_key == NOT_READY) { |
75 | if (sense.asc == 0x3a && sense.ascq == 1) | 75 | if (sshdr.asc == 0x3a && sshdr.ascq == 1) |
76 | return CDS_NO_DISC; | 76 | return CDS_NO_DISC; |
77 | else | 77 | else |
78 | return CDS_TRAY_OPEN; | 78 | return CDS_TRAY_OPEN; |
@@ -135,7 +135,7 @@ int cdrom_eject(ide_drive_t *drive, int ejectflag) | |||
135 | static | 135 | static |
136 | int ide_cd_lockdoor(ide_drive_t *drive, int lockflag) | 136 | int ide_cd_lockdoor(ide_drive_t *drive, int lockflag) |
137 | { | 137 | { |
138 | struct request_sense my_sense, *sense = &my_sense; | 138 | struct scsi_sense_hdr sshdr; |
139 | int stat; | 139 | int stat; |
140 | 140 | ||
141 | /* If the drive cannot lock the door, just pretend. */ | 141 | /* If the drive cannot lock the door, just pretend. */ |
@@ -150,14 +150,14 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag) | |||
150 | cmd[4] = lockflag ? 1 : 0; | 150 | cmd[4] = lockflag ? 1 : 0; |
151 | 151 | ||
152 | stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, | 152 | stat = ide_cd_queue_pc(drive, cmd, 0, NULL, NULL, |
153 | sense, 0, 0); | 153 | &sshdr, 0, 0); |
154 | } | 154 | } |
155 | 155 | ||
156 | /* If we got an illegal field error, the drive | 156 | /* If we got an illegal field error, the drive |
157 | probably cannot lock the door. */ | 157 | probably cannot lock the door. */ |
158 | if (stat != 0 && | 158 | if (stat != 0 && |
159 | sense->sense_key == ILLEGAL_REQUEST && | 159 | sshdr.sense_key == ILLEGAL_REQUEST && |
160 | (sense->asc == 0x24 || sense->asc == 0x20)) { | 160 | (sshdr.asc == 0x24 || sshdr.asc == 0x20)) { |
161 | printk(KERN_ERR "%s: door locking not supported\n", | 161 | printk(KERN_ERR "%s: door locking not supported\n", |
162 | drive->name); | 162 | drive->name); |
163 | drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; | 163 | drive->dev_flags &= ~IDE_DFLAG_DOORLOCKING; |
@@ -165,7 +165,7 @@ int ide_cd_lockdoor(ide_drive_t *drive, int lockflag) | |||
165 | } | 165 | } |
166 | 166 | ||
167 | /* no medium, that's alright. */ | 167 | /* no medium, that's alright. */ |
168 | if (stat != 0 && sense->sense_key == NOT_READY && sense->asc == 0x3a) | 168 | if (stat != 0 && sshdr.sense_key == NOT_READY && sshdr.asc == 0x3a) |
169 | stat = 0; | 169 | stat = 0; |
170 | 170 | ||
171 | if (stat == 0) { | 171 | if (stat == 0) { |
@@ -451,8 +451,8 @@ int ide_cdrom_packet(struct cdrom_device_info *cdi, | |||
451 | layer. the packet must be complete, as we do not | 451 | layer. the packet must be complete, as we do not |
452 | touch it at all. */ | 452 | touch it at all. */ |
453 | 453 | ||
454 | if (cgc->sense) | 454 | if (cgc->sshdr) |
455 | memset(cgc->sense, 0, sizeof(struct request_sense)); | 455 | memset(cgc->sshdr, 0, sizeof(*cgc->sshdr)); |
456 | 456 | ||
457 | if (cgc->quiet) | 457 | if (cgc->quiet) |
458 | flags |= RQF_QUIET; | 458 | flags |= RQF_QUIET; |
@@ -460,7 +460,7 @@ int ide_cdrom_packet(struct cdrom_device_info *cdi, | |||
460 | cgc->stat = ide_cd_queue_pc(drive, cgc->cmd, | 460 | cgc->stat = ide_cd_queue_pc(drive, cgc->cmd, |
461 | cgc->data_direction == CGC_DATA_WRITE, | 461 | cgc->data_direction == CGC_DATA_WRITE, |
462 | cgc->buffer, &len, | 462 | cgc->buffer, &len, |
463 | cgc->sense, cgc->timeout, flags); | 463 | cgc->sshdr, cgc->timeout, flags); |
464 | if (!cgc->stat) | 464 | if (!cgc->stat) |
465 | cgc->buflen -= len; | 465 | cgc->buflen -= len; |
466 | return cgc->stat; | 466 | return cgc->stat; |
diff --git a/drivers/scsi/sr_ioctl.c b/drivers/scsi/sr_ioctl.c index 35fab1e18adc..ffcf902da390 100644 --- a/drivers/scsi/sr_ioctl.c +++ b/drivers/scsi/sr_ioctl.c | |||
@@ -186,14 +186,13 @@ static int sr_play_trkind(struct cdrom_device_info *cdi, | |||
186 | int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc) | 186 | int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc) |
187 | { | 187 | { |
188 | struct scsi_device *SDev; | 188 | struct scsi_device *SDev; |
189 | struct scsi_sense_hdr sshdr; | 189 | struct scsi_sense_hdr local_sshdr, *sshdr = &local_sshdr; |
190 | int result, err = 0, retries = 0; | 190 | int result, err = 0, retries = 0; |
191 | unsigned char sense_buffer[SCSI_SENSE_BUFFERSIZE], *senseptr = NULL; | ||
192 | 191 | ||
193 | SDev = cd->device; | 192 | SDev = cd->device; |
194 | 193 | ||
195 | if (cgc->sense) | 194 | if (cgc->sshdr) |
196 | senseptr = sense_buffer; | 195 | sshdr = cgc->sshdr; |
197 | 196 | ||
198 | retry: | 197 | retry: |
199 | if (!scsi_block_when_processing_errors(SDev)) { | 198 | if (!scsi_block_when_processing_errors(SDev)) { |
@@ -202,15 +201,12 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc) | |||
202 | } | 201 | } |
203 | 202 | ||
204 | result = scsi_execute(SDev, cgc->cmd, cgc->data_direction, | 203 | result = scsi_execute(SDev, cgc->cmd, cgc->data_direction, |
205 | cgc->buffer, cgc->buflen, senseptr, &sshdr, | 204 | cgc->buffer, cgc->buflen, NULL, sshdr, |
206 | cgc->timeout, IOCTL_RETRIES, 0, 0, NULL); | 205 | cgc->timeout, IOCTL_RETRIES, 0, 0, NULL); |
207 | 206 | ||
208 | if (cgc->sense) | ||
209 | memcpy(cgc->sense, sense_buffer, sizeof(*cgc->sense)); | ||
210 | |||
211 | /* Minimal error checking. Ignore cases we know about, and report the rest. */ | 207 | /* Minimal error checking. Ignore cases we know about, and report the rest. */ |
212 | if (driver_byte(result) != 0) { | 208 | if (driver_byte(result) != 0) { |
213 | switch (sshdr.sense_key) { | 209 | switch (sshdr->sense_key) { |
214 | case UNIT_ATTENTION: | 210 | case UNIT_ATTENTION: |
215 | SDev->changed = 1; | 211 | SDev->changed = 1; |
216 | if (!cgc->quiet) | 212 | if (!cgc->quiet) |
@@ -221,8 +217,8 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc) | |||
221 | err = -ENOMEDIUM; | 217 | err = -ENOMEDIUM; |
222 | break; | 218 | break; |
223 | case NOT_READY: /* This happens if there is no disc in drive */ | 219 | case NOT_READY: /* This happens if there is no disc in drive */ |
224 | if (sshdr.asc == 0x04 && | 220 | if (sshdr->asc == 0x04 && |
225 | sshdr.ascq == 0x01) { | 221 | sshdr->ascq == 0x01) { |
226 | /* sense: Logical unit is in process of becoming ready */ | 222 | /* sense: Logical unit is in process of becoming ready */ |
227 | if (!cgc->quiet) | 223 | if (!cgc->quiet) |
228 | sr_printk(KERN_INFO, cd, | 224 | sr_printk(KERN_INFO, cd, |
@@ -245,8 +241,8 @@ int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc) | |||
245 | break; | 241 | break; |
246 | case ILLEGAL_REQUEST: | 242 | case ILLEGAL_REQUEST: |
247 | err = -EIO; | 243 | err = -EIO; |
248 | if (sshdr.asc == 0x20 && | 244 | if (sshdr->asc == 0x20 && |
249 | sshdr.ascq == 0x00) | 245 | sshdr->ascq == 0x00) |
250 | /* sense: Invalid command operation code */ | 246 | /* sense: Invalid command operation code */ |
251 | err = -EDRIVE_CANT_DO_THIS; | 247 | err = -EDRIVE_CANT_DO_THIS; |
252 | break; | 248 | break; |
diff --git a/include/linux/cdrom.h b/include/linux/cdrom.h index e75dfd1f1dec..528271c60018 100644 --- a/include/linux/cdrom.h +++ b/include/linux/cdrom.h | |||
@@ -13,6 +13,7 @@ | |||
13 | 13 | ||
14 | #include <linux/fs.h> /* not really needed, later.. */ | 14 | #include <linux/fs.h> /* not really needed, later.. */ |
15 | #include <linux/list.h> | 15 | #include <linux/list.h> |
16 | #include <scsi/scsi_common.h> | ||
16 | #include <uapi/linux/cdrom.h> | 17 | #include <uapi/linux/cdrom.h> |
17 | 18 | ||
18 | struct packet_command | 19 | struct packet_command |
@@ -21,7 +22,7 @@ struct packet_command | |||
21 | unsigned char *buffer; | 22 | unsigned char *buffer; |
22 | unsigned int buflen; | 23 | unsigned int buflen; |
23 | int stat; | 24 | int stat; |
24 | struct request_sense *sense; | 25 | struct scsi_sense_hdr *sshdr; |
25 | unsigned char data_direction; | 26 | unsigned char data_direction; |
26 | int quiet; | 27 | int quiet; |
27 | int timeout; | 28 | int timeout; |