[mkp-scsi:for-next 85/148] drivers/scsi/scsi_ioctl.c:206:28: sparse: sparse: incorrect type in initializer (different address spaces)

From: kernel test robot
Date: Fri Aug 06 2021 - 05:13:02 EST


tree: https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git for-next
head: f5efd4fe78de871515444b660029074be17ec11f
commit: f2542a3be3277a65c766fa6e86b930d3d839f79e [85/148] scsi: scsi_ioctl: Move the "block layer" SCSI ioctl handling to drivers/scsi
config: sh-randconfig-s032-20210728 (attached as .config)
compiler: sh4-linux-gcc (GCC) 10.3.0
reproduce:
wget https://raw.githubusercontent.com/intel/lkp-tests/master/sbin/make.cross -O ~/bin/make.cross
chmod +x ~/bin/make.cross
# apt-get install sparse
# sparse version: v0.6.3-348-gf0e6938b-dirty
# https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git/commit/?id=f2542a3be3277a65c766fa6e86b930d3d839f79e
git remote add mkp-scsi https://git.kernel.org/pub/scm/linux/kernel/git/mkp/scsi.git
git fetch --no-tags mkp-scsi for-next
git checkout f2542a3be3277a65c766fa6e86b930d3d839f79e
# save the attached .config to linux build tree
COMPILER_INSTALL_PATH=$HOME/0day COMPILER=gcc-10.3.0 make.cross C=1 CF='-fdiagnostic-prefix -D__CHECK_ENDIAN__' ARCH=sh

If you fix the issue, kindly add following tag as appropriate
Reported-by: kernel test robot <lkp@xxxxxxxxx>


sparse warnings: (new ones prefixed by >>)
drivers/scsi/scsi_ioctl.c:49:21: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned int const *__gu_addr @@ got unsigned int [noderef] __user * @@
drivers/scsi/scsi_ioctl.c:49:21: sparse: expected unsigned int const *__gu_addr
drivers/scsi/scsi_ioctl.c:49:21: sparse: got unsigned int [noderef] __user *
drivers/scsi/scsi_ioctl.c:49:21: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned int const *__gu_addr @@
drivers/scsi/scsi_ioctl.c:49:21: sparse: expected void const volatile [noderef] __user *ptr
drivers/scsi/scsi_ioctl.c:49:21: sparse: got unsigned int const *__gu_addr
>> drivers/scsi/scsi_ioctl.c:206:28: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected int const *__gu_addr @@ got int [noderef] __user *p @@
drivers/scsi/scsi_ioctl.c:206:28: sparse: expected int const *__gu_addr
drivers/scsi/scsi_ioctl.c:206:28: sparse: got int [noderef] __user *p
>> drivers/scsi/scsi_ioctl.c:206:28: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got int const *__gu_addr @@
drivers/scsi/scsi_ioctl.c:206:28: sparse: expected void const volatile [noderef] __user *ptr
drivers/scsi/scsi_ioctl.c:206:28: sparse: got int const *__gu_addr
drivers/scsi/scsi_ioctl.c:223:25: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected int const *__gu_addr @@ got int [noderef] __user *p @@
drivers/scsi/scsi_ioctl.c:223:25: sparse: expected int const *__gu_addr
drivers/scsi/scsi_ioctl.c:223:25: sparse: got int [noderef] __user *p
drivers/scsi/scsi_ioctl.c:223:25: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got int const *__gu_addr @@
drivers/scsi/scsi_ioctl.c:223:25: sparse: expected void const volatile [noderef] __user *ptr
drivers/scsi/scsi_ioctl.c:223:25: sparse: got int const *__gu_addr
drivers/scsi/scsi_ioctl.c:575:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned int const *__gu_addr @@ got unsigned int [noderef] __user * @@
drivers/scsi/scsi_ioctl.c:575:13: sparse: expected unsigned int const *__gu_addr
drivers/scsi/scsi_ioctl.c:575:13: sparse: got unsigned int [noderef] __user *
drivers/scsi/scsi_ioctl.c:575:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned int const *__gu_addr @@
drivers/scsi/scsi_ioctl.c:575:13: sparse: expected void const volatile [noderef] __user *ptr
drivers/scsi/scsi_ioctl.c:575:13: sparse: got unsigned int const *__gu_addr
drivers/scsi/scsi_ioctl.c:577:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned int const *__gu_addr @@ got unsigned int [noderef] __user * @@
drivers/scsi/scsi_ioctl.c:577:13: sparse: expected unsigned int const *__gu_addr
drivers/scsi/scsi_ioctl.c:577:13: sparse: got unsigned int [noderef] __user *
drivers/scsi/scsi_ioctl.c:577:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned int const *__gu_addr @@
drivers/scsi/scsi_ioctl.c:577:13: sparse: expected void const volatile [noderef] __user *ptr
drivers/scsi/scsi_ioctl.c:577:13: sparse: got unsigned int const *__gu_addr
>> drivers/scsi/scsi_ioctl.c:581:13: sparse: sparse: incorrect type in initializer (different address spaces) @@ expected unsigned char const *__gu_addr @@ got unsigned char [noderef] __user * @@
drivers/scsi/scsi_ioctl.c:581:13: sparse: expected unsigned char const *__gu_addr
drivers/scsi/scsi_ioctl.c:581:13: sparse: got unsigned char [noderef] __user *
>> drivers/scsi/scsi_ioctl.c:581:13: sparse: sparse: incorrect type in argument 1 (different address spaces) @@ expected void const volatile [noderef] __user *ptr @@ got unsigned char const *__gu_addr @@
drivers/scsi/scsi_ioctl.c:581:13: sparse: expected void const volatile [noderef] __user *ptr
drivers/scsi/scsi_ioctl.c:581:13: sparse: got unsigned char const *__gu_addr

