Commit e915e872ed921d707bc32b3f2184d43abfa8c9e2
1 parent
5842e51ff2
Exists in
master
and in
7 other branches
[PATCH] switch sg_scsi_ioctl() to passing fmode_t
Signed-off-by: Al Viro <viro@zeniv.linux.org.uk>
Showing 4 changed files with 8 additions and 13 deletions Side-by-side Diff
block/scsi_ioctl.c
... | ... | @@ -379,12 +379,11 @@ |
379 | 379 | * bytes in one int) where the lowest byte is the SCSI status. |
380 | 380 | */ |
381 | 381 | #define OMAX_SB_LEN 16 /* For backward compatibility */ |
382 | -int sg_scsi_ioctl(struct file *file, struct request_queue *q, | |
383 | - struct gendisk *disk, struct scsi_ioctl_command __user *sic) | |
382 | +int sg_scsi_ioctl(struct request_queue *q, struct gendisk *disk, fmode_t mode, | |
383 | + struct scsi_ioctl_command __user *sic) | |
384 | 384 | { |
385 | 385 | struct request *rq; |
386 | 386 | int err; |
387 | - fmode_t write_perm = 0; | |
388 | 387 | unsigned int in_len, out_len, bytes, opcode, cmdlen; |
389 | 388 | char *buffer = NULL, sense[SCSI_SENSE_BUFFERSIZE]; |
390 | 389 | |
... | ... | @@ -426,11 +425,7 @@ |
426 | 425 | if (in_len && copy_from_user(buffer, sic->data + cmdlen, in_len)) |
427 | 426 | goto error; |
428 | 427 | |
429 | - /* scsi_ioctl passes NULL */ | |
430 | - if (file && (file->f_mode & FMODE_WRITE)) | |
431 | - write_perm = FMODE_WRITE; | |
432 | - | |
433 | - err = blk_verify_command(&q->cmd_filter, rq->cmd, write_perm); | |
428 | + err = blk_verify_command(&q->cmd_filter, rq->cmd, mode & FMODE_WRITE); | |
434 | 429 | if (err) |
435 | 430 | goto error; |
436 | 431 | |
... | ... | @@ -636,7 +631,7 @@ |
636 | 631 | if (!arg) |
637 | 632 | break; |
638 | 633 | |
639 | - err = sg_scsi_ioctl(file, q, bd_disk, arg); | |
634 | + err = sg_scsi_ioctl(q, bd_disk, file ? file->f_mode : 0, arg); | |
640 | 635 | break; |
641 | 636 | case CDROMCLOSETRAY: |
642 | 637 | err = blk_send_start_stop(q, bd_disk, 0x03); |
drivers/scsi/scsi_ioctl.c
... | ... | @@ -237,7 +237,7 @@ |
237 | 237 | case SCSI_IOCTL_SEND_COMMAND: |
238 | 238 | if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO)) |
239 | 239 | return -EACCES; |
240 | - return sg_scsi_ioctl(NULL, sdev->request_queue, NULL, arg); | |
240 | + return sg_scsi_ioctl(sdev->request_queue, NULL, 0, arg); | |
241 | 241 | case SCSI_IOCTL_DOORLOCK: |
242 | 242 | return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT); |
243 | 243 | case SCSI_IOCTL_DOORUNLOCK: |
drivers/scsi/sg.c
... | ... | @@ -1059,7 +1059,7 @@ |
1059 | 1059 | if (sg_allow_access(filp, &opcode)) |
1060 | 1060 | return -EPERM; |
1061 | 1061 | } |
1062 | - return sg_scsi_ioctl(filp, sdp->device->request_queue, NULL, p); | |
1062 | + return sg_scsi_ioctl(sdp->device->request_queue, NULL, filp->f_mode, p); | |
1063 | 1063 | case SG_SET_DEBUG: |
1064 | 1064 | result = get_user(val, ip); |
1065 | 1065 | if (result) |
include/linux/blkdev.h
... | ... | @@ -719,8 +719,8 @@ |
719 | 719 | extern void blk_recount_segments(struct request_queue *, struct bio *); |
720 | 720 | extern int scsi_cmd_ioctl(struct file *, struct request_queue *, |
721 | 721 | struct gendisk *, unsigned int, void __user *); |
722 | -extern int sg_scsi_ioctl(struct file *, struct request_queue *, | |
723 | - struct gendisk *, struct scsi_ioctl_command __user *); | |
722 | +extern int sg_scsi_ioctl(struct request_queue *, struct gendisk *, fmode_t, | |
723 | + struct scsi_ioctl_command __user *); | |
724 | 724 | |
725 | 725 | /* |
726 | 726 | * Temporary export, until SCSI gets fixed up. |