Adjust the blk_verify_command function to let it look at per-queue data. This will be done in the next patch. Acked-by: Tejun Heo <tj@xxxxxxxxxx> Cc: stable@xxxxxxx Cc: FUJITA Tomonori <fujita.tomonori@xxxxxxxxxxxxx> Cc: Doug Gilbert <dgilbert@xxxxxxxxxxxx> Cc: "James E.J. Bottomley" <JBottomley@xxxxxxxxxxxxx> Cc: linux-scsi@xxxxxxxxxxxxxxx Cc: Jens Axboe <axboe@xxxxxxxxx> Signed-off-by: Paolo Bonzini <pbonzini@xxxxxxxxxx> --- block/bsg.c | 2 +- block/scsi_ioctl.c | 7 ++++--- drivers/scsi/sg.c | 3 ++- include/linux/blkdev.h | 3 ++- 4 files changed, 9 insertions(+), 6 deletions(-) diff --git a/block/bsg.c b/block/bsg.c index 420a5a9..dedd83c 100644 --- a/block/bsg.c +++ b/block/bsg.c @@ -187,7 +187,7 @@ static int blk_fill_sgv4_hdr_rq(struct request_queue *q, struct request *rq, return -EFAULT; if (hdr->subprotocol == BSG_SUB_PROTOCOL_SCSI_CMD) { - if (blk_verify_command(rq->cmd, has_write_perm)) + if (blk_verify_command(q, rq->cmd, has_write_perm)) return -EPERM; } else if (!capable(CAP_SYS_RAWIO)) return -EPERM; diff --git a/block/scsi_ioctl.c b/block/scsi_ioctl.c index a5ffcc9..96cab50 100644 --- a/block/scsi_ioctl.c +++ b/block/scsi_ioctl.c @@ -197,7 +197,8 @@ static void blk_set_cmd_filter_defaults(struct blk_cmd_filter *filter) __set_bit(GPCMD_SET_READ_AHEAD, filter->write_ok); } -int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm) +int blk_verify_command(struct request_queue *q, + unsigned char *cmd, fmode_t has_write_perm) { struct blk_cmd_filter *filter = &blk_default_cmd_filter; @@ -226,7 +227,7 @@ static int blk_fill_sghdr_rq(struct request_queue *q, struct request *rq, { if (copy_from_user(rq->cmd, hdr->cmdp, hdr->cmd_len)) return -EFAULT; - if (blk_verify_command(rq->cmd, mode & FMODE_WRITE)) + if (blk_verify_command(q, rq->cmd, mode & FMODE_WRITE)) return -EPERM; /* @@ -473,7 +474,7 @@ int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) goto error; - err = blk_verify_command(rq->cmd, mode & FMODE_WRITE); + err = blk_verify_command(q, rq->cmd, mode & FMODE_WRITE); if (err) goto error; diff --git a/drivers/scsi/sg.c b/drivers/scsi/sg.c index df5e961..533e789 100644 --- a/drivers/scsi/sg.c +++ b/drivers/scsi/sg.c @@ -218,11 +218,12 @@ static void sg_put_dev(Sg_device *sdp); static int sg_allow_access(struct file *filp, unsigned char *cmd) { struct sg_fd *sfp = filp->private_data; + struct request_queue *q = sfp->parentdp->device->request_queue; if (sfp->parentdp->device->type == TYPE_SCANNER) return 0; - return blk_verify_command(cmd, filp->f_mode & FMODE_WRITE); + return blk_verify_command(q, cmd, filp->f_mode & FMODE_WRITE); } static int get_exclude(Sg_device *sdp) diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 2fdb4a4..4fca347 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1089,7 +1089,8 @@ static inline int sb_issue_zeroout(struct super_block *sb, sector_t block, gfp_mask); } -extern int blk_verify_command(unsigned char *cmd, fmode_t has_write_perm); +extern int blk_verify_command(struct request_queue *q, + unsigned char *cmd, fmode_t has_write_perm); enum blk_default_limits { BLK_MAX_SEGMENTS = 128, -- 1.8.1.4 -- To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html