vim +206 drivers/scsi/scsi_ioctl.c

34
35 /**
36 * ioctl_probe -- return host identification
37 * @host: host to identify
38 * @buffer: userspace buffer for identification
39 *
40 * Return an identifying string at @buffer, if @buffer is non-NULL, filling
41 * to the length stored at * (int *) @buffer.
42 */
43 static int ioctl_probe(struct Scsi_Host *host, void __user *buffer)
44 {
45 unsigned int len, slen;
46 const char *string;
47
48 if (buffer) {
> 49 if (get_user(len, (unsigned int __user *) buffer))
50 return -EFAULT;
51
52 if (host->hostt->info)
53 string = host->hostt->info(host);
54 else
55 string = host->hostt->name;
56 if (string) {
57 slen = strlen(string);
58 if (len > slen)
59 len = slen + 1;
60 if (copy_to_user(buffer, string, len))
61 return -EFAULT;
62 }
63 }
64 return 1;
65 }
66
67 /*
68
69 * The SCSI_IOCTL_SEND_COMMAND ioctl sends a command out to the SCSI host.
70 * The IOCTL_NORMAL_TIMEOUT and NORMAL_RETRIES variables are used.
71 *
72 * dev is the SCSI device struct ptr, *(int *) arg is the length of the
73 * input data, if any, not including the command string & counts,
74 * *((int *)arg + 1) is the output buffer size in bytes.
75 *
76 * *(char *) ((int *) arg)[2] the actual command byte.
77 *
78 * Note that if more than MAX_BUF bytes are requested to be transferred,
79 * the ioctl will fail with error EINVAL.
80 *
81 * This size *does not* include the initial lengths that were passed.
82 *
83 * The SCSI command is read from the memory location immediately after the
84 * length words, and the input data is right after the command. The SCSI
85 * routines know the command size based on the opcode decode.
86 *
87 * The output area is then filled in starting from the command byte.
88 */
89
90 static int ioctl_internal_command(struct scsi_device *sdev, char *cmd,
91 int timeout, int retries)
92 {
93 int result;
94 struct scsi_sense_hdr sshdr;
95
96 SCSI_LOG_IOCTL(1, sdev_printk(KERN_INFO, sdev,
97 "Trying ioctl with scsi command %d\n", *cmd));
98
99 result = scsi_execute_req(sdev, cmd, DMA_NONE, NULL, 0,
100 &sshdr, timeout, retries, NULL);
101
102 SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
103 "Ioctl returned 0x%x\n", result));
104
105 if (result < 0)
106 goto out;
107 if (scsi_sense_valid(&sshdr)) {
108 switch (sshdr.sense_key) {
109 case ILLEGAL_REQUEST:
110 if (cmd[0] == ALLOW_MEDIUM_REMOVAL)
111 sdev->lockable = 0;
112 else
113 sdev_printk(KERN_INFO, sdev,
114 "ioctl_internal_command: "
115 "ILLEGAL REQUEST "
116 "asc=0x%x ascq=0x%x\n",
117 sshdr.asc, sshdr.ascq);
118 break;
119 case NOT_READY: /* This happens if there is no disc in drive */
120 if (sdev->removable)
121 break;
122 fallthrough;
123 case UNIT_ATTENTION:
124 if (sdev->removable) {
125 sdev->changed = 1;
126 result = 0; /* This is no longer considered an error */
127 break;
128 }
129 fallthrough; /* for non-removable media */
130 default:
131 sdev_printk(KERN_INFO, sdev,
132 "ioctl_internal_command return code = %x\n",
133 result);
134 scsi_print_sense_hdr(sdev, NULL, &sshdr);
135 break;
136 }
137 }
138 out:
139 SCSI_LOG_IOCTL(2, sdev_printk(KERN_INFO, sdev,
140 "IOCTL Releasing command\n"));
141 return result;
142 }
143
144 int scsi_set_medium_removal(struct scsi_device *sdev, char state)
145 {
146 char scsi_cmd[MAX_COMMAND_SIZE];
147 int ret;
148
149 if (!sdev->removable || !sdev->lockable)
150 return 0;
151
152 scsi_cmd[0] = ALLOW_MEDIUM_REMOVAL;
153 scsi_cmd[1] = 0;
154 scsi_cmd[2] = 0;
155 scsi_cmd[3] = 0;
156 scsi_cmd[4] = state;
157 scsi_cmd[5] = 0;
158
159 ret = ioctl_internal_command(sdev, scsi_cmd,
160 IOCTL_NORMAL_TIMEOUT, NORMAL_RETRIES);
161 if (ret == 0)
162 sdev->locked = (state == SCSI_REMOVAL_PREVENT);
163 return ret;
164 }
165 EXPORT_SYMBOL(scsi_set_medium_removal);
166
167 /*
168 * The scsi_ioctl_get_pci() function places into arg the value
169 * pci_dev::slot_name (8 characters) for the PCI device (if any).
170 * Returns: 0 on success
171 * -ENXIO if there isn't a PCI device pointer
172 * (could be because the SCSI driver hasn't been
173 * updated yet, or because it isn't a SCSI
174 * device)
175 * any copy_to_user() error on failure there
176 */
177 static int scsi_ioctl_get_pci(struct scsi_device *sdev, void __user *arg)
178 {
179 struct device *dev = scsi_get_device(sdev->host);
180 const char *name;
181
182 if (!dev)
183 return -ENXIO;
184
185 name = dev_name(dev);
186
187 /* compatibility with old ioctl which only returned
188 * 20 characters */
189 return copy_to_user(arg, name, min(strlen(name), (size_t)20))
190 ? -EFAULT: 0;
191 }
192
193 static int sg_get_version(int __user *p)
194 {
195 static const int sg_version_num = 30527;
196 return put_user(sg_version_num, p);
197 }
198
199 static int sg_get_timeout(struct request_queue *q)
200 {
201 return jiffies_to_clock_t(q->sg_timeout);
202 }
203
204 static int sg_set_timeout(struct request_queue *q, int __user *p)
205 {
> 206 int timeout, err = get_user(timeout, p);
207
208 if (!err)
209 q->sg_timeout = clock_t_to_jiffies(timeout);
210
211 return err;
212 }
213

---
0-DAY CI Kernel Test Service, Intel Corporation
https://lists.01.org/hyperkitty/list/kbuild-all@xxxxxxxxxxxx

Attachment: .config.gz
Description: application/gzip