Commit 2daa672b authored by Arnd Bergmann's avatar Arnd Bergmann Committed by Jens Axboe
Browse files

scsi/i2o: restore ioctl changes



This restores the changes from "scsi/i2o_block: cleanup ioctl
handling", which accidentally got reverted.

Origignal changelog:
      This fixes the ioctl function of the i2o_block driver, which
      has multiple problems:

      * The BLKI2OSRSTRAT and BLKI2OSWSTRAT commands always return
        -ENOTTY on success, where they should return 0.
      * Support for 32 bit compat is missing
      * The driver should use the .ioctl function and because
        .locked_ioctl is going away.

      The use of the big kernel lock remains for now, but gets
      made explictit in the ioctl function.

Signed-off-by: default avatarArnd Bergmann <arnd@arndb.de>
Signed-off-by: default avatarJens Axboe <jaxboe@fusionio.com>
parent 409f3499
Loading
Loading
Loading
Loading
+16 −5
Original line number Diff line number Diff line
@@ -657,30 +657,40 @@ static int i2o_block_ioctl(struct block_device *bdev, fmode_t mode,
{
	struct gendisk *disk = bdev->bd_disk;
	struct i2o_block_device *dev = disk->private_data;
	int ret = -ENOTTY;

	/* Anyone capable of this syscall can do *real bad* things */

	if (!capable(CAP_SYS_ADMIN))
		return -EPERM;

	lock_kernel();
	switch (cmd) {
	case BLKI2OGRSTRAT:
		return put_user(dev->rcache, (int __user *)arg);
		ret = put_user(dev->rcache, (int __user *)arg);
		break;
	case BLKI2OGWSTRAT:
		return put_user(dev->wcache, (int __user *)arg);
		ret = put_user(dev->wcache, (int __user *)arg);
		break;
	case BLKI2OSRSTRAT:
		ret = -EINVAL;
		if (arg < 0 || arg > CACHE_SMARTFETCH)
			return -EINVAL;
			break;
		dev->rcache = arg;
		ret = 0;
		break;
	case BLKI2OSWSTRAT:
		ret = -EINVAL;
		if (arg != 0
		    && (arg < CACHE_WRITETHROUGH || arg > CACHE_SMARTBACK))
			return -EINVAL;
			break;
		dev->wcache = arg;
		ret = 0;
		break;
	}
	return -ENOTTY;
	unlock_kernel();

	return ret;
};

/**
@@ -936,6 +946,7 @@ static const struct block_device_operations i2o_block_fops = {
	.open = i2o_block_open,
	.release = i2o_block_release,
	.ioctl = i2o_block_ioctl,
	.compat_ioctl = i2o_block_ioctl,
	.getgeo = i2o_block_getgeo,
	.media_changed = i2o_block_media_changed
};