167 lines
6.2 KiB
Diff
167 lines
6.2 KiB
Diff
From a7f3cbff409dde86b6bded8978f71bc193022427 Mon Sep 17 00:00:00 2001
|
|
From: Paolo Bonzini <pbonzini@redhat.com>
|
|
Date: Mon, 16 Jan 2012 17:12:58 +0100
|
|
Subject: [PATCH 1/3] block: add and use scsi_blk_cmd_ioctl
|
|
|
|
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.
|
|
|
|
[ Cherry picked from 6ad62f051ef784a48a6103af289f91b5c472e955 ]
|
|
|
|
Cc: stable@kernel.org
|
|
Cc: linux-scsi@vger.kernel.org
|
|
Cc: Jens Axboe <axboe@kernel.dk>
|
|
Cc: James Bottomley <JBottomley@parallels.com>
|
|
Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
|
|
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
|
|
---
|
|
block/scsi_ioctl.c | 7 +++++++
|
|
drivers/block/cciss.c | 6 +++---
|
|
drivers/block/ub.c | 3 +--
|
|
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(+), 12 deletions(-)
|
|
|
|
diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c
|
|
index fbdf0d8..a2c11f3 100644
|
|
--- a/block/scsi_ioctl.c
|
|
+++ b/block/scsi_ioctl.c
|
|
@@ -690,6 +690,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 587cce5..b0f553b 100644
|
|
--- a/drivers/block/cciss.c
|
|
+++ b/drivers/block/cciss.c
|
|
@@ -1735,7 +1735,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:
|
|
@@ -1746,9 +1746,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 0e376d4..7333b9e 100644
|
|
--- a/drivers/block/ub.c
|
|
+++ b/drivers/block/ub.c
|
|
@@ -1744,12 +1744,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 4d0b70a..e46f2f7 100644
|
|
--- a/drivers/block/virtio_blk.c
|
|
+++ b/drivers/block/virtio_blk.c
|
|
@@ -243,8 +243,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 f997c27..cedb231 100644
|
|
--- a/drivers/cdrom/cdrom.c
|
|
+++ b/drivers/cdrom/cdrom.c
|
|
@@ -2747,12 +2747,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 d267b7a..a22ca84 100644
|
|
--- a/drivers/ide/ide-floppy_ioctl.c
|
|
+++ b/drivers/ide/ide-floppy_ioctl.c
|
|
@@ -292,8 +292,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 fa3a591..ffa1c79 100644
|
|
--- a/drivers/scsi/sd.c
|
|
+++ b/drivers/scsi/sd.c
|
|
@@ -1096,7 +1096,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 94acd81..ca7b869 100644
|
|
--- a/include/linux/blkdev.h
|
|
+++ b/include/linux/blkdev.h
|
|
@@ -675,6 +675,8 @@ extern int blk_insert_cloned_request(struct request_queue *q,
|
|
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.6
|
|
|