159 lines
5.9 KiB
Diff
159 lines
5.9 KiB
Diff
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Subject: [PATCH 1/3] block: add and use scsi_blk_cmd_ioctl
|
|
Date: Thu, 22 Dec 2011 19:02:17 +0100
|
|
|
|
Introduce a wrapper around scsi_cmd_ioctl that takes a block device.
|
|
The function will then be enhanced to detect partition block devices and,
|
|
in that case, subject the ioctls to whitelisting.
|
|
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
---
|
|
block/scsi_ioctl.c | 7 +++++++
|
|
drivers/block/cciss.c | 6 +++---
|
|
drivers/block/ub.c | 14 +-------------
|
|
drivers/block/virtio_blk.c | 4 ++--
|
|
drivers/cdrom/cdrom.c | 3 +--
|
|
drivers/ide/ide-floppy_ioctl.c | 3 +--
|
|
drivers/scsi/sd.c | 2 +-
|
|
include/linux/blkdev.h | 2 ++
|
|
8 files changed, 18 insertions(+), 23 deletions(-)
|
|
|
|
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
|
|
index e5b1001..48dfbe7 100644
|
|
--- a/block/scsi_ioctl.c
|
|
+++ b/block/scsi_ioctl.c
|
|
@@ -675,6 +675,13 @@ int scsi_cmd_ioctl(struct request_queue *q, struct gendisk *bd_disk, fmode_t mod
|
|
}
|
|
EXPORT_SYMBOL(scsi_cmd_ioctl);
|
|
|
|
+int scsi_cmd_blk_ioctl(struct block_device *bd, fmode_t mode,
|
|
+ unsigned int cmd, void __user *arg)
|
|
+{
|
|
+ return scsi_cmd_ioctl(bd->bd_disk->queue, bd->bd_disk, mode, cmd, arg);
|
|
+}
|
|
+EXPORT_SYMBOL(scsi_cmd_blk_ioctl);
|
|
+
|
|
static int __init blk_scsi_ioctl_init(void)
|
|
{
|
|
blk_set_cmd_filter_defaults(&blk_default_cmd_filter);
|
|
diff --git a/drivers/block/cciss.c b/drivers/block/cciss.c
|
|
index b8f2c02..ca4b52a 100644
|
|
--- a/drivers/block/cciss.c
|
|
+++ b/drivers/block/cciss.c
|
|
@@ -1703,7 +1703,7 @@ static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
|
|
case CCISS_BIG_PASSTHRU:
|
|
return cciss_bigpassthru(h, argp);
|
|
|
|
- /* scsi_cmd_ioctl handles these, below, though some are not */
|
|
+ /* scsi_cmd_blk_ioctl handles these, below, though some are not */
|
|
/* very meaningful for cciss. SG_IO is the main one people want. */
|
|
|
|
case SG_GET_VERSION_NUM:
|
|
@@ -1714,9 +1714,9 @@ static int cciss_ioctl(struct block_device *bdev, fmode_t mode,
|
|
case SG_EMULATED_HOST:
|
|
case SG_IO:
|
|
case SCSI_IOCTL_SEND_COMMAND:
|
|
- return scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp);
|
|
+ return scsi_cmd_blk_ioctl(bdev, mode, cmd, argp);
|
|
|
|
- /* scsi_cmd_ioctl would normally handle these, below, but */
|
|
+ /* scsi_cmd_blk_ioctl would normally handle these, below, but */
|
|
/* they aren't a good fit for cciss, as CD-ROMs are */
|
|
/* not supported, and we don't have any bus/target/lun */
|
|
/* which we present to the kernel. */
|
|
diff --git a/drivers/block/ub.c b/drivers/block/ub.c
|
|
index 761ee6d..d3b15ff 100644
|
|
--- a/drivers/block/ub.c
|
|
+++ b/drivers/block/ub.c
|
|
@@ -1721,12 +1721,11 @@ static int ub_bd_release(struct gendisk *disk, fmode_t mode)
|
|
static int ub_bd_ioctl(struct block_device *bdev, fmode_t mode,
|
|
unsigned int cmd, unsigned long arg)
|
|
{
|
|
- struct gendisk *disk = bdev->bd_disk;
|
|
void __user *usermem = (void __user *) arg;
|
|
int ret;
|
|
|
|
mutex_lock(&ub_mutex);
|
|
- ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, usermem);
|
|
+ ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, usermem);
|
|
mutex_unlock(&ub_mutex);
|
|
|
|
return ret;
|
|
diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
|
|
index cc4f6ad..14f9a2a 100644
|
|
--- a/drivers/block/virtio_blk.c
|
|
+++ b/drivers/block/virtio_blk.c
|
|
@@ -233,8 +233,8 @@ static int virtblk_ioctl(struct block_device *bdev, fmode_t mode,
|
|
if (!virtio_has_feature(vblk->vdev, VIRTIO_BLK_F_SCSI))
|
|
return -ENOTTY;
|
|
|
|
- return scsi_cmd_ioctl(disk->queue, disk, mode, cmd,
|
|
- (void __user *)data);
|
|
+ return scsi_cmd_blk_ioctl(bdev, mode, cmd,
|
|
+ (void __user *)data);
|
|
}
|
|
|
|
/* We provide getgeo only to please some old bootloader/partitioning tools */
|
|
diff --git a/drivers/cdrom/cdrom.c b/drivers/cdrom/cdrom.c
|
|
index 3bba1a2..20f5157 100644
|
|
--- a/drivers/cdrom/cdrom.c
|
|
+++ b/drivers/cdrom/cdrom.c
|
|
@@ -2688,12 +2688,11 @@ int cdrom_ioctl(struct cdrom_device_info *cdi, struct block_device *bdev,
|
|
{
|
|
void __user *argp = (void __user *)arg;
|
|
int ret;
|
|
- struct gendisk *disk = bdev->bd_disk;
|
|
|
|
/*
|
|
* Try the generic SCSI command ioctl's first.
|
|
*/
|
|
- ret = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, argp);
|
|
+ ret = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp);
|
|
if (ret != -ENOTTY)
|
|
return ret;
|
|
|
|
diff --git a/drivers/ide/ide-floppy_ioctl.c b/drivers/ide/ide-floppy_ioctl.c
|
|
index 9c22882..05f024c 100644
|
|
--- a/drivers/ide/ide-floppy_ioctl.c
|
|
+++ b/drivers/ide/ide-floppy_ioctl.c
|
|
@@ -287,8 +287,7 @@ int ide_floppy_ioctl(ide_drive_t *drive, struct block_device *bdev,
|
|
* and CDROM_SEND_PACKET (legacy) ioctls
|
|
*/
|
|
if (cmd != CDROM_SEND_PACKET && cmd != SCSI_IOCTL_SEND_COMMAND)
|
|
- err = scsi_cmd_ioctl(bdev->bd_disk->queue, bdev->bd_disk,
|
|
- mode, cmd, argp);
|
|
+ err = scsi_cmd_blk_ioctl(bdev, mode, cmd, argp);
|
|
|
|
if (err == -ENOTTY)
|
|
err = generic_ide_ioctl(drive, bdev, cmd, arg);
|
|
diff --git a/drivers/scsi/sd.c b/drivers/scsi/sd.c
|
|
index 5de155d..c6c449a 100644
|
|
--- a/drivers/scsi/sd.c
|
|
+++ b/drivers/scsi/sd.c
|
|
@@ -1079,7 +1079,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode,
|
|
error = scsi_ioctl(sdp, cmd, p);
|
|
break;
|
|
default:
|
|
- error = scsi_cmd_ioctl(disk->queue, disk, mode, cmd, p);
|
|
+ error = scsi_cmd_blk_ioctl(bdev, mode, cmd, p);
|
|
if (error != -ENOTTY)
|
|
break;
|
|
error = scsi_ioctl(sdp, cmd, p);
|
|
diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h
|
|
index a7f9867..03a00a6 100644
|
|
--- a/include/linux/blkdev.h
|
|
+++ b/include/linux/blkdev.h
|
|
@@ -761,6 +761,8 @@ extern void blk_plug_device(struct request_queue *);
|
|
struct request *rq);
|
|
extern void blk_delay_queue(struct request_queue *, unsigned long);
|
|
extern void blk_recount_segments(struct request_queue *, struct bio *);
|
|
+extern int scsi_cmd_blk_ioctl(struct block_device *, fmode_t,
|
|
+ unsigned int, void __user *);
|
|
extern int scsi_cmd_ioctl(struct request_queue *, struct gendisk *, fmode_t,
|
|
unsigned int, void __user *);
|
|
extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t,
|
|
--
|
|
1.7.7.1
|
|
|
|
|