compat_ioctl: scsi: move ioctl handling into drivers
[linux-2.6-microblaze.git] / drivers / scsi / sg.c
index eace888..bafeaf7 100644 (file)
@@ -911,19 +911,14 @@ static int put_compat_request_table(struct compat_sg_req_info __user *o,
 #endif
 
 static long
-sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
+sg_ioctl_common(struct file *filp, Sg_device *sdp, Sg_fd *sfp,
+               unsigned int cmd_in, void __user *p)
 {
-       void __user *p = (void __user *)arg;
        int __user *ip = p;
        int result, val, read_only;
-       Sg_device *sdp;
-       Sg_fd *sfp;
        Sg_request *srp;
        unsigned long iflags;
 
-       if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
-               return -ENXIO;
-
        SCSI_LOG_TIMEOUT(3, sg_printk(KERN_INFO, sdp,
                                   "sg_ioctl: cmd=0x%x\n", (int) cmd_in));
        read_only = (O_RDWR != (filp->f_flags & O_ACCMODE));
@@ -1146,29 +1141,44 @@ sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
                        cmd_in, filp->f_flags & O_NDELAY);
        if (result)
                return result;
+
+       return -ENOIOCTLCMD;
+}
+
+static long
+sg_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
+{
+       void __user *p = (void __user *)arg;
+       Sg_device *sdp;
+       Sg_fd *sfp;
+       int ret;
+
+       if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
+               return -ENXIO;
+
+       ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);
+       if (ret != -ENOIOCTLCMD)
+               return ret;
+
        return scsi_ioctl(sdp->device, cmd_in, p);
 }
 
 #ifdef CONFIG_COMPAT
 static long sg_compat_ioctl(struct file *filp, unsigned int cmd_in, unsigned long arg)
 {
+       void __user *p = compat_ptr(arg);
        Sg_device *sdp;
        Sg_fd *sfp;
-       struct scsi_device *sdev;
+       int ret;
 
        if ((!(sfp = (Sg_fd *) filp->private_data)) || (!(sdp = sfp->parentdp)))
                return -ENXIO;
 
-       sdev = sdp->device;
-       if (sdev->host->hostt->compat_ioctl) { 
-               int ret;
-
-               ret = sdev->host->hostt->compat_ioctl(sdev, cmd_in, (void __user *)arg);
-
+       ret = sg_ioctl_common(filp, sdp, sfp, cmd_in, p);
+       if (ret != -ENOIOCTLCMD)
                return ret;
-       }
-       
-       return -ENOIOCTLCMD;
+
+       return scsi_compat_ioctl(sdp->device, cmd_in, p);
 }
 #endif