]> pilppa.org Git - linux-2.6-omap-h63xx.git/blobdiff - drivers/md/dm-ioctl.c
lguest: virtio-rng support
[linux-2.6-omap-h63xx.git] / drivers / md / dm-ioctl.c
index 9627fa0f9470cfdb4055199e83eb68c7f8a5f18f..b262c0042de3f79394d7ff46c61e36b68da29e48 100644 (file)
@@ -15,6 +15,7 @@
 #include <linux/slab.h>
 #include <linux/dm-ioctl.h>
 #include <linux/hdreg.h>
+#include <linux/compat.h>
 
 #include <asm/uaccess.h>
 
@@ -702,7 +703,7 @@ static int dev_rename(struct dm_ioctl *param, size_t param_size)
        int r;
        char *new_name = (char *) param + param->data_start;
 
-       if (new_name < (char *) param->data ||
+       if (new_name < param->data ||
            invalid_str(new_name, (void *) param + param_size)) {
                DMWARN("Invalid new logical volume name supplied.");
                return -EINVAL;
@@ -728,7 +729,7 @@ static int dev_set_geometry(struct dm_ioctl *param, size_t param_size)
        if (!md)
                return -ENXIO;
 
-       if (geostr < (char *) param->data ||
+       if (geostr < param->data ||
            invalid_str(geostr, (void *) param + param_size)) {
                DMWARN("Invalid geometry supplied.");
                goto out;
@@ -1350,10 +1351,10 @@ static int copy_params(struct dm_ioctl __user *user, struct dm_ioctl **param)
 {
        struct dm_ioctl tmp, *dmi;
 
-       if (copy_from_user(&tmp, user, sizeof(tmp)))
+       if (copy_from_user(&tmp, user, sizeof(tmp) - sizeof(tmp.data)))
                return -EFAULT;
 
-       if (tmp.data_size < sizeof(tmp))
+       if (tmp.data_size < (sizeof(tmp) - sizeof(tmp.data)))
                return -EINVAL;
 
        dmi = vmalloc(tmp.data_size);
@@ -1397,13 +1398,11 @@ static int validate_params(uint cmd, struct dm_ioctl *param)
        return 0;
 }
 
-static int ctl_ioctl(struct inode *inode, struct file *file,
-                    uint command, ulong u)
+static int ctl_ioctl(uint command, struct dm_ioctl __user *user)
 {
        int r = 0;
        unsigned int cmd;
-       struct dm_ioctl *param;
-       struct dm_ioctl __user *user = (struct dm_ioctl __user *) u;
+       struct dm_ioctl *uninitialized_var(param);
        ioctl_fn fn = NULL;
        size_t param_size;
 
@@ -1471,8 +1470,23 @@ static int ctl_ioctl(struct inode *inode, struct file *file,
        return r;
 }
 
+static long dm_ctl_ioctl(struct file *file, uint command, ulong u)
+{
+       return (long)ctl_ioctl(command, (struct dm_ioctl __user *)u);
+}
+
+#ifdef CONFIG_COMPAT
+static long dm_compat_ctl_ioctl(struct file *file, uint command, ulong u)
+{
+       return (long)dm_ctl_ioctl(file, command, (ulong) compat_ptr(u));
+}
+#else
+#define dm_compat_ctl_ioctl NULL
+#endif
+
 static const struct file_operations _ctl_fops = {
-       .ioctl   = ctl_ioctl,
+       .unlocked_ioctl  = dm_ctl_ioctl,
+       .compat_ioctl = dm_compat_ctl_ioctl,
        .owner   = THIS_MODULE,
 };