diff options
Diffstat (limited to 'drivers/scsi')
| -rw-r--r-- | drivers/scsi/sd.c | 2 | ||||
| -rw-r--r-- | drivers/scsi/sg.c | 17 | ||||
| -rw-r--r-- | drivers/scsi/sr.c | 2 |
3 files changed, 19 insertions, 2 deletions
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c index e5e7d7856454..2a2bc89aba83 100644 --- a/drivers/scsi/sd.c +++ b/drivers/scsi/sd.c | |||
| @@ -1875,6 +1875,7 @@ static int sd_probe(struct device *dev) | |||
| 1875 | 1875 | ||
| 1876 | dev_set_drvdata(dev, sdkp); | 1876 | dev_set_drvdata(dev, sdkp); |
| 1877 | add_disk(gd); | 1877 | add_disk(gd); |
| 1878 | blk_register_filter(gd); | ||
| 1878 | sd_dif_config_host(sdkp); | 1879 | sd_dif_config_host(sdkp); |
| 1879 | 1880 | ||
| 1880 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", | 1881 | sd_printk(KERN_NOTICE, sdkp, "Attached SCSI %sdisk\n", |
| @@ -1908,6 +1909,7 @@ static int sd_remove(struct device *dev) | |||
| 1908 | struct scsi_disk *sdkp = dev_get_drvdata(dev); | 1909 | struct scsi_disk *sdkp = dev_get_drvdata(dev); |
| 1909 | 1910 | ||
| 1910 | device_del(&sdkp->dev); | 1911 | device_del(&sdkp->dev); |
| 1912 | blk_unregister_filter(sdkp->disk); | ||
| 1911 | del_gendisk(sdkp->disk); | 1913 | del_gendisk(sdkp->disk); |
| 1912 | sd_shutdown(dev); | 1914 | sd_shutdown(dev); |
| 1913 | 1915 | ||
diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index 3d36270a8b4d..661f9f21650a 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c | |||
| @@ -217,6 +217,18 @@ static int sg_last_dev(void); | |||
| 217 | #define SZ_SG_IOVEC sizeof(sg_iovec_t) | 217 | #define SZ_SG_IOVEC sizeof(sg_iovec_t) |
| 218 | #define SZ_SG_REQ_INFO sizeof(sg_req_info_t) | 218 | #define SZ_SG_REQ_INFO sizeof(sg_req_info_t) |
| 219 | 219 | ||
| 220 | static int sg_allow_access(struct file *filp, unsigned char *cmd) | ||
| 221 | { | ||
| 222 | struct sg_fd *sfp = (struct sg_fd *)filp->private_data; | ||
| 223 | struct request_queue *q = sfp->parentdp->device->request_queue; | ||
| 224 | |||
| 225 | if (sfp->parentdp->device->type == TYPE_SCANNER) | ||
| 226 | return 0; | ||
| 227 | |||
| 228 | return blk_verify_command(&q->cmd_filter, | ||
| 229 | cmd, filp->f_mode & FMODE_WRITE); | ||
| 230 | } | ||
| 231 | |||
| 220 | static int | 232 | static int |
| 221 | sg_open(struct inode *inode, struct file *filp) | 233 | sg_open(struct inode *inode, struct file *filp) |
| 222 | { | 234 | { |
| @@ -689,7 +701,7 @@ sg_new_write(Sg_fd *sfp, struct file *file, const char __user *buf, | |||
| 689 | sg_remove_request(sfp, srp); | 701 | sg_remove_request(sfp, srp); |
| 690 | return -EFAULT; | 702 | return -EFAULT; |
| 691 | } | 703 | } |
| 692 | if (read_only && !blk_verify_command(file, cmnd)) { | 704 | if (read_only && sg_allow_access(file, cmnd)) { |
| 693 | sg_remove_request(sfp, srp); | 705 | sg_remove_request(sfp, srp); |
| 694 | return -EPERM; | 706 | return -EPERM; |
| 695 | } | 707 | } |
| @@ -793,6 +805,7 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 793 | 805 | ||
| 794 | if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) | 806 | if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp))) |
| 795 | return -ENXIO; | 807 | return -ENXIO; |
| 808 | |||
| 796 | SCSI_LOG_TIMEOUT(3, printk("sg_ioctl: %s, cmd=0x%x\n", | 809 | SCSI_LOG_TIMEOUT(3, printk("sg_ioctl: %s, cmd=0x%x\n", |
| 797 | sdp->disk->disk_name, (int) cmd_in)); | 810 | sdp->disk->disk_name, (int) cmd_in)); |
| 798 | read_only = (O_RDWR != (filp->f_flags & O_ACCMODE)); | 811 | read_only = (O_RDWR != (filp->f_flags & O_ACCMODE)); |
| @@ -1061,7 +1074,7 @@ sg_ioctl(struct inode *inode, struct file *filp, | |||
| 1061 | 1074 | ||
| 1062 | if (copy_from_user(&opcode, siocp->data, 1)) | 1075 | if (copy_from_user(&opcode, siocp->data, 1)) |
| 1063 | return -EFAULT; | 1076 | return -EFAULT; |
| 1064 | if (!blk_verify_command(filp, &opcode)) | 1077 | if (sg_allow_access(filp, &opcode)) |
| 1065 | return -EPERM; | 1078 | return -EPERM; |
| 1066 | } | 1079 | } |
| 1067 | return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); | 1080 | return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); |
diff --git a/drivers/scsi/sr.c b/drivers/scsi/sr.c index 27f5bfd1def3..3292965bfd84 100644 --- a/drivers/scsi/sr.c +++ b/drivers/scsi/sr.c | |||
| @@ -656,6 +656,7 @@ static int sr_probe(struct device *dev) | |||
| 656 | dev_set_drvdata(dev, cd); | 656 | dev_set_drvdata(dev, cd); |
| 657 | disk->flags |= GENHD_FL_REMOVABLE; | 657 | disk->flags |= GENHD_FL_REMOVABLE; |
| 658 | add_disk(disk); | 658 | add_disk(disk); |
| 659 | blk_register_filter(disk); | ||
| 659 | 660 | ||
| 660 | sdev_printk(KERN_DEBUG, sdev, | 661 | sdev_printk(KERN_DEBUG, sdev, |
| 661 | "Attached scsi CD-ROM %s\n", cd->cdi.name); | 662 | "Attached scsi CD-ROM %s\n", cd->cdi.name); |
| @@ -894,6 +895,7 @@ static int sr_remove(struct device *dev) | |||
| 894 | { | 895 | { |
| 895 | struct scsi_cd *cd = dev_get_drvdata(dev); | 896 | struct scsi_cd *cd = dev_get_drvdata(dev); |
| 896 | 897 | ||
| 898 | blk_unregister_filter(cd->disk); | ||
| 897 | del_gendisk(cd->disk); | 899 | del_gendisk(cd->disk); |
| 898 | 900 | ||
| 899 | mutex_lock(&sr_ref_mutex); | 901 | mutex_lock(&sr_ref_mutex); |
