diff options
-rw-r--r-- | drivers/scsi/sr.c | 40 |
1 files changed, 18 insertions, 22 deletions
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 9446cbf4de84..62b6633e3a97 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
@@ -471,34 +471,31 @@ static int sr_prep_fn(struct request_queue *q, struct request *rq) | |||
471 | return scsi_prep_return(q, rq, ret); | 471 | return scsi_prep_return(q, rq, ret); |
472 | } | 472 | } |
473 | 473 | ||
474 | static int sr_block_open(struct inode *inode, struct file *file) | 474 | static int sr_block_open(struct block_device *bdev, fmode_t mode) |
475 | { | 475 | { |
476 | struct gendisk *disk = inode->i_bdev->bd_disk; | 476 | struct scsi_cd *cd = scsi_cd_get(bdev->bd_disk); |
477 | struct scsi_cd *cd; | 477 | int ret = -ENXIO; |
478 | int ret = 0; | ||
479 | |||
480 | if(!(cd = scsi_cd_get(disk))) | ||
481 | return -ENXIO; | ||
482 | |||
483 | if((ret = cdrom_open(&cd->cdi, inode->i_bdev, file->f_mode)) != 0) | ||
484 | scsi_cd_put(cd); | ||
485 | 478 | ||
479 | if (cd) { | ||
480 | ret = cdrom_open(&cd->cdi, bdev, mode); | ||
481 | if (ret) | ||
482 | scsi_cd_put(cd); | ||
483 | } | ||
486 | return ret; | 484 | return ret; |
487 | } | 485 | } |
488 | 486 | ||
489 | static int sr_block_release(struct inode *inode, struct file *file) | 487 | static int sr_block_release(struct gendisk *disk, fmode_t mode) |
490 | { | 488 | { |
491 | struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk); | 489 | struct scsi_cd *cd = scsi_cd(disk); |
492 | cdrom_release(&cd->cdi, file ? file->f_mode : 0); | 490 | cdrom_release(&cd->cdi, mode); |
493 | scsi_cd_put(cd); | 491 | scsi_cd_put(cd); |
494 | |||
495 | return 0; | 492 | return 0; |
496 | } | 493 | } |
497 | 494 | ||
498 | static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, | 495 | static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd, |
499 | unsigned long arg) | 496 | unsigned long arg) |
500 | { | 497 | { |
501 | struct scsi_cd *cd = scsi_cd(inode->i_bdev->bd_disk); | 498 | struct scsi_cd *cd = scsi_cd(bdev->bd_disk); |
502 | struct scsi_device *sdev = cd->device; | 499 | struct scsi_device *sdev = cd->device; |
503 | void __user *argp = (void __user *)arg; | 500 | void __user *argp = (void __user *)arg; |
504 | int ret; | 501 | int ret; |
@@ -513,8 +510,7 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
513 | return scsi_ioctl(sdev, cmd, argp); | 510 | return scsi_ioctl(sdev, cmd, argp); |
514 | } | 511 | } |
515 | 512 | ||
516 | ret = cdrom_ioctl(&cd->cdi, inode->i_bdev, | 513 | ret = cdrom_ioctl(&cd->cdi, bdev, mode, cmd, arg); |
517 | file ? file->f_mode : 0, cmd, arg); | ||
518 | if (ret != -ENOSYS) | 514 | if (ret != -ENOSYS) |
519 | return ret; | 515 | return ret; |
520 | 516 | ||
@@ -525,7 +521,7 @@ static int sr_block_ioctl(struct inode *inode, struct file *file, unsigned cmd, | |||
525 | * if it doesn't recognise the ioctl | 521 | * if it doesn't recognise the ioctl |
526 | */ | 522 | */ |
527 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, | 523 | ret = scsi_nonblockable_ioctl(sdev, cmd, argp, |
528 | file ? file->f_flags & O_NDELAY : 0); | 524 | (mode & FMODE_NDELAY_NOW) != 0); |
529 | if (ret != -ENODEV) | 525 | if (ret != -ENODEV) |
530 | return ret; | 526 | return ret; |
531 | return scsi_ioctl(sdev, cmd, argp); | 527 | return scsi_ioctl(sdev, cmd, argp); |
@@ -540,9 +536,9 @@ static int sr_block_media_changed(struct gendisk *disk) | |||
540 | static struct block_device_operations sr_bdops = | 536 | static struct block_device_operations sr_bdops = |
541 | { | 537 | { |
542 | .owner = THIS_MODULE, | 538 | .owner = THIS_MODULE, |
543 | .__open = sr_block_open, | 539 | .open = sr_block_open, |
544 | .__release = sr_block_release, | 540 | .release = sr_block_release, |
545 | .__ioctl = sr_block_ioctl, | 541 | .locked_ioctl = sr_block_ioctl, |
546 | .media_changed = sr_block_media_changed, | 542 | .media_changed = sr_block_media_changed, |
547 | /* | 543 | /* |
548 | * No compat_ioctl for now because sr_block_ioctl never | 544 | * No compat_ioctl for now because sr_block_ioctl never |