dasd: refactor dasd_ioctl_information
authorChristoph Hellwig <hch@lst.de>
Tue, 19 May 2020 14:22:58 +0000 (16:22 +0200)
committerJens Axboe <axboe@kernel.dk>
Thu, 21 May 2020 14:22:20 +0000 (08:22 -0600)
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>
drivers/s390/block/dasd_ioctl.c

index 9a5f3add325fcb7bb85370562846a1c5ce9dfae7..9b7782395c379114aa80b18eceb4ee6d9061ab43 100644 (file)
@@ -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);