^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) // SPDX-License-Identifier: GPL-2.0-only
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) * Changes:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4) * Arnaldo Carvalho de Melo <acme@conectiva.com.br> 08/23/2000
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) * - get rid of some verify_areas and use __copy*user and __get/put_user
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6) * for the ones that remain
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/module.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9) #include <linux/blkdev.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/interrupt.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) #include <linux/errno.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) #include <linux/kernel.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) #include <linux/sched.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) #include <linux/mm.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) #include <linux/string.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) #include <linux/uaccess.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) #include <scsi/scsi.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) #include <scsi/scsi_cmnd.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) #include <scsi/scsi_device.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) #include <scsi/scsi_eh.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) #include <scsi/scsi_host.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) #include <scsi/scsi_ioctl.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) #include <scsi/sg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) #include <scsi/scsi_dbg.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) #include "scsi_logging.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) #define NORMAL_RETRIES 5
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) #define IOCTL_NORMAL_TIMEOUT (10 * HZ)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) #define MAX_BUF PAGE_SIZE
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) * ioctl_probe -- return host identification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) * @host: host to identify
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) * @buffer: userspace buffer for identification
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) * Return an identifying string at @buffer, if @buffer is non-NULL, filling
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) * to the length stored at * (int *) @buffer.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) static int ioctl_probe(struct Scsi_Host *host, void __user *buffer)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) unsigned int len, slen;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) const char *string;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) if (buffer) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) if (get_user(len, (unsigned int __user *) buffer))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) if (host->hostt->info)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) string = host->hostt->info(host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) string = host->hostt->name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) if (string) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) slen = strlen(string);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) if (len > slen)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58) len = slen + 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) if (copy_to_user(buffer, string, len))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) return 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * The SCSI_IOCTL_SEND_COMMAND ioctl sends a command out to the SCSI host.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) * The IOCTL_NORMAL_TIMEOUT and NORMAL_RETRIES variables are used.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) * dev is the SCSI device struct ptr, *(int *) arg is the length of the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) * input data, if any, not including the command string & counts,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) * *((int *)arg + 1) is the output buffer size in bytes.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75) * *(char *) ((int *) arg)[2] the actual command byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) * Note that if more than MAX_BUF bytes are requested to be transferred,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) * the ioctl will fail with error EINVAL.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) * This size *does not* include the initial lengths that were passed.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82) * The SCSI command is read from the memory location immediately after the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) * length words, and the input data is right after the command. The SCSI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * routines know the command size based on the opcode decode.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * The output area is then filled in starting from the command byte.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) static int ioctl_internal_command(struct scsi_device *sdev, char *cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) int timeout, int retries)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) int result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) struct scsi_sense_hdr sshdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) SCSI_LOG_IOCTL(1, sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96) "Trying ioctl with scsi command %d\n", *cmd));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, 0,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) &sshdr, timeout, retries, NULL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) "Ioctl returned 0x%x\n", result));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) if (driver_byte(result) == DRIVER_SENSE &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) scsi_sense_valid(&sshdr)) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) switch (sshdr.sense_key) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) case ILLEGAL_REQUEST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) if (cmd[0] == ALLOW_MEDIUM_REMOVAL)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) sdev->lockable = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) "ioctl_internal_command: "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113) "ILLEGAL REQUEST "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) "asc=0x%x ascq=0x%x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) sshdr.asc, sshdr.ascq);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) case NOT_READY: /* This happens if there is no disc in drive */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) if (sdev->removable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) fallthrough;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) case UNIT_ATTENTION:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) if (sdev->removable) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) sdev->changed = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) result = 0; /* This is no longer considered an error */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) fallthrough; /* for non-removable media */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129) sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) "ioctl_internal_command return code = %x\n",
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) result);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132) scsi_print_sense_hdr(sdev, NULL, &sshdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) "IOCTL Releasing command\n"));
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) return result;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) int scsi_set_medium_removal(struct scsi_device *sdev, char state)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) char scsi_cmd[MAX_COMMAND_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) int ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) if (!sdev->removable || !sdev->lockable)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) scsi_cmd[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) scsi_cmd[2] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) scsi_cmd[3] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) scsi_cmd[4] = state;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) scsi_cmd[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) ret = ioctl_internal_command(sdev, scsi_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) IOCTL_NORMAL_TIMEOUT, NORMAL_RETRIES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) if (ret == 0)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160) sdev->locked = (state == SCSI_REMOVAL_PREVENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) EXPORT_SYMBOL(scsi_set_medium_removal);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) * The scsi_ioctl_get_pci() function places into arg the value
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * pci_dev::slot_name (8 characters) for the PCI device (if any).
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) * Returns: 0 on success
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) * -ENXIO if there isn't a PCI device pointer
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) * (could be because the SCSI driver hasn't been
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) * updated yet, or because it isn't a SCSI
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) * device)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) * any copy_to_user() error on failure there
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) static int scsi_ioctl_get_pci(struct scsi_device *sdev, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 176) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 177) struct device *dev = scsi_get_device(sdev->host);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 178) const char *name;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 179)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 180) if (!dev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 181) return -ENXIO;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 182)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 183) name = dev_name(dev);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 184)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 185) /* compatibility with old ioctl which only returned
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 186) * 20 characters */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 187) return copy_to_user(arg, name, min(strlen(name), (size_t)20))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 188) ? -EFAULT: 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 189) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 190)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 191)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 192) static int scsi_ioctl_common(struct scsi_device *sdev, int cmd, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 193) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 194) char scsi_cmd[MAX_COMMAND_SIZE];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 195) struct scsi_sense_hdr sense_hdr;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 196)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 197) /* Check for deprecated ioctls ... all the ioctls which don't
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 198) * follow the new unique numbering scheme are deprecated */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 199) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 200) case SCSI_IOCTL_SEND_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 201) case SCSI_IOCTL_TEST_UNIT_READY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 202) case SCSI_IOCTL_BENCHMARK_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 203) case SCSI_IOCTL_SYNC:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 204) case SCSI_IOCTL_START_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 205) case SCSI_IOCTL_STOP_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 206) printk(KERN_WARNING "program %s is using a deprecated SCSI "
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 207) "ioctl, please convert it to SG_IO\n", current->comm);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 208) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 209) default:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 210) break;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 211) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 212)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 213) switch (cmd) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 214) case SCSI_IOCTL_GET_IDLUN: {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 215) struct scsi_idlun v = {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 216) .dev_id = (sdev->id & 0xff)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 217) + ((sdev->lun & 0xff) << 8)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 218) + ((sdev->channel & 0xff) << 16)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 219) + ((sdev->host->host_no & 0xff) << 24),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 220) .host_unique_id = sdev->host->unique_id
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 221) };
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 222) if (copy_to_user(arg, &v, sizeof(struct scsi_idlun)))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 223) return -EFAULT;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 224) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 225) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 226) case SCSI_IOCTL_GET_BUS_NUMBER:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 227) return put_user(sdev->host->host_no, (int __user *)arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 228) case SCSI_IOCTL_PROBE_HOST:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 229) return ioctl_probe(sdev->host, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 230) case SCSI_IOCTL_SEND_COMMAND:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 231) if (!capable(CAP_SYS_ADMIN) || !capable(CAP_SYS_RAWIO))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 232) return -EACCES;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 233) return sg_scsi_ioctl(sdev->request_queue, NULL, 0, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 234) case SCSI_IOCTL_DOORLOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 235) return scsi_set_medium_removal(sdev, SCSI_REMOVAL_PREVENT);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 236) case SCSI_IOCTL_DOORUNLOCK:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 237) return scsi_set_medium_removal(sdev, SCSI_REMOVAL_ALLOW);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 238) case SCSI_IOCTL_TEST_UNIT_READY:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 239) return scsi_test_unit_ready(sdev, IOCTL_NORMAL_TIMEOUT,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 240) NORMAL_RETRIES, &sense_hdr);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 241) case SCSI_IOCTL_START_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 242) scsi_cmd[0] = START_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 243) scsi_cmd[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 244) scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 245) scsi_cmd[4] = 1;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 246) return ioctl_internal_command(sdev, scsi_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 247) START_STOP_TIMEOUT, NORMAL_RETRIES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 248) case SCSI_IOCTL_STOP_UNIT:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 249) scsi_cmd[0] = START_STOP;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 250) scsi_cmd[1] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 251) scsi_cmd[2] = scsi_cmd[3] = scsi_cmd[5] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 252) scsi_cmd[4] = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 253) return ioctl_internal_command(sdev, scsi_cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 254) START_STOP_TIMEOUT, NORMAL_RETRIES);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 255) case SCSI_IOCTL_GET_PCI:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 256) return scsi_ioctl_get_pci(sdev, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 257) case SG_SCSI_RESET:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 258) return scsi_ioctl_reset(sdev, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 259) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 260) return -ENOIOCTLCMD;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 261) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 262)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 263) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 264) * scsi_ioctl - Dispatch ioctl to scsi device
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 265) * @sdev: scsi device receiving ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 266) * @cmd: which ioctl is it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 267) * @arg: data associated with ioctl
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 268) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 269) * Description: The scsi_ioctl() function differs from most ioctls in that it
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 270) * does not take a major/minor number as the dev field. Rather, it takes
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 271) * a pointer to a &struct scsi_device.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 272) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 273) int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 274) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 275) int ret = scsi_ioctl_common(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 276)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 277) if (ret != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 278) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 279)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 280) if (sdev->host->hostt->ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 281) return sdev->host->hostt->ioctl(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 282)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 283) return -EINVAL;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 284) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 285) EXPORT_SYMBOL(scsi_ioctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 286)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 287) #ifdef CONFIG_COMPAT
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 288) int scsi_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 289) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 290) int ret = scsi_ioctl_common(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 291)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 292) if (ret != -ENOIOCTLCMD)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 293) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 294)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 295) if (sdev->host->hostt->compat_ioctl)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 296) return sdev->host->hostt->compat_ioctl(sdev, cmd, arg);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 297)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 298) return ret;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 299) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 300) EXPORT_SYMBOL(scsi_compat_ioctl);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 301) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 302)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 303) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 304) * We can process a reset even when a device isn't fully operable.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 305) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 306) int scsi_ioctl_block_when_processing_errors(struct scsi_device *sdev, int cmd,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 307) bool ndelay)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 308) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 309) if (cmd == SG_SCSI_RESET && ndelay) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 310) if (scsi_host_in_recovery(sdev->host))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 311) return -EAGAIN;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 312) } else {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 313) if (!scsi_block_when_processing_errors(sdev))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 314) return -ENODEV;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 315) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 316)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 317) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 318) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 319) EXPORT_SYMBOL_GPL(scsi_ioctl_block_when_processing_errors);