1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19#include <linux/kernel.h>
20#include <linux/errno.h>
21#include <linux/string.h>
22#include <linux/module.h>
23#include <linux/blkdev.h>
24#include <linux/capability.h>
25#include <linux/completion.h>
26#include <linux/cdrom.h>
27#include <linux/slab.h>
28#include <linux/times.h>
29#include <asm/uaccess.h>
30
31#include <scsi/scsi.h>
32#include <scsi/scsi_ioctl.h>
33#include <scsi/scsi_cmnd.h>
34
35
36const unsigned char scsi_command_size[8] =
37{
38 6, 10, 10, 12,
39 16, 12, 10, 10
40};
41
42EXPORT_SYMBOL(scsi_command_size);
43
44#define BLK_DEFAULT_TIMEOUT (60 * HZ)
45
46#include <scsi/sg.h>
47
48static int sg_get_version(int __user *p)
49{
50 static const int sg_version_num = 30527;
51 return put_user(sg_version_num, p);
52}
53
54static int scsi_get_idlun(request_queue_t *q, int __user *p)
55{
56 return put_user(0, p);
57}
58
59static int scsi_get_bus(request_queue_t *q, int __user *p)
60{
61 return put_user(0, p);
62}
63
64static int sg_get_timeout(request_queue_t *q)
65{
66 return q->sg_timeout / (HZ / USER_HZ);
67}
68
69static int sg_set_timeout(request_queue_t *q, int __user *p)
70{
71 int timeout, err = get_user(timeout, p);
72
73 if (!err)
74 q->sg_timeout = timeout * (HZ / USER_HZ);
75
76 return err;
77}
78
79static int sg_get_reserved_size(request_queue_t *q, int __user *p)
80{
81 return put_user(q->sg_reserved_size, p);
82}
83
84static int sg_set_reserved_size(request_queue_t *q, int __user *p)
85{
86 int size, err = get_user(size, p);
87
88 if (err)
89 return err;
90
91 if (size < 0)
92 return -EINVAL;
93 if (size > (q->max_sectors << 9))
94 size = q->max_sectors << 9;
95
96 q->sg_reserved_size = size;
97 return 0;
98}
99
100
101
102
103
104static int sg_emulated_host(request_queue_t *q, int __user *p)
105{
106 return put_user(1, p);
107}
108
109#define CMD_READ_SAFE 0x01
110#define CMD_WRITE_SAFE 0x02
111#define CMD_WARNED 0x04
112#define safe_for_read(cmd) [cmd] = CMD_READ_SAFE
113#define safe_for_write(cmd) [cmd] = CMD_WRITE_SAFE
114
115static int verify_command(struct file *file, unsigned char *cmd)
116{
117 static unsigned char cmd_type[256] = {
118
119
120 safe_for_read(TEST_UNIT_READY),
121 safe_for_read(REQUEST_SENSE),
122 safe_for_read(READ_6),
123 safe_for_read(READ_10),
124 safe_for_read(READ_12),
125 safe_for_read(READ_16),
126 safe_for_read(READ_BUFFER),
127 safe_for_read(READ_DEFECT_DATA),
128 safe_for_read(READ_LONG),
129 safe_for_read(INQUIRY),
130 safe_for_read(MODE_SENSE),
131 safe_for_read(MODE_SENSE_10),
132 safe_for_read(LOG_SENSE),
133 safe_for_read(START_STOP),
134 safe_for_read(GPCMD_VERIFY_10),
135 safe_for_read(VERIFY_16),
136
137
138 safe_for_read(GPCMD_PLAY_CD),
139 safe_for_read(GPCMD_PLAY_AUDIO_10),
140 safe_for_read(GPCMD_PLAY_AUDIO_MSF),
141 safe_for_read(GPCMD_PLAY_AUDIO_TI),
142 safe_for_read(GPCMD_PAUSE_RESUME),
143
144
145 safe_for_read(GPCMD_READ_BUFFER_CAPACITY),
146 safe_for_read(GPCMD_READ_CD),
147 safe_for_read(GPCMD_READ_CD_MSF),
148 safe_for_read(GPCMD_READ_DISC_INFO),
149 safe_for_read(GPCMD_READ_CDVD_CAPACITY),
150 safe_for_read(GPCMD_READ_DVD_STRUCTURE),
151 safe_for_read(GPCMD_READ_HEADER),
152 safe_for_read(GPCMD_READ_TRACK_RZONE_INFO),
153 safe_for_read(GPCMD_READ_SUBCHANNEL),
154 safe_for_read(GPCMD_READ_TOC_PMA_ATIP),
155 safe_for_read(GPCMD_REPORT_KEY),
156 safe_for_read(GPCMD_SCAN),
157 safe_for_read(GPCMD_GET_CONFIGURATION),
158 safe_for_read(GPCMD_READ_FORMAT_CAPACITIES),
159 safe_for_read(GPCMD_GET_EVENT_STATUS_NOTIFICATION),
160 safe_for_read(GPCMD_GET_PERFORMANCE),
161 safe_for_read(GPCMD_SEEK),
162 safe_for_read(GPCMD_STOP_PLAY_SCAN),
163
164
165 safe_for_write(WRITE_6),
166 safe_for_write(WRITE_10),
167 safe_for_write(WRITE_VERIFY),
168 safe_for_write(WRITE_12),
169 safe_for_write(WRITE_VERIFY_12),
170 safe_for_write(WRITE_16),
171 safe_for_write(WRITE_LONG),
172 safe_for_write(WRITE_LONG_2),
173 safe_for_write(ERASE),
174 safe_for_write(GPCMD_MODE_SELECT_10),
175 safe_for_write(MODE_SELECT),
176 safe_for_write(LOG_SELECT),
177 safe_for_write(GPCMD_BLANK),
178 safe_for_write(GPCMD_CLOSE_TRACK),
179 safe_for_write(GPCMD_FLUSH_CACHE),
180 safe_for_write(GPCMD_FORMAT_UNIT),
181 safe_for_write(GPCMD_REPAIR_RZONE_TRACK),
182 safe_for_write(GPCMD_RESERVE_RZONE_TRACK),
183 safe_for_write(GPCMD_SEND_DVD_STRUCTURE),
184 safe_for_write(GPCMD_SEND_EVENT),
185 safe_for_write(GPCMD_SEND_KEY),
186 safe_for_write(GPCMD_SEND_OPC),
187 safe_for_write(GPCMD_SEND_CUE_SHEET),
188 safe_for_write(GPCMD_SET_SPEED),
189 safe_for_write(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL),
190 safe_for_write(GPCMD_LOAD_UNLOAD),
191 safe_for_write(GPCMD_SET_STREAMING),
192 };
193 unsigned char type = cmd_type[cmd[0]];
194 int has_write_perm = 0;
195
196
197 if (type & CMD_READ_SAFE)
198 return 0;
199
200
201
202
203 if (file)
204 has_write_perm = file->f_mode & FMODE_WRITE;
205
206
207 if ((type & CMD_WRITE_SAFE) && has_write_perm)
208 return 0;
209
210
211 if (capable(CAP_SYS_RAWIO))
212 return 0;
213
214 if (!type) {
215 cmd_type[cmd[0]] = CMD_WARNED;
216 printk(KERN_WARNING "scsi: unknown opcode 0x%02x\n", cmd[0]);
217 }
218
219
220 return -EPERM;
221}
222
223static int sg_io(struct file *file, request_queue_t *q,
224 struct gendisk *bd_disk, struct sg_io_hdr *hdr)
225{
226 unsigned long start_time;
227 int writing = 0, ret = 0;
228 struct request *rq;
229 struct bio *bio;
230 char sense[SCSI_SENSE_BUFFERSIZE];
231 unsigned char cmd[BLK_MAX_CDB];
232
233 if (hdr->interface_id != 'S')
234 return -EINVAL;
235 if (hdr->cmd_len > BLK_MAX_CDB)
236 return -EINVAL;
237 if (copy_from_user(cmd, hdr->cmdp, hdr->cmd_len))
238 return -EFAULT;
239 if (verify_command(file, cmd))
240 return -EPERM;
241
242 if (hdr->dxfer_len > (q->max_hw_sectors << 9))
243 return -EIO;
244
245 if (hdr->dxfer_len)
246 switch (hdr->dxfer_direction) {
247 default:
248 return -EINVAL;
249 case SG_DXFER_TO_FROM_DEV:
250 case SG_DXFER_TO_DEV:
251 writing = 1;
252 break;
253 case SG_DXFER_FROM_DEV:
254 break;
255 }
256
257 rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL);
258 if (!rq)
259 return -ENOMEM;
260
261 if (hdr->iovec_count) {
262 const int size = sizeof(struct sg_iovec) * hdr->iovec_count;
263 struct sg_iovec *iov;
264
265 iov = kmalloc(size, GFP_KERNEL);
266 if (!iov) {
267 ret = -ENOMEM;
268 goto out;
269 }
270
271 if (copy_from_user(iov, hdr->dxferp, size)) {
272 kfree(iov);
273 ret = -EFAULT;
274 goto out;
275 }
276
277 ret = blk_rq_map_user_iov(q, rq, iov, hdr->iovec_count);
278 kfree(iov);
279 } else if (hdr->dxfer_len)
280 ret = blk_rq_map_user(q, rq, hdr->dxferp, hdr->dxfer_len);
281
282 if (ret)
283 goto out;
284
285
286
287
288 rq->cmd_len = hdr->cmd_len;
289 memcpy(rq->cmd, cmd, hdr->cmd_len);
290 if (sizeof(rq->cmd) != hdr->cmd_len)
291 memset(rq->cmd + hdr->cmd_len, 0, sizeof(rq->cmd) - hdr->cmd_len);
292
293 memset(sense, 0, sizeof(sense));
294 rq->sense = sense;
295 rq->sense_len = 0;
296
297 rq->flags |= REQ_BLOCK_PC;
298 bio = rq->bio;
299
300
301
302
303
304 if (rq->bio)
305 blk_queue_bounce(q, &rq->bio);
306
307 rq->timeout = (hdr->timeout * HZ) / 1000;
308 if (!rq->timeout)
309 rq->timeout = q->sg_timeout;
310 if (!rq->timeout)
311 rq->timeout = BLK_DEFAULT_TIMEOUT;
312
313 rq->retries = 0;
314
315 start_time = jiffies;
316
317
318
319
320
321 blk_execute_rq(q, bd_disk, rq, 0);
322
323
324 hdr->status = 0xff & rq->errors;
325 hdr->masked_status = status_byte(rq->errors);
326 hdr->msg_status = msg_byte(rq->errors);
327 hdr->host_status = host_byte(rq->errors);
328 hdr->driver_status = driver_byte(rq->errors);
329 hdr->info = 0;
330 if (hdr->masked_status || hdr->host_status || hdr->driver_status)
331 hdr->info |= SG_INFO_CHECK;
332 hdr->resid = rq->data_len;
333 hdr->duration = ((jiffies - start_time) * 1000) / HZ;
334 hdr->sb_len_wr = 0;
335
336 if (rq->sense_len && hdr->sbp) {
337 int len = min((unsigned int) hdr->mx_sb_len, rq->sense_len);
338
339 if (!copy_to_user(hdr->sbp, rq->sense, len))
340 hdr->sb_len_wr = len;
341 }
342
343 if (blk_rq_unmap_user(bio, hdr->dxfer_len))
344 ret = -EFAULT;
345
346
347
348out:
349 blk_put_request(rq);
350 return ret;
351}
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386#define OMAX_SB_LEN 16
387int sg_scsi_ioctl(struct file *file, struct request_queue *q,
388 struct gendisk *disk, struct scsi_ioctl_command __user *sic)
389{
390 struct request *rq;
391 int err;
392 unsigned int in_len, out_len, bytes, opcode, cmdlen;
393 char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE];
394
395 if (!sic)
396 return -EINVAL;
397
398
399
400
401 if (get_user(in_len, &sic->inlen))
402 return -EFAULT;
403 if (get_user(out_len, &sic->outlen))
404 return -EFAULT;
405 if (in_len > PAGE_SIZE || out_len > PAGE_SIZE)
406 return -EINVAL;
407 if (get_user(opcode, sic->data))
408 return -EFAULT;
409
410 bytes = max(in_len, out_len);
411 if (bytes) {
412 buffer = kmalloc(bytes, q->bounce_gfp | GFP_USER| __GFP_NOWARN);
413 if (!buffer)
414 return -ENOMEM;
415
416 memset(buffer, 0, bytes);
417 }
418
419 rq = blk_get_request(q, in_len ? WRITE : READ, __GFP_WAIT);
420
421 cmdlen = COMMAND_SIZE(opcode);
422
423
424
425
426 err = -EFAULT;
427 rq->cmd_len = cmdlen;
428 if (copy_from_user(rq->cmd, sic->data, cmdlen))
429 goto error;
430
431 if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len))
432 goto error;
433
434 err = verify_command(file, rq->cmd);
435 if (err)
436 goto error;
437
438
439 rq->retries = 5;
440
441 switch (opcode) {
442 case SEND_DIAGNOSTIC:
443 case FORMAT_UNIT:
444 rq->timeout = FORMAT_UNIT_TIMEOUT;
445 rq->retries = 1;
446 break;
447 case START_STOP:
448 rq->timeout = START_STOP_TIMEOUT;
449 break;
450 case MOVE_MEDIUM:
451 rq->timeout = MOVE_MEDIUM_TIMEOUT;
452 break;
453 case READ_ELEMENT_STATUS:
454 rq->timeout = READ_ELEMENT_STATUS_TIMEOUT;
455 break;
456 case READ_DEFECT_DATA:
457 rq->timeout = READ_DEFECT_DATA_TIMEOUT;
458 rq->retries = 1;
459 break;
460 default:
461 rq->timeout = BLK_DEFAULT_TIMEOUT;
462 break;
463 }
464
465 if (bytes && blk_rq_map_kern(q, rq, buffer, bytes, __GFP_WAIT)) {
466 err = DRIVER_ERROR << 24;
467 goto out;
468 }
469
470 memset(sense, 0, sizeof(sense));
471 rq->sense = sense;
472 rq->sense_len = 0;
473 rq->flags |= REQ_BLOCK_PC;
474
475 blk_execute_rq(q, disk, rq, 0);
476
477out:
478 err = rq->errors & 0xff;
479 if (err) {
480 if (rq->sense_len && rq->sense) {
481 bytes = (OMAX_SB_LEN > rq->sense_len) ?
482 rq->sense_len : OMAX_SB_LEN;
483 if (copy_to_user(sic->data, rq->sense, bytes))
484 err = -EFAULT;
485 }
486 } else {
487 if (copy_to_user(sic->data, buffer, out_len))
488 err = -EFAULT;
489 }
490
491error:
492 kfree(buffer);
493 blk_put_request(rq);
494 return err;
495}
496EXPORT_SYMBOL_GPL(sg_scsi_ioctl);
497
498
499static int __blk_send_generic(request_queue_t *q, struct gendisk *bd_disk, int cmd, int data)
500{
501 struct request *rq;
502 int err;
503
504 rq = blk_get_request(q, WRITE, __GFP_WAIT);
505 rq->flags |= REQ_BLOCK_PC;
506 rq->data = NULL;
507 rq->data_len = 0;
508 rq->timeout = BLK_DEFAULT_TIMEOUT;
509 memset(rq->cmd, 0, sizeof(rq->cmd));
510 rq->cmd[0] = cmd;
511 rq->cmd[4] = data;
512 rq->cmd_len = 6;
513 err = blk_execute_rq(q, bd_disk, rq, 0);
514 blk_put_request(rq);
515
516 return err;
517}
518
519static inline int blk_send_start_stop(request_queue_t *q, struct gendisk *bd_disk, int data)
520{
521 return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data);
522}
523
524int scsi_cmd_ioctl(struct file *file, struct gendisk *bd_disk, unsigned int cmd, void __user *arg)
525{
526 request_queue_t *q;
527 int err;
528
529 q = bd_disk->queue;
530 if (!q)
531 return -ENXIO;
532
533 if (blk_get_queue(q))
534 return -ENXIO;
535
536 switch (cmd) {
537
538
539
540 case SG_GET_VERSION_NUM:
541 err = sg_get_version(arg);
542 break;
543 case SCSI_IOCTL_GET_IDLUN:
544 err = scsi_get_idlun(q, arg);
545 break;
546 case SCSI_IOCTL_GET_BUS_NUMBER:
547 err = scsi_get_bus(q, arg);
548 break;
549 case SG_SET_TIMEOUT:
550 err = sg_set_timeout(q, arg);
551 break;
552 case SG_GET_TIMEOUT:
553 err = sg_get_timeout(q);
554 break;
555 case SG_GET_RESERVED_SIZE:
556 err = sg_get_reserved_size(q, arg);
557 break;
558 case SG_SET_RESERVED_SIZE:
559 err = sg_set_reserved_size(q, arg);
560 break;
561 case SG_EMULATED_HOST:
562 err = sg_emulated_host(q, arg);
563 break;
564 case SG_IO: {
565 struct sg_io_hdr hdr;
566
567 err = -EFAULT;
568 if (copy_from_user(&hdr, arg, sizeof(hdr)))
569 break;
570 err = sg_io(file, q, bd_disk, &hdr);
571 if (err == -EFAULT)
572 break;
573
574 if (copy_to_user(arg, &hdr, sizeof(hdr)))
575 err = -EFAULT;
576 break;
577 }
578 case CDROM_SEND_PACKET: {
579 struct cdrom_generic_command cgc;
580 struct sg_io_hdr hdr;
581
582 err = -EFAULT;
583 if (copy_from_user(&cgc, arg, sizeof(cgc)))
584 break;
585 cgc.timeout = clock_t_to_jiffies(cgc.timeout);
586 memset(&hdr, 0, sizeof(hdr));
587 hdr.interface_id = 'S';
588 hdr.cmd_len = sizeof(cgc.cmd);
589 hdr.dxfer_len = cgc.buflen;
590 err = 0;
591 switch (cgc.data_direction) {
592 case CGC_DATA_UNKNOWN:
593 hdr.dxfer_direction = SG_DXFER_UNKNOWN;
594 break;
595 case CGC_DATA_WRITE:
596 hdr.dxfer_direction = SG_DXFER_TO_DEV;
597 break;
598 case CGC_DATA_READ:
599 hdr.dxfer_direction = SG_DXFER_FROM_DEV;
600 break;
601 case CGC_DATA_NONE:
602 hdr.dxfer_direction = SG_DXFER_NONE;
603 break;
604 default:
605 err = -EINVAL;
606 }
607 if (err)
608 break;
609
610 hdr.dxferp = cgc.buffer;
611 hdr.sbp = cgc.sense;
612 if (hdr.sbp)
613 hdr.mx_sb_len = sizeof(struct request_sense);
614 hdr.timeout = cgc.timeout;
615 hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd;
616 hdr.cmd_len = sizeof(cgc.cmd);
617
618 err = sg_io(file, q, bd_disk, &hdr);
619 if (err == -EFAULT)
620 break;
621
622 if (hdr.status)
623 err = -EIO;
624
625 cgc.stat = err;
626 cgc.buflen = hdr.resid;
627 if (copy_to_user(arg, &cgc, sizeof(cgc)))
628 err = -EFAULT;
629
630 break;
631 }
632
633
634
635
636 case SCSI_IOCTL_SEND_COMMAND:
637 printk(KERN_WARNING "program %s is using a deprecated SCSI ioctl, please convert it to SG_IO\n", current->comm);
638 err = -EINVAL;
639 if (!arg)
640 break;
641
642 err = sg_scsi_ioctl(file, q, bd_disk, arg);
643 break;
644 case CDROMCLOSETRAY:
645 err = blk_send_start_stop(q, bd_disk, 0x03);
646 break;
647 case CDROMEJECT:
648 err = blk_send_start_stop(q, bd_disk, 0x02);
649 break;
650 default:
651 err = -ENOTTY;
652 }
653
654 blk_put_queue(q);
655 return err;
656}
657
658EXPORT_SYMBOL(scsi_cmd_ioctl);
659