Convert aacraid driver to the compat_ioctl entry points.

I don't have hardware, so this is only compile tested, but I just
did some transformations on the existing code.

Signed-off-by: Andi Kleen <[EMAIL PROTECTED]>

diff -u linux-2.6.11-rc1-bk4/drivers/scsi/aacraid/linit.c-o 
linux-2.6.11-rc1-bk4/drivers/scsi/aacraid/linit.c
--- linux-2.6.11-rc1-bk4/drivers/scsi/aacraid/linit.c-o 2005-01-14 
10:12:20.000000000 +0100
+++ linux-2.6.11-rc1-bk4/drivers/scsi/aacraid/linit.c   2005-01-18 
07:58:31.000000000 +0100
@@ -45,6 +45,7 @@
 #include <linux/syscalls.h>
 #include <linux/ioctl32.h>
 #include <linux/delay.h>
+#include <linux/smp_lock.h>
 #include <asm/semaphore.h>
 
 #include <scsi/scsi.h>
@@ -191,28 +192,6 @@
        { aac_rkt_init, "aacraid", "ADAPTEC ", "RAID            ", 2 } /* 
Adaptec Rocket Catch All */
 };
 
-#ifdef CONFIG_COMPAT
-/* 
- * Promote 32 bit apps that call get_next_adapter_fib_ioctl to 64 bit version 
- */
-static int aac_get_next_adapter_fib_ioctl(unsigned int fd, unsigned int cmd, 
-               unsigned long arg, struct file *file)
-{
-       struct fib_ioctl __user *f;
-
-       f = compat_alloc_user_space(sizeof(*f));
-       if (!access_ok(VERIFY_WRITE, f, sizeof(*f)))
-               return -EFAULT;
-
-       clear_user(f, sizeof(*f));
-       if (copy_in_user(f, (void __user *)arg, sizeof(struct fib_ioctl) - 
sizeof(u32)))
-               return -EFAULT;
-
-       return sys_ioctl(fd, cmd, (unsigned long)f);
-}
-#endif
-
-
 /**
  *     aac_queuecommand        -       queue a SCSI command
  *     @cmd:           SCSI command to queue
@@ -494,9 +473,65 @@
        return aac_do_ioctl(file->private_data, cmd, (void __user *)arg);
 }
 
+#ifdef CONFIG_COMPAT
+static long aac_compat_do_ioctl(struct aac_dev *dev, unsigned cmd, unsigned 
long arg)
+{
+       long ret;
+       lock_kernel();
+       switch (cmd) { 
+       case FSACTL_MINIPORT_REV_CHECK:
+       case FSACTL_SENDFIB:
+       case FSACTL_OPEN_GET_ADAPTER_FIB:
+       case FSACTL_CLOSE_GET_ADAPTER_FIB:
+       case FSACTL_SEND_RAW_SRB:
+       case FSACTL_GET_PCI_INFO:
+       case FSACTL_QUERY_DISK:
+       case FSACTL_DELETE_DISK:
+       case FSACTL_FORCE_DELETE_DISK:
+       case FSACTL_GET_CONTAINERS: 
+               ret = aac_do_ioctl(dev, cmd, (void __user *)arg);
+               break;
+
+       case FSACTL_GET_NEXT_ADAPTER_FIB: {
+               struct fib_ioctl __user *f;
+               
+               f = compat_alloc_user_space(sizeof(*f));
+               ret = 0;
+               if (clear_user(f, sizeof(*f) != sizeof(*f)))
+                       ret = -EFAULT;
+               if (copy_in_user(f, (void __user *)arg, sizeof(struct 
fib_ioctl) - sizeof(u32)))
+                       ret = -EFAULT;
+               if (!ret)
+                       ret = aac_do_ioctl(dev, cmd, (void __user *)arg);
+               break;
+       }
+
+       default:
+               ret = -ENOIOCTLCMD; 
+               break;
+       } 
+       unlock_kernel();
+       return ret;
+}
+
+static long aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user 
*arg)
+{
+       struct aac_dev *dev = (struct aac_dev *)sdev->host->hostdata;
+       return aac_compat_do_ioctl(dev, cmd, arg);
+}
+
+static long aac_compat_cfg_ioctl(struct file *file, unsigned cmd, unsigned 
long arg)
+{
+       return aac_compat_do_ioctl((struct aac_dev *)file->private_data, cmd, 
arg);
+}
+#endif
+
 static struct file_operations aac_cfg_fops = {
        .owner          = THIS_MODULE,
        .ioctl          = aac_cfg_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl   = aac_compat_cfg_ioctl,
+#endif
        .open           = aac_cfg_open,
 };
 
@@ -506,6 +541,9 @@
        .proc_name                      = "aacraid",
        .info                           = aac_info,
        .ioctl                          = aac_ioctl,
+#ifdef CONFIG_COMPAT
+       .compat_ioctl                   = aac_compat_ioctl,
+#endif
        .queuecommand                   = aac_queuecommand,
        .bios_param                     = aac_biosparm, 
        .slave_configure                = aac_slave_configure,
@@ -699,39 +737,11 @@
                printk(KERN_WARNING
                       "aacraid: unable to register \"aac\" device.\n");
        }
-#ifdef CONFIG_COMPAT
-       register_ioctl32_conversion(FSACTL_MINIPORT_REV_CHECK, NULL);
-       register_ioctl32_conversion(FSACTL_SENDFIB, NULL);
-       register_ioctl32_conversion(FSACTL_OPEN_GET_ADAPTER_FIB, NULL);
-       register_ioctl32_conversion(FSACTL_GET_NEXT_ADAPTER_FIB, 
-               aac_get_next_adapter_fib_ioctl);
-       register_ioctl32_conversion(FSACTL_CLOSE_GET_ADAPTER_FIB, NULL);
-       register_ioctl32_conversion(FSACTL_SEND_RAW_SRB, NULL);
-       register_ioctl32_conversion(FSACTL_GET_PCI_INFO, NULL);
-       register_ioctl32_conversion(FSACTL_QUERY_DISK, NULL);
-       register_ioctl32_conversion(FSACTL_DELETE_DISK, NULL);
-       register_ioctl32_conversion(FSACTL_FORCE_DELETE_DISK, NULL);
-       register_ioctl32_conversion(FSACTL_GET_CONTAINERS, NULL);
-#endif
-
        return 0;
 }
 
 static void __exit aac_exit(void)
 {
-#ifdef CONFIG_COMPAT
-       unregister_ioctl32_conversion(FSACTL_MINIPORT_REV_CHECK);
-       unregister_ioctl32_conversion(FSACTL_SENDFIB);
-       unregister_ioctl32_conversion(FSACTL_OPEN_GET_ADAPTER_FIB);
-       unregister_ioctl32_conversion(FSACTL_GET_NEXT_ADAPTER_FIB);
-       unregister_ioctl32_conversion(FSACTL_CLOSE_GET_ADAPTER_FIB);
-       unregister_ioctl32_conversion(FSACTL_SEND_RAW_SRB);
-       unregister_ioctl32_conversion(FSACTL_GET_PCI_INFO);
-       unregister_ioctl32_conversion(FSACTL_QUERY_DISK);
-       unregister_ioctl32_conversion(FSACTL_DELETE_DISK);
-       unregister_ioctl32_conversion(FSACTL_FORCE_DELETE_DISK);
-       unregister_ioctl32_conversion(FSACTL_GET_CONTAINERS);
-#endif
        unregister_chrdev(aac_cfg_major, "aac");
        pci_unregister_driver(&aac_pci_driver);
 }
-
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to [EMAIL PROTECTED]
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to