Commit e915e872ed921d707bc32b3f2184d43abfa8c9e2

Authored by Al Viro
1 parent 5842e51ff2

[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

... ... @@ -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:
... ... @@ -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.