Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

at v2.6.37-rc1 685 lines 18 kB view raw
1/* 2 * Copyright (C) 2001 Jens Axboe <axboe@suse.de> 3 * 4 * This program is free software; you can redistribute it and/or modify 5 * it under the terms of the GNU General Public License version 2 as 6 * published by the Free Software Foundation. 7 * 8 * This program is distributed in the hope that it will be useful, 9 * but WITHOUT ANY WARRANTY; without even the implied warranty of 10 * 11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 12 * GNU General Public License for more details. 13 * 14 * You should have received a copy of the GNU General Public Licens 15 * along with this program; if not, write to the Free Software 16 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111- 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 35struct blk_cmd_filter { 36 unsigned long read_ok[BLK_SCSI_CMD_PER_LONG]; 37 unsigned long write_ok[BLK_SCSI_CMD_PER_LONG]; 38}; 39 40static struct blk_cmd_filter blk_default_cmd_filter; 41 42/* Command group 3 is reserved and should never be used. */ 43const unsigned char scsi_command_size_tbl[8] = 44{ 45 6, 10, 10, 12, 46 16, 12, 10, 10 47}; 48EXPORT_SYMBOL(scsi_command_size_tbl); 49 50#include <scsi/sg.h> 51 52static int sg_get_version(int __user *p) 53{ 54 static const int sg_version_num = 30527; 55 return put_user(sg_version_num, p); 56} 57 58static int scsi_get_idlun(struct request_queue *q, int __user *p) 59{ 60 return put_user(0, p); 61} 62 63static int scsi_get_bus(struct request_queue *q, int __user *p) 64{ 65 return put_user(0, p); 66} 67 68static int sg_get_timeout(struct request_queue *q) 69{ 70 return jiffies_to_clock_t(q->sg_timeout); 71} 72 73static int sg_set_timeout(struct request_queue *q, int __user *p) 74{ 75 int timeout, err = get_user(timeout, p); 76 77 if (!err) 78 q->sg_timeout = clock_t_to_jiffies(timeout); 79 80 return err; 81} 82 83static int sg_get_reserved_size(struct request_queue *q, int __user *p) 84{ 85 unsigned val = min(q->sg_reserved_size, queue_max_sectors(q) << 9); 86 87 return put_user(val, p); 88} 89 90static int sg_set_reserved_size(struct request_queue *q, int __user *p) 91{ 92 int size, err = get_user(size, p); 93 94 if (err) 95 return err; 96 97 if (size < 0) 98 return -EINVAL; 99 if (size > (queue_max_sectors(q) << 9)) 100 size = queue_max_sectors(q) << 9; 101 102 q->sg_reserved_size = size; 103 return 0; 104} 105 106/* 107 * will always return that we are ATAPI even for a real SCSI drive, I'm not 108 * so sure this is worth doing anything about (why would you care??) 109 */ 110static int sg_emulated_host(struct request_queue *q, int __user *p) 111{ 112 return put_user(1, p); 113} 114 115static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter) 116{ 117 /* Basic read-only commands */ 118 __set_bit(TEST_UNIT_READY, filter->read_ok); 119 __set_bit(REQUEST_SENSE, filter->read_ok); 120 __set_bit(READ_6, filter->read_ok); 121 __set_bit(READ_10, filter->read_ok); 122 __set_bit(READ_12, filter->read_ok); 123 __set_bit(READ_16, filter->read_ok); 124 __set_bit(READ_BUFFER, filter->read_ok); 125 __set_bit(READ_DEFECT_DATA, filter->read_ok); 126 __set_bit(READ_CAPACITY, filter->read_ok); 127 __set_bit(READ_LONG, filter->read_ok); 128 __set_bit(INQUIRY, filter->read_ok); 129 __set_bit(MODE_SENSE, filter->read_ok); 130 __set_bit(MODE_SENSE_10, filter->read_ok); 131 __set_bit(LOG_SENSE, filter->read_ok); 132 __set_bit(START_STOP, filter->read_ok); 133 __set_bit(GPCMD_VERIFY_10, filter->read_ok); 134 __set_bit(VERIFY_16, filter->read_ok); 135 __set_bit(REPORT_LUNS, filter->read_ok); 136 __set_bit(SERVICE_ACTION_IN, filter->read_ok); 137 __set_bit(RECEIVE_DIAGNOSTIC, filter->read_ok); 138 __set_bit(MAINTENANCE_IN, filter->read_ok); 139 __set_bit(GPCMD_READ_BUFFER_CAPACITY, filter->read_ok); 140 141 /* Audio CD commands */ 142 __set_bit(GPCMD_PLAY_CD, filter->read_ok); 143 __set_bit(GPCMD_PLAY_AUDIO_10, filter->read_ok); 144 __set_bit(GPCMD_PLAY_AUDIO_MSF, filter->read_ok); 145 __set_bit(GPCMD_PLAY_AUDIO_TI, filter->read_ok); 146 __set_bit(GPCMD_PAUSE_RESUME, filter->read_ok); 147 148 /* CD/DVD data reading */ 149 __set_bit(GPCMD_READ_CD, filter->read_ok); 150 __set_bit(GPCMD_READ_CD_MSF, filter->read_ok); 151 __set_bit(GPCMD_READ_DISC_INFO, filter->read_ok); 152 __set_bit(GPCMD_READ_CDVD_CAPACITY, filter->read_ok); 153 __set_bit(GPCMD_READ_DVD_STRUCTURE, filter->read_ok); 154 __set_bit(GPCMD_READ_HEADER, filter->read_ok); 155 __set_bit(GPCMD_READ_TRACK_RZONE_INFO, filter->read_ok); 156 __set_bit(GPCMD_READ_SUBCHANNEL, filter->read_ok); 157 __set_bit(GPCMD_READ_TOC_PMA_ATIP, filter->read_ok); 158 __set_bit(GPCMD_REPORT_KEY, filter->read_ok); 159 __set_bit(GPCMD_SCAN, filter->read_ok); 160 __set_bit(GPCMD_GET_CONFIGURATION, filter->read_ok); 161 __set_bit(GPCMD_READ_FORMAT_CAPACITIES, filter->read_ok); 162 __set_bit(GPCMD_GET_EVENT_STATUS_NOTIFICATION, filter->read_ok); 163 __set_bit(GPCMD_GET_PERFORMANCE, filter->read_ok); 164 __set_bit(GPCMD_SEEK, filter->read_ok); 165 __set_bit(GPCMD_STOP_PLAY_SCAN, filter->read_ok); 166 167 /* Basic writing commands */ 168 __set_bit(WRITE_6, filter->write_ok); 169 __set_bit(WRITE_10, filter->write_ok); 170 __set_bit(WRITE_VERIFY, filter->write_ok); 171 __set_bit(WRITE_12, filter->write_ok); 172 __set_bit(WRITE_VERIFY_12, filter->write_ok); 173 __set_bit(WRITE_16, filter->write_ok); 174 __set_bit(WRITE_LONG, filter->write_ok); 175 __set_bit(WRITE_LONG_2, filter->write_ok); 176 __set_bit(ERASE, filter->write_ok); 177 __set_bit(GPCMD_MODE_SELECT_10, filter->write_ok); 178 __set_bit(MODE_SELECT, filter->write_ok); 179 __set_bit(LOG_SELECT, filter->write_ok); 180 __set_bit(GPCMD_BLANK, filter->write_ok); 181 __set_bit(GPCMD_CLOSE_TRACK, filter->write_ok); 182 __set_bit(GPCMD_FLUSH_CACHE, filter->write_ok); 183 __set_bit(GPCMD_FORMAT_UNIT, filter->write_ok); 184 __set_bit(GPCMD_REPAIR_RZONE_TRACK, filter->write_ok); 185 __set_bit(GPCMD_RESERVE_RZONE_TRACK, filter->write_ok); 186 __set_bit(GPCMD_SEND_DVD_STRUCTURE, filter->write_ok); 187 __set_bit(GPCMD_SEND_EVENT, filter->write_ok); 188 __set_bit(GPCMD_SEND_KEY, filter->write_ok); 189 __set_bit(GPCMD_SEND_OPC, filter->write_ok); 190 __set_bit(GPCMD_SEND_CUE_SHEET, filter->write_ok); 191 __set_bit(GPCMD_SET_SPEED, filter->write_ok); 192 __set_bit(GPCMD_PREVENT_ALLOW_MEDIUM_REMOVAL, filter->write_ok); 193 __set_bit(GPCMD_LOAD_UNLOAD, filter->write_ok); 194 __set_bit(GPCMD_SET_STREAMING, filter->write_ok); 195 __set_bit(GPCMD_SET_READ_AHEAD, filter->write_ok); 196} 197 198int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm) 199{ 200 struct blk_cmd_filter *filter = &blk_default_cmd_filter; 201 202 /* root can do any command. */ 203 if (capable(CAP_SYS_RAWIO)) 204 return 0; 205 206 /* if there's no filter set, assume we're filtering everything out */ 207 if (!filter) 208 return -EPERM; 209 210 /* Anybody who can open the device can do a read-safe command */ 211 if (test_bit(cmd[0], filter->read_ok)) 212 return 0; 213 214 /* Write-safe commands require a writable open */ 215 if (test_bit(cmd[0], filter->write_ok) && has_write_perm) 216 return 0; 217 218 return -EPERM; 219} 220EXPORT_SYMBOL(blk_verify_command); 221 222static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, 223 struct sg_io_hdr *hdr, fmode_t mode) 224{ 225 if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) 226 return -EFAULT; 227 if (blk_verify_command(rq->cmd, mode & FMODE_WRITE)) 228 return -EPERM; 229 230 /* 231 * fill in request structure 232 */ 233 rq->cmd_len = hdr->cmd_len; 234 rq->cmd_type = REQ_TYPE_BLOCK_PC; 235 236 rq->timeout = msecs_to_jiffies(hdr->timeout); 237 if (!rq->timeout) 238 rq->timeout = q->sg_timeout; 239 if (!rq->timeout) 240 rq->timeout = BLK_DEFAULT_SG_TIMEOUT; 241 if (rq->timeout < BLK_MIN_SG_TIMEOUT) 242 rq->timeout = BLK_MIN_SG_TIMEOUT; 243 244 return 0; 245} 246 247static int blk_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr, 248 struct bio *bio) 249{ 250 int r, ret = 0; 251 252 /* 253 * fill in all the output members 254 */ 255 hdr->status = rq->errors & 0xff; 256 hdr->masked_status = status_byte(rq->errors); 257 hdr->msg_status = msg_byte(rq->errors); 258 hdr->host_status = host_byte(rq->errors); 259 hdr->driver_status = driver_byte(rq->errors); 260 hdr->info = 0; 261 if (hdr->masked_status || hdr->host_status || hdr->driver_status) 262 hdr->info |= SG_INFO_CHECK; 263 hdr->resid = rq->resid_len; 264 hdr->sb_len_wr = 0; 265 266 if (rq->sense_len && hdr->sbp) { 267 int len = min((unsigned int) hdr->mx_sb_len, rq->sense_len); 268 269 if (!copy_to_user(hdr->sbp, rq->sense, len)) 270 hdr->sb_len_wr = len; 271 else 272 ret = -EFAULT; 273 } 274 275 r = blk_rq_unmap_user(bio); 276 if (!ret) 277 ret = r; 278 blk_put_request(rq); 279 280 return ret; 281} 282 283static int sg_io(struct request_queue *q, struct gendisk *bd_disk, 284 struct sg_io_hdr *hdr, fmode_t mode) 285{ 286 unsigned long start_time; 287 int writing = 0, ret = 0; 288 struct request *rq; 289 char sense[SCSI_SENSE_BUFFERSIZE]; 290 struct bio *bio; 291 292 if (hdr->interface_id != 'S') 293 return -EINVAL; 294 if (hdr->cmd_len > BLK_MAX_CDB) 295 return -EINVAL; 296 297 if (hdr->dxfer_len > (queue_max_hw_sectors(q) << 9)) 298 return -EIO; 299 300 if (hdr->dxfer_len) 301 switch (hdr->dxfer_direction) { 302 default: 303 return -EINVAL; 304 case SG_DXFER_TO_DEV: 305 writing = 1; 306 break; 307 case SG_DXFER_TO_FROM_DEV: 308 case SG_DXFER_FROM_DEV: 309 break; 310 } 311 312 rq = blk_get_request(q, writing ? WRITE : READ, GFP_KERNEL); 313 if (!rq) 314 return -ENOMEM; 315 316 if (blk_fill_sghdr_rq(q, rq, hdr, mode)) { 317 blk_put_request(rq); 318 return -EFAULT; 319 } 320 321 if (hdr->iovec_count) { 322 const int size = sizeof(struct sg_iovec) * hdr->iovec_count; 323 size_t iov_data_len; 324 struct sg_iovec *iov; 325 326 iov = kmalloc(size, GFP_KERNEL); 327 if (!iov) { 328 ret = -ENOMEM; 329 goto out; 330 } 331 332 if (copy_from_user(iov, hdr->dxferp, size)) { 333 kfree(iov); 334 ret = -EFAULT; 335 goto out; 336 } 337 338 /* SG_IO howto says that the shorter of the two wins */ 339 iov_data_len = iov_length((struct iovec *)iov, 340 hdr->iovec_count); 341 if (hdr->dxfer_len < iov_data_len) { 342 hdr->iovec_count = iov_shorten((struct iovec *)iov, 343 hdr->iovec_count, 344 hdr->dxfer_len); 345 iov_data_len = hdr->dxfer_len; 346 } 347 348 ret = blk_rq_map_user_iov(q, rq, NULL, iov, hdr->iovec_count, 349 iov_data_len, GFP_KERNEL); 350 kfree(iov); 351 } else if (hdr->dxfer_len) 352 ret = blk_rq_map_user(q, rq, NULL, hdr->dxferp, hdr->dxfer_len, 353 GFP_KERNEL); 354 355 if (ret) 356 goto out; 357 358 bio = rq->bio; 359 memset(sense, 0, sizeof(sense)); 360 rq->sense = sense; 361 rq->sense_len = 0; 362 rq->retries = 0; 363 364 start_time = jiffies; 365 366 /* ignore return value. All information is passed back to caller 367 * (if he doesn't check that is his problem). 368 * N.B. a non-zero SCSI status is _not_ necessarily an error. 369 */ 370 blk_execute_rq(q, bd_disk, rq, 0); 371 372 hdr->duration = jiffies_to_msecs(jiffies - start_time); 373 374 return blk_complete_sghdr_rq(rq, hdr, bio); 375out: 376 blk_put_request(rq); 377 return ret; 378} 379 380/** 381 * sg_scsi_ioctl -- handle deprecated SCSI_IOCTL_SEND_COMMAND ioctl 382 * @file: file this ioctl operates on (optional) 383 * @q: request queue to send scsi commands down 384 * @disk: gendisk to operate on (option) 385 * @sic: userspace structure describing the command to perform 386 * 387 * Send down the scsi command described by @sic to the device below 388 * the request queue @q. If @file is non-NULL it's used to perform 389 * fine-grained permission checks that allow users to send down 390 * non-destructive SCSI commands. If the caller has a struct gendisk 391 * available it should be passed in as @disk to allow the low level 392 * driver to use the information contained in it. A non-NULL @disk 393 * is only allowed if the caller knows that the low level driver doesn't 394 * need it (e.g. in the scsi subsystem). 395 * 396 * Notes: 397 * - This interface is deprecated - users should use the SG_IO 398 * interface instead, as this is a more flexible approach to 399 * performing SCSI commands on a device. 400 * - The SCSI command length is determined by examining the 1st byte 401 * of the given command. There is no way to override this. 402 * - Data transfers are limited to PAGE_SIZE 403 * - The length (x + y) must be at least OMAX_SB_LEN bytes long to 404 * accommodate the sense buffer when an error occurs. 405 * The sense buffer is truncated to OMAX_SB_LEN (16) bytes so that 406 * old code will not be surprised. 407 * - If a Unix error occurs (e.g. ENOMEM) then the user will receive 408 * a negative return and the Unix error code in 'errno'. 409 * If the SCSI command succeeds then 0 is returned. 410 * Positive numbers returned are the compacted SCSI error codes (4 411 * bytes in one int) where the lowest byte is the SCSI status. 412 */ 413#define OMAX_SB_LEN 16 /* For backward compatibility */ 414int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, 415 struct scsi_ioctl_command __user *sic) 416{ 417 struct request *rq; 418 int err; 419 unsigned int in_len, out_len, bytes, opcode, cmdlen; 420 char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE]; 421 422 if (!sic) 423 return -EINVAL; 424 425 /* 426 * get in an out lengths, verify they don't exceed a page worth of data 427 */ 428 if (get_user(in_len, &sic->inlen)) 429 return -EFAULT; 430 if (get_user(out_len, &sic->outlen)) 431 return -EFAULT; 432 if (in_len > PAGE_SIZE || out_len > PAGE_SIZE) 433 return -EINVAL; 434 if (get_user(opcode, sic->data)) 435 return -EFAULT; 436 437 bytes = max(in_len, out_len); 438 if (bytes) { 439 buffer = kzalloc(bytes, q->bounce_gfp | GFP_USER| __GFP_NOWARN); 440 if (!buffer) 441 return -ENOMEM; 442 443 } 444 445 rq = blk_get_request(q, in_len ? WRITE : READ, __GFP_WAIT); 446 447 cmdlen = COMMAND_SIZE(opcode); 448 449 /* 450 * get command and data to send to device, if any 451 */ 452 err = -EFAULT; 453 rq->cmd_len = cmdlen; 454 if (copy_from_user(rq->cmd, sic->data, cmdlen)) 455 goto error; 456 457 if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) 458 goto error; 459 460 err = blk_verify_command(rq->cmd, mode & FMODE_WRITE); 461 if (err) 462 goto error; 463 464 /* default. possible overriden later */ 465 rq->retries = 5; 466 467 switch (opcode) { 468 case SEND_DIAGNOSTIC: 469 case FORMAT_UNIT: 470 rq->timeout = FORMAT_UNIT_TIMEOUT; 471 rq->retries = 1; 472 break; 473 case START_STOP: 474 rq->timeout = START_STOP_TIMEOUT; 475 break; 476 case MOVE_MEDIUM: 477 rq->timeout = MOVE_MEDIUM_TIMEOUT; 478 break; 479 case READ_ELEMENT_STATUS: 480 rq->timeout = READ_ELEMENT_STATUS_TIMEOUT; 481 break; 482 case READ_DEFECT_DATA: 483 rq->timeout = READ_DEFECT_DATA_TIMEOUT; 484 rq->retries = 1; 485 break; 486 default: 487 rq->timeout = BLK_DEFAULT_SG_TIMEOUT; 488 break; 489 } 490 491 if (bytes && blk_rq_map_kern(q, rq, buffer, bytes, __GFP_WAIT)) { 492 err = DRIVER_ERROR << 24; 493 goto out; 494 } 495 496 memset(sense, 0, sizeof(sense)); 497 rq->sense = sense; 498 rq->sense_len = 0; 499 rq->cmd_type = REQ_TYPE_BLOCK_PC; 500 501 blk_execute_rq(q, disk, rq, 0); 502 503out: 504 err = rq->errors & 0xff; /* only 8 bit SCSI status */ 505 if (err) { 506 if (rq->sense_len && rq->sense) { 507 bytes = (OMAX_SB_LEN > rq->sense_len) ? 508 rq->sense_len : OMAX_SB_LEN; 509 if (copy_to_user(sic->data, rq->sense, bytes)) 510 err = -EFAULT; 511 } 512 } else { 513 if (copy_to_user(sic->data, buffer, out_len)) 514 err = -EFAULT; 515 } 516 517error: 518 kfree(buffer); 519 blk_put_request(rq); 520 return err; 521} 522EXPORT_SYMBOL_GPL(sg_scsi_ioctl); 523 524/* Send basic block requests */ 525static int __blk_send_generic(struct request_queue *q, struct gendisk *bd_disk, 526 int cmd, int data) 527{ 528 struct request *rq; 529 int err; 530 531 rq = blk_get_request(q, WRITE, __GFP_WAIT); 532 rq->cmd_type = REQ_TYPE_BLOCK_PC; 533 rq->timeout = BLK_DEFAULT_SG_TIMEOUT; 534 rq->cmd[0] = cmd; 535 rq->cmd[4] = data; 536 rq->cmd_len = 6; 537 err = blk_execute_rq(q, bd_disk, rq, 0); 538 blk_put_request(rq); 539 540 return err; 541} 542 543static inline int blk_send_start_stop(struct request_queue *q, 544 struct gendisk *bd_disk, int data) 545{ 546 return __blk_send_generic(q, bd_disk, GPCMD_START_STOP_UNIT, data); 547} 548 549int scsi_cmd_ioctl(struct request_queue *q, struct gendisk *bd_disk, fmode_t mode, 550 unsigned int cmd, void __user *arg) 551{ 552 int err; 553 554 if (!q || blk_get_queue(q)) 555 return -ENXIO; 556 557 switch (cmd) { 558 /* 559 * new sgv3 interface 560 */ 561 case SG_GET_VERSION_NUM: 562 err = sg_get_version(arg); 563 break; 564 case SCSI_IOCTL_GET_IDLUN: 565 err = scsi_get_idlun(q, arg); 566 break; 567 case SCSI_IOCTL_GET_BUS_NUMBER: 568 err = scsi_get_bus(q, arg); 569 break; 570 case SG_SET_TIMEOUT: 571 err = sg_set_timeout(q, arg); 572 break; 573 case SG_GET_TIMEOUT: 574 err = sg_get_timeout(q); 575 break; 576 case SG_GET_RESERVED_SIZE: 577 err = sg_get_reserved_size(q, arg); 578 break; 579 case SG_SET_RESERVED_SIZE: 580 err = sg_set_reserved_size(q, arg); 581 break; 582 case SG_EMULATED_HOST: 583 err = sg_emulated_host(q, arg); 584 break; 585 case SG_IO: { 586 struct sg_io_hdr hdr; 587 588 err = -EFAULT; 589 if (copy_from_user(&hdr, arg, sizeof(hdr))) 590 break; 591 err = sg_io(q, bd_disk, &hdr, mode); 592 if (err == -EFAULT) 593 break; 594 595 if (copy_to_user(arg, &hdr, sizeof(hdr))) 596 err = -EFAULT; 597 break; 598 } 599 case CDROM_SEND_PACKET: { 600 struct cdrom_generic_command cgc; 601 struct sg_io_hdr hdr; 602 603 err = -EFAULT; 604 if (copy_from_user(&cgc, arg, sizeof(cgc))) 605 break; 606 cgc.timeout = clock_t_to_jiffies(cgc.timeout); 607 memset(&hdr, 0, sizeof(hdr)); 608 hdr.interface_id = 'S'; 609 hdr.cmd_len = sizeof(cgc.cmd); 610 hdr.dxfer_len = cgc.buflen; 611 err = 0; 612 switch (cgc.data_direction) { 613 case CGC_DATA_UNKNOWN: 614 hdr.dxfer_direction = SG_DXFER_UNKNOWN; 615 break; 616 case CGC_DATA_WRITE: 617 hdr.dxfer_direction = SG_DXFER_TO_DEV; 618 break; 619 case CGC_DATA_READ: 620 hdr.dxfer_direction = SG_DXFER_FROM_DEV; 621 break; 622 case CGC_DATA_NONE: 623 hdr.dxfer_direction = SG_DXFER_NONE; 624 break; 625 default: 626 err = -EINVAL; 627 } 628 if (err) 629 break; 630 631 hdr.dxferp = cgc.buffer; 632 hdr.sbp = cgc.sense; 633 if (hdr.sbp) 634 hdr.mx_sb_len = sizeof(struct request_sense); 635 hdr.timeout = jiffies_to_msecs(cgc.timeout); 636 hdr.cmdp = ((struct cdrom_generic_command __user*) arg)->cmd; 637 hdr.cmd_len = sizeof(cgc.cmd); 638 639 err = sg_io(q, bd_disk, &hdr, mode); 640 if (err == -EFAULT) 641 break; 642 643 if (hdr.status) 644 err = -EIO; 645 646 cgc.stat = err; 647 cgc.buflen = hdr.resid; 648 if (copy_to_user(arg, &cgc, sizeof(cgc))) 649 err = -EFAULT; 650 651 break; 652 } 653 654 /* 655 * old junk scsi send command ioctl 656 */ 657 case SCSI_IOCTL_SEND_COMMAND: 658 printk(KERN_WARNING "program %s is using a deprecated SCSI ioctl, please convert it to SG_IO\n", current->comm); 659 err = -EINVAL; 660 if (!arg) 661 break; 662 663 err = sg_scsi_ioctl(q, bd_disk, mode, arg); 664 break; 665 case CDROMCLOSETRAY: 666 err = blk_send_start_stop(q, bd_disk, 0x03); 667 break; 668 case CDROMEJECT: 669 err = blk_send_start_stop(q, bd_disk, 0x02); 670 break; 671 default: 672 err = -ENOTTY; 673 } 674 675 blk_put_queue(q); 676 return err; 677} 678EXPORT_SYMBOL(scsi_cmd_ioctl); 679 680static int __init blk_scsi_ioctl_init(void) 681{ 682 blk_set_cmd_filter_defaults(&blk_default_cmd_filter); 683 return 0; 684} 685fs_initcall(blk_scsi_ioctl_init);