summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKees Cook <keescook@chromium.org>2018-08-02 17:22:13 -0400
committerJens Axboe <axboe@kernel.dk>2018-08-02 17:22:13 -0400
commite7d0748dd71695b94f3a35c8bdc05226a7f3d919 (patch)
tree77184457d67207941673fcb9b02648ef2fdbdc1e
parent8a39a0478355e9dfdd2f35038d07c4ebe3192441 (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.c36
-rw-r--r--drivers/cdrom/cdrom.c22
-rw-r--r--drivers/ide/ide-cd.c11
-rw-r--r--drivers/ide/ide-cd.h4
-rw-r--r--drivers/ide/ide-cd_ioctl.c30
-rw-r--r--drivers/scsi/sr_ioctl.c22
-rw-r--r--include/linux/cdrom.h3
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)
748static void pkt_dump_sense(struct pktcdvd_device *pd, 748static 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,
1651static noinline_for_stack int pkt_set_write_settings(struct pktcdvd_device *pd) 1651static 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,
2095static noinline_for_stack int pkt_perform_opc(struct pktcdvd_device *pd) 2095static 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);
345int cdrom_dummy_generic_packet(struct cdrom_device_info *cdi, 345int 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
420int ide_cd_queue_pc(ide_drive_t *drive, const unsigned char *cmd, 420int 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
867int cdrom_check_status(ide_drive_t *drive, struct request_sense *sense) 868int 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
892static int cdrom_read_capacity(ide_drive_t *drive, unsigned long *capacity, 893static 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 */
100int ide_cd_queue_pc(ide_drive_t *, const unsigned char *, int, void *, 100int 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);
102int ide_cd_read_toc(ide_drive_t *); 102int ide_cd_read_toc(ide_drive_t *);
103int ide_cdrom_get_capabilities(ide_drive_t *, u8 *); 103int ide_cdrom_get_capabilities(ide_drive_t *, u8 *);
104void ide_cdrom_update_speed(ide_drive_t *, u8 *); 104void ide_cdrom_update_speed(ide_drive_t *, u8 *);
105int cdrom_check_status(ide_drive_t *, struct request_sense *); 105int cdrom_check_status(ide_drive_t *, struct scsi_sense_hdr *);
106 106
107/* ide-cd_ioctl.c */ 107/* ide-cd_ioctl.c */
108int ide_cdrom_open_real(struct cdrom_device_info *, int); 108int 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)
135static 135static
136int ide_cd_lockdoor(ide_drive_t *drive, int lockflag) 136int 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,
186int sr_do_ioctl(Scsi_CD *cd, struct packet_command *cgc) 186int 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
18struct packet_command 19struct 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;