Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit d60be47f authored by Christoph Hellwig's avatar Christoph Hellwig Committed by Greg Kroah-Hartman
Browse files

dasd: refactor dasd_ioctl_information



[ Upstream commit 9353848c6589ffe6373d03f3a58feaeda1009641 ]

Prepare for in-kernel callers of this functionality.

Signed-off-by: default avatarChristoph Hellwig <hch@lst.de>
[sth@de.ibm.com: remove leftover kfree]
Signed-off-by: default avatarStefan Haberland <sth@linux.ibm.com>
Reviewed-by: default avatarPeter Oberparleiter <oberpar@linux.ibm.com>
Reviewed-by: default avatarJan Hoeppner <hoeppner@linux.ibm.com>
Signed-off-by: default avatarJens Axboe <axboe@kernel.dk>
Stable-dep-of: ccc45cb4e727 ("s390/dasd: Use correct lock while counting channel queue length")
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
parent 7f3bb75a
Loading
Loading
Loading
Loading
+23 −19
Original line number Diff line number Diff line
@@ -457,10 +457,9 @@ static int dasd_ioctl_read_profile(struct dasd_block *block, void __user *argp)
/*
 * Return dasd information. Used for BIODASDINFO and BIODASDINFO2.
 */
static int dasd_ioctl_information(struct dasd_block *block,
				  unsigned int cmd, void __user *argp)
static int __dasd_ioctl_information(struct dasd_block *block,
		struct dasd_information2_t *dasd_info)
{
	struct dasd_information2_t *dasd_info;
	struct subchannel_id sch_id;
	struct ccw_dev_id dev_id;
	struct dasd_device *base;
@@ -473,15 +472,9 @@ static int dasd_ioctl_information(struct dasd_block *block,
	if (!base->discipline || !base->discipline->fill_info)
		return -EINVAL;

	dasd_info = kzalloc(sizeof(struct dasd_information2_t), GFP_KERNEL);
	if (dasd_info == NULL)
		return -ENOMEM;

	rc = base->discipline->fill_info(base, dasd_info);
	if (rc) {
		kfree(dasd_info);
	if (rc)
		return rc;
	}

	cdev = base->cdev;
	ccw_device_get_id(cdev, &dev_id);
@@ -520,15 +513,24 @@ static int dasd_ioctl_information(struct dasd_block *block,
	list_for_each(l, &base->ccw_queue)
		dasd_info->chanq_len++;
	spin_unlock_irqrestore(&block->queue_lock, flags);
	return 0;
}

	rc = 0;
	if (copy_to_user(argp, dasd_info,
			 ((cmd == (unsigned int) BIODASDINFO2) ?
			  sizeof(struct dasd_information2_t) :
			  sizeof(struct dasd_information_t))))
		rc = -EFAULT;
static int dasd_ioctl_information(struct dasd_block *block, void __user *argp,
		size_t copy_size)
{
	struct dasd_information2_t *dasd_info;
	int error;

	dasd_info = kzalloc(sizeof(*dasd_info), GFP_KERNEL);
	if (!dasd_info)
		return -ENOMEM;

	error = __dasd_ioctl_information(block, dasd_info);
	if (!error && copy_to_user(argp, dasd_info, copy_size))
		error = -EFAULT;
	kfree(dasd_info);
	return rc;
	return error;
}

/*
@@ -622,10 +624,12 @@ int dasd_ioctl(struct block_device *bdev, fmode_t mode,
		rc = dasd_ioctl_check_format(bdev, argp);
		break;
	case BIODASDINFO:
		rc = dasd_ioctl_information(block, cmd, argp);
		rc = dasd_ioctl_information(block, argp,
				sizeof(struct dasd_information_t));
		break;
	case BIODASDINFO2:
		rc = dasd_ioctl_information(block, cmd, argp);
		rc = dasd_ioctl_information(block, argp,
				sizeof(struct dasd_information2_t));
		break;
	case BIODASDPRRD:
		rc = dasd_ioctl_read_profile(block, argp);