dasd: refactor dasd_ioctl_information
Prepare for in-kernel callers of this functionality. Signed-off-by: Christoph Hellwig <hch@lst.de> [sth@de.ibm.com: remove leftover kfree] Signed-off-by: Stefan Haberland <sth@linux.ibm.com> Reviewed-by: Peter Oberparleiter <oberpar@linux.ibm.com> Reviewed-by: Jan Hoeppner <hoeppner@linux.ibm.com> Signed-off-by: Jens Axboe <axboe@kernel.dk>
This commit is contained in:
Родитель
3448914e8c
Коммит
9353848c65
|
@ -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);
|
||||
|
|
Загрузка…
Ссылка в новой задаче