瀏覽代碼

[S390] dasd: add missing compat ptr conversion

Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
Signed-off-by: Martin Schwidefsky <schwidefsky@de.ibm.com>
Heiko Carstens 15 年之前
父節點
當前提交
880348653e
共有 1 個文件被更改,包括 9 次插入5 次删除
  1. 9 5
      drivers/s390/block/dasd_ioctl.c

+ 9 - 5
drivers/s390/block/dasd_ioctl.c

@@ -17,7 +17,7 @@
 #include <linux/fs.h>
 #include <linux/fs.h>
 #include <linux/blkpg.h>
 #include <linux/blkpg.h>
 #include <linux/smp_lock.h>
 #include <linux/smp_lock.h>
-
+#include <asm/compat.h>
 #include <asm/ccwdev.h>
 #include <asm/ccwdev.h>
 #include <asm/cmb.h>
 #include <asm/cmb.h>
 #include <asm/uaccess.h>
 #include <asm/uaccess.h>
@@ -358,9 +358,8 @@ dasd_ioctl_set_ro(struct block_device *bdev, void __user *argp)
 }
 }
 
 
 static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd,
 static int dasd_ioctl_readall_cmb(struct dasd_block *block, unsigned int cmd,
-		unsigned long arg)
+				  struct cmbdata __user *argp)
 {
 {
-	struct cmbdata __user *argp = (void __user *) arg;
 	size_t size = _IOC_SIZE(cmd);
 	size_t size = _IOC_SIZE(cmd);
 	struct cmbdata data;
 	struct cmbdata data;
 	int ret;
 	int ret;
@@ -376,7 +375,12 @@ dasd_do_ioctl(struct block_device *bdev, fmode_t mode,
 	      unsigned int cmd, unsigned long arg)
 	      unsigned int cmd, unsigned long arg)
 {
 {
 	struct dasd_block *block = bdev->bd_disk->private_data;
 	struct dasd_block *block = bdev->bd_disk->private_data;
-	void __user *argp = (void __user *)arg;
+	void __user *argp;
+
+	if (is_compat_task())
+		argp = compat_ptr(arg);
+	else
+		argp = (void __user *)arg;
 
 
 	if (!block)
 	if (!block)
                 return -ENODEV;
                 return -ENODEV;
@@ -414,7 +418,7 @@ dasd_do_ioctl(struct block_device *bdev, fmode_t mode,
 	case BIODASDCMFDISABLE:
 	case BIODASDCMFDISABLE:
 		return disable_cmf(block->base->cdev);
 		return disable_cmf(block->base->cdev);
 	case BIODASDREADALLCMB:
 	case BIODASDREADALLCMB:
-		return dasd_ioctl_readall_cmb(block, cmd, arg);
+		return dasd_ioctl_readall_cmb(block, cmd, argp);
 	default:
 	default:
 		/* if the discipline has an ioctl method try it. */
 		/* if the discipline has an ioctl method try it. */
 		if (block->base->discipline->ioctl) {
 		if (block->base->discipline->ioctl) {