@@ -189,17 +189,7 @@ static int scsi_ioctl_get_pci(struct scsi_device *sdev, void __user *arg)
189
189
}
190
190
191
191
192
- /**
193
- * scsi_ioctl - Dispatch ioctl to scsi device
194
- * @sdev: scsi device receiving ioctl
195
- * @cmd: which ioctl is it
196
- * @arg: data associated with ioctl
197
- *
198
- * Description: The scsi_ioctl() function differs from most ioctls in that it
199
- * does not take a major/minor number as the dev field. Rather, it takes
200
- * a pointer to a &struct scsi_device.
201
- */
202
- int scsi_ioctl (struct scsi_device * sdev , int cmd , void __user * arg )
192
+ static int scsi_ioctl_common (struct scsi_device * sdev , int cmd , void __user * arg )
203
193
{
204
194
char scsi_cmd [MAX_COMMAND_SIZE ];
205
195
struct scsi_sense_hdr sense_hdr ;
@@ -266,14 +256,50 @@ int scsi_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)
266
256
return scsi_ioctl_get_pci (sdev , arg );
267
257
case SG_SCSI_RESET :
268
258
return scsi_ioctl_reset (sdev , arg );
269
- default :
270
- if (sdev -> host -> hostt -> ioctl )
271
- return sdev -> host -> hostt -> ioctl (sdev , cmd , arg );
272
259
}
260
+ return - ENOIOCTLCMD ;
261
+ }
262
+
263
+ /**
264
+ * scsi_ioctl - Dispatch ioctl to scsi device
265
+ * @sdev: scsi device receiving ioctl
266
+ * @cmd: which ioctl is it
267
+ * @arg: data associated with ioctl
268
+ *
269
+ * Description: The scsi_ioctl() function differs from most ioctls in that it
270
+ * does not take a major/minor number as the dev field. Rather, it takes
271
+ * a pointer to a &struct scsi_device.
272
+ */
273
+ int scsi_ioctl (struct scsi_device * sdev , int cmd , void __user * arg )
274
+ {
275
+ int ret = scsi_ioctl_common (sdev , cmd , arg );
276
+
277
+ if (ret != - ENOIOCTLCMD )
278
+ return ret ;
279
+
280
+ if (sdev -> host -> hostt -> ioctl )
281
+ return sdev -> host -> hostt -> ioctl (sdev , cmd , arg );
282
+
273
283
return - EINVAL ;
274
284
}
275
285
EXPORT_SYMBOL (scsi_ioctl );
276
286
287
+ #ifdef CONFIG_COMPAT
288
+ int scsi_compat_ioctl (struct scsi_device * sdev , int cmd , void __user * arg )
289
+ {
290
+ int ret = scsi_ioctl_common (sdev , cmd , arg );
291
+
292
+ if (ret != - ENOIOCTLCMD )
293
+ return ret ;
294
+
295
+ if (sdev -> host -> hostt -> compat_ioctl )
296
+ return sdev -> host -> hostt -> compat_ioctl (sdev , cmd , arg );
297
+
298
+ return ret ;
299
+ }
300
+ EXPORT_SYMBOL (scsi_compat_ioctl );
301
+ #endif
302
+
277
303
/*
278
304
* We can process a reset even when a device isn't fully operable.
279
305
*/
0 commit comments