mirror of
https://github.com/torvalds/linux.git
synced 2024-11-24 21:21:41 +00:00
scsi: replace the fmode_t argument to scsi_ioctl with a simple bool
Instead of passing a fmode_t and only checking it for FMODE_WRITE, pass a bool open_for_write to prepare for callers that won't have the fmode_t. Signed-off-by: Christoph Hellwig <hch@lst.de> Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com> Reviewed-by: Hannes Reinecke <hare@suse.de> Acked-by: Christian Brauner <brauner@kernel.org> Link: https://lore.kernel.org/r/20230608110258.189493-20-hch@lst.de Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
parent
5f4eb9d541
commit
2e80089c18
@ -877,7 +877,8 @@ static long ch_ioctl(struct file *file,
|
|||||||
}
|
}
|
||||||
|
|
||||||
default:
|
default:
|
||||||
return scsi_ioctl(ch->device, file->f_mode, cmd, argp);
|
return scsi_ioctl(ch->device, file->f_mode & FMODE_WRITE, cmd,
|
||||||
|
argp);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -346,7 +346,7 @@ bool scsi_cmd_allowed(unsigned char *cmd, bool open_for_write)
|
|||||||
EXPORT_SYMBOL(scsi_cmd_allowed);
|
EXPORT_SYMBOL(scsi_cmd_allowed);
|
||||||
|
|
||||||
static int scsi_fill_sghdr_rq(struct scsi_device *sdev, struct request *rq,
|
static int scsi_fill_sghdr_rq(struct scsi_device *sdev, struct request *rq,
|
||||||
struct sg_io_hdr *hdr, fmode_t mode)
|
struct sg_io_hdr *hdr, bool open_for_write)
|
||||||
{
|
{
|
||||||
struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
|
struct scsi_cmnd *scmd = blk_mq_rq_to_pdu(rq);
|
||||||
|
|
||||||
@ -354,7 +354,7 @@ static int scsi_fill_sghdr_rq(struct scsi_device *sdev, struct request *rq,
|
|||||||
return -EMSGSIZE;
|
return -EMSGSIZE;
|
||||||
if (copy_from_user(scmd->cmnd, hdr->cmdp, hdr->cmd_len))
|
if (copy_from_user(scmd->cmnd, hdr->cmdp, hdr->cmd_len))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
if (!scsi_cmd_allowed(scmd->cmnd, mode & FMODE_WRITE))
|
if (!scsi_cmd_allowed(scmd->cmnd, open_for_write))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
scmd->cmd_len = hdr->cmd_len;
|
scmd->cmd_len = hdr->cmd_len;
|
||||||
|
|
||||||
@ -407,7 +407,8 @@ static int scsi_complete_sghdr_rq(struct request *rq, struct sg_io_hdr *hdr,
|
|||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int sg_io(struct scsi_device *sdev, struct sg_io_hdr *hdr, fmode_t mode)
|
static int sg_io(struct scsi_device *sdev, struct sg_io_hdr *hdr,
|
||||||
|
bool open_for_write)
|
||||||
{
|
{
|
||||||
unsigned long start_time;
|
unsigned long start_time;
|
||||||
ssize_t ret = 0;
|
ssize_t ret = 0;
|
||||||
@ -448,7 +449,7 @@ static int sg_io(struct scsi_device *sdev, struct sg_io_hdr *hdr, fmode_t mode)
|
|||||||
goto out_put_request;
|
goto out_put_request;
|
||||||
}
|
}
|
||||||
|
|
||||||
ret = scsi_fill_sghdr_rq(sdev, rq, hdr, mode);
|
ret = scsi_fill_sghdr_rq(sdev, rq, hdr, open_for_write);
|
||||||
if (ret < 0)
|
if (ret < 0)
|
||||||
goto out_put_request;
|
goto out_put_request;
|
||||||
|
|
||||||
@ -477,8 +478,7 @@ out_put_request:
|
|||||||
/**
|
/**
|
||||||
* sg_scsi_ioctl -- handle deprecated SCSI_IOCTL_SEND_COMMAND ioctl
|
* sg_scsi_ioctl -- handle deprecated SCSI_IOCTL_SEND_COMMAND ioctl
|
||||||
* @q: request queue to send scsi commands down
|
* @q: request queue to send scsi commands down
|
||||||
* @mode: mode used to open the file through which the ioctl has been
|
* @open_for_write: is the file / block device opened for writing?
|
||||||
* submitted
|
|
||||||
* @sic: userspace structure describing the command to perform
|
* @sic: userspace structure describing the command to perform
|
||||||
*
|
*
|
||||||
* Send down the scsi command described by @sic to the device below
|
* Send down the scsi command described by @sic to the device below
|
||||||
@ -501,7 +501,7 @@ out_put_request:
|
|||||||
* Positive numbers returned are the compacted SCSI error codes (4
|
* Positive numbers returned are the compacted SCSI error codes (4
|
||||||
* bytes in one int) where the lowest byte is the SCSI status.
|
* bytes in one int) where the lowest byte is the SCSI status.
|
||||||
*/
|
*/
|
||||||
static int sg_scsi_ioctl(struct request_queue *q, fmode_t mode,
|
static int sg_scsi_ioctl(struct request_queue *q, bool open_for_write,
|
||||||
struct scsi_ioctl_command __user *sic)
|
struct scsi_ioctl_command __user *sic)
|
||||||
{
|
{
|
||||||
struct request *rq;
|
struct request *rq;
|
||||||
@ -554,7 +554,7 @@ static int sg_scsi_ioctl(struct request_queue *q, fmode_t mode,
|
|||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
err = -EPERM;
|
err = -EPERM;
|
||||||
if (!scsi_cmd_allowed(scmd->cmnd, mode & FMODE_WRITE))
|
if (!scsi_cmd_allowed(scmd->cmnd, open_for_write))
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
/* default. possible overridden later */
|
/* default. possible overridden later */
|
||||||
@ -776,7 +776,7 @@ static int scsi_put_cdrom_generic_arg(const struct cdrom_generic_command *cgc,
|
|||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scsi_cdrom_send_packet(struct scsi_device *sdev, fmode_t mode,
|
static int scsi_cdrom_send_packet(struct scsi_device *sdev, bool open_for_write,
|
||||||
void __user *arg)
|
void __user *arg)
|
||||||
{
|
{
|
||||||
struct cdrom_generic_command cgc;
|
struct cdrom_generic_command cgc;
|
||||||
@ -817,7 +817,7 @@ static int scsi_cdrom_send_packet(struct scsi_device *sdev, fmode_t mode,
|
|||||||
hdr.cmdp = ((struct cdrom_generic_command __user *) arg)->cmd;
|
hdr.cmdp = ((struct cdrom_generic_command __user *) arg)->cmd;
|
||||||
hdr.cmd_len = sizeof(cgc.cmd);
|
hdr.cmd_len = sizeof(cgc.cmd);
|
||||||
|
|
||||||
err = sg_io(sdev, &hdr, mode);
|
err = sg_io(sdev, &hdr, open_for_write);
|
||||||
if (err == -EFAULT)
|
if (err == -EFAULT)
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
|
|
||||||
@ -832,7 +832,7 @@ static int scsi_cdrom_send_packet(struct scsi_device *sdev, fmode_t mode,
|
|||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
static int scsi_ioctl_sg_io(struct scsi_device *sdev, fmode_t mode,
|
static int scsi_ioctl_sg_io(struct scsi_device *sdev, bool open_for_write,
|
||||||
void __user *argp)
|
void __user *argp)
|
||||||
{
|
{
|
||||||
struct sg_io_hdr hdr;
|
struct sg_io_hdr hdr;
|
||||||
@ -841,7 +841,7 @@ static int scsi_ioctl_sg_io(struct scsi_device *sdev, fmode_t mode,
|
|||||||
error = get_sg_io_hdr(&hdr, argp);
|
error = get_sg_io_hdr(&hdr, argp);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
error = sg_io(sdev, &hdr, mode);
|
error = sg_io(sdev, &hdr, open_for_write);
|
||||||
if (error == -EFAULT)
|
if (error == -EFAULT)
|
||||||
return error;
|
return error;
|
||||||
if (put_sg_io_hdr(&hdr, argp))
|
if (put_sg_io_hdr(&hdr, argp))
|
||||||
@ -852,7 +852,7 @@ static int scsi_ioctl_sg_io(struct scsi_device *sdev, fmode_t mode,
|
|||||||
/**
|
/**
|
||||||
* scsi_ioctl - Dispatch ioctl to scsi device
|
* scsi_ioctl - Dispatch ioctl to scsi device
|
||||||
* @sdev: scsi device receiving ioctl
|
* @sdev: scsi device receiving ioctl
|
||||||
* @mode: mode the block/char device is opened with
|
* @open_for_write: is the file / block device opened for writing?
|
||||||
* @cmd: which ioctl is it
|
* @cmd: which ioctl is it
|
||||||
* @arg: data associated with ioctl
|
* @arg: data associated with ioctl
|
||||||
*
|
*
|
||||||
@ -860,7 +860,7 @@ static int scsi_ioctl_sg_io(struct scsi_device *sdev, fmode_t mode,
|
|||||||
* does not take a major/minor number as the dev field. Rather, it takes
|
* does not take a major/minor number as the dev field. Rather, it takes
|
||||||
* a pointer to a &struct scsi_device.
|
* a pointer to a &struct scsi_device.
|
||||||
*/
|
*/
|
||||||
int scsi_ioctl(struct scsi_device *sdev, fmode_t mode, int cmd,
|
int scsi_ioctl(struct scsi_device *sdev, bool open_for_write, int cmd,
|
||||||
void __user *arg)
|
void __user *arg)
|
||||||
{
|
{
|
||||||
struct request_queue *q = sdev->request_queue;
|
struct request_queue *q = sdev->request_queue;
|
||||||
@ -896,11 +896,11 @@ int scsi_ioctl(struct scsi_device *sdev, fmode_t mode, int cmd,
|
|||||||
case SG_EMULATED_HOST:
|
case SG_EMULATED_HOST:
|
||||||
return sg_emulated_host(q, arg);
|
return sg_emulated_host(q, arg);
|
||||||
case SG_IO:
|
case SG_IO:
|
||||||
return scsi_ioctl_sg_io(sdev, mode, arg);
|
return scsi_ioctl_sg_io(sdev, open_for_write, arg);
|
||||||
case SCSI_IOCTL_SEND_COMMAND:
|
case SCSI_IOCTL_SEND_COMMAND:
|
||||||
return sg_scsi_ioctl(q, mode, arg);
|
return sg_scsi_ioctl(q, open_for_write, arg);
|
||||||
case CDROM_SEND_PACKET:
|
case CDROM_SEND_PACKET:
|
||||||
return scsi_cdrom_send_packet(sdev, mode, arg);
|
return scsi_cdrom_send_packet(sdev, open_for_write, arg);
|
||||||
case CDROMCLOSETRAY:
|
case CDROMCLOSETRAY:
|
||||||
return scsi_send_start_stop(sdev, 3);
|
return scsi_send_start_stop(sdev, 3);
|
||||||
case CDROMEJECT:
|
case CDROMEJECT:
|
||||||
|
@ -1463,7 +1463,7 @@ static int sd_ioctl(struct block_device *bdev, fmode_t mode,
|
|||||||
|
|
||||||
if (is_sed_ioctl(cmd))
|
if (is_sed_ioctl(cmd))
|
||||||
return sed_ioctl(sdkp->opal_dev, cmd, p);
|
return sed_ioctl(sdkp->opal_dev, cmd, p);
|
||||||
return scsi_ioctl(sdp, mode, cmd, p);
|
return scsi_ioctl(sdp, mode & FMODE_WRITE, cmd, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_media_not_present(struct scsi_disk *sdkp)
|
static void set_media_not_present(struct scsi_disk *sdkp)
|
||||||
|
@ -1103,7 +1103,8 @@ sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,
|
|||||||
case SCSI_IOCTL_SEND_COMMAND:
|
case SCSI_IOCTL_SEND_COMMAND:
|
||||||
if (atomic_read(&sdp->detaching))
|
if (atomic_read(&sdp->detaching))
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
return scsi_ioctl(sdp->device, filp->f_mode, cmd_in, p);
|
return scsi_ioctl(sdp->device, filp->f_mode & FMODE_WRITE,
|
||||||
|
cmd_in, p);
|
||||||
case SG_SET_DEBUG:
|
case SG_SET_DEBUG:
|
||||||
result = get_user(val, ip);
|
result = get_user(val, ip);
|
||||||
if (result)
|
if (result)
|
||||||
@ -1159,7 +1160,7 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
|
|||||||
ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);
|
ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);
|
||||||
if (ret != -ENOIOCTLCMD)
|
if (ret != -ENOIOCTLCMD)
|
||||||
return ret;
|
return ret;
|
||||||
return scsi_ioctl(sdp->device, filp->f_mode, cmd_in, p);
|
return scsi_ioctl(sdp->device, filp->f_mode & FMODE_WRITE, cmd_in, p);
|
||||||
}
|
}
|
||||||
|
|
||||||
static __poll_t
|
static __poll_t
|
||||||
|
@ -543,7 +543,7 @@ static int sr_block_ioctl(struct block_device *bdev, fmode_t mode, unsigned cmd,
|
|||||||
if (ret != -ENOSYS)
|
if (ret != -ENOSYS)
|
||||||
goto put;
|
goto put;
|
||||||
}
|
}
|
||||||
ret = scsi_ioctl(sdev, mode, cmd, argp);
|
ret = scsi_ioctl(sdev, mode & FMODE_WRITE, cmd, argp);
|
||||||
|
|
||||||
put:
|
put:
|
||||||
scsi_autopm_put_device(sdev);
|
scsi_autopm_put_device(sdev);
|
||||||
|
@ -3832,7 +3832,7 @@ static long st_ioctl(struct file *file, unsigned int cmd_in, unsigned long arg)
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
retval = scsi_ioctl(STp->device, file->f_mode, cmd_in, p);
|
retval = scsi_ioctl(STp->device, file->f_mode & FMODE_WRITE, cmd_in, p);
|
||||||
if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) {
|
if (!retval && cmd_in == SCSI_IOCTL_STOP_UNIT) {
|
||||||
/* unload */
|
/* unload */
|
||||||
STp->rew_at_close = 0;
|
STp->rew_at_close = 0;
|
||||||
|
@ -45,7 +45,7 @@ typedef struct scsi_fctargaddress {
|
|||||||
|
|
||||||
int scsi_ioctl_block_when_processing_errors(struct scsi_device *sdev,
|
int scsi_ioctl_block_when_processing_errors(struct scsi_device *sdev,
|
||||||
int cmd, bool ndelay);
|
int cmd, bool ndelay);
|
||||||
int scsi_ioctl(struct scsi_device *sdev, fmode_t mode, int cmd,
|
int scsi_ioctl(struct scsi_device *sdev, bool open_for_write, int cmd,
|
||||||
void __user *arg);
|
void __user *arg);
|
||||||
int get_sg_io_hdr(struct sg_io_hdr *hdr, const void __user *argp);
|
int get_sg_io_hdr(struct sg_io_hdr *hdr, const void __user *argp);
|
||||||
int put_sg_io_hdr(const struct sg_io_hdr *hdr, void __user *argp);
|
int put_sg_io_hdr(const struct sg_io_hdr *hdr, void __user *argp);
|
||||||
|
Loading…
Reference in New Issue
Block a user