]> git.proxmox.com Git - mirror_ubuntu-jammy-kernel.git/commitdiff
s390/zcrypt: split ioctl function into smaller code units
authorHarald Freudenberger <freude@linux.ibm.com>
Wed, 20 May 2020 14:07:19 +0000 (16:07 +0200)
committerHeiko Carstens <heiko.carstens@de.ibm.com>
Fri, 3 Jul 2020 08:49:39 +0000 (10:49 +0200)
The zcrpyt_unlocked_ioctl() function has become large. So split away
into new static functions the 4 ioctl ICARSAMODEXPO, ICARSACRT,
ZSECSENDCPRB and ZSENDEP11CPRB. This makes the code more readable and
is a preparation step for further improvements needed on these ioctls.

Signed-off-by: Harald Freudenberger <freude@linux.ibm.com>
Signed-off-by: Heiko Carstens <heiko.carstens@de.ibm.com>
drivers/s390/crypto/zcrypt_api.c

index 7775ff84f22382eee2248f18007b2f15c2ff2565..4dbbfd88262cde0fbf71eaf6655103519368faed 100644 (file)
@@ -1298,99 +1298,119 @@ static int zcrypt_requestq_count(void)
        return requestq_count;
 }
 
-static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
-                                 unsigned long arg)
+static int icarsamodexpo_ioctl(struct ap_perms *perms, unsigned long arg)
 {
        int rc;
-       struct ap_perms *perms =
-               (struct ap_perms *) filp->private_data;
+       struct ica_rsa_modexpo mex;
+       struct ica_rsa_modexpo __user *umex = (void __user *) arg;
 
-       rc = zcrypt_check_ioctl(perms, cmd);
-       if (rc)
-               return rc;
-
-       switch (cmd) {
-       case ICARSAMODEXPO: {
-               struct ica_rsa_modexpo __user *umex = (void __user *) arg;
-               struct ica_rsa_modexpo mex;
-
-               if (copy_from_user(&mex, umex, sizeof(mex)))
-                       return -EFAULT;
+       if (copy_from_user(&mex, umex, sizeof(mex)))
+               return -EFAULT;
+       do {
+               rc = zcrypt_rsa_modexpo(perms, &mex);
+       } while (rc == -EAGAIN);
+       /* on failure: retry once again after a requested rescan */
+       if ((rc == -ENODEV) && (zcrypt_process_rescan()))
                do {
                        rc = zcrypt_rsa_modexpo(perms, &mex);
                } while (rc == -EAGAIN);
-               /* on failure: retry once again after a requested rescan */
-               if ((rc == -ENODEV) && (zcrypt_process_rescan()))
-                       do {
-                               rc = zcrypt_rsa_modexpo(perms, &mex);
-                       } while (rc == -EAGAIN);
-               if (rc) {
-                       ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSAMODEXPO rc=%d\n", rc);
-                       return rc;
-               }
-               return put_user(mex.outputdatalength, &umex->outputdatalength);
+       if (rc) {
+               ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSAMODEXPO rc=%d\n", rc);
+               return rc;
        }
-       case ICARSACRT: {
-               struct ica_rsa_modexpo_crt __user *ucrt = (void __user *) arg;
-               struct ica_rsa_modexpo_crt crt;
+       return put_user(mex.outputdatalength, &umex->outputdatalength);
+}
 
-               if (copy_from_user(&crt, ucrt, sizeof(crt)))
-                       return -EFAULT;
+static int icarsacrt_ioctl(struct ap_perms *perms, unsigned long arg)
+{
+       int rc;
+       struct ica_rsa_modexpo_crt crt;
+       struct ica_rsa_modexpo_crt __user *ucrt = (void __user *) arg;
+
+       if (copy_from_user(&crt, ucrt, sizeof(crt)))
+               return -EFAULT;
+       do {
+               rc = zcrypt_rsa_crt(perms, &crt);
+       } while (rc == -EAGAIN);
+       /* on failure: retry once again after a requested rescan */
+       if ((rc == -ENODEV) && (zcrypt_process_rescan()))
                do {
                        rc = zcrypt_rsa_crt(perms, &crt);
                } while (rc == -EAGAIN);
-               /* on failure: retry once again after a requested rescan */
-               if ((rc == -ENODEV) && (zcrypt_process_rescan()))
-                       do {
-                               rc = zcrypt_rsa_crt(perms, &crt);
-                       } while (rc == -EAGAIN);
-               if (rc) {
-                       ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSACRT rc=%d\n", rc);
-                       return rc;
-               }
-               return put_user(crt.outputdatalength, &ucrt->outputdatalength);
+       if (rc) {
+               ZCRYPT_DBF(DBF_DEBUG, "ioctl ICARSACRT rc=%d\n", rc);
+               return rc;
        }
-       case ZSECSENDCPRB: {
-               struct ica_xcRB __user *uxcRB = (void __user *) arg;
-               struct ica_xcRB xcRB;
+       return put_user(crt.outputdatalength, &ucrt->outputdatalength);
+}
 
-               if (copy_from_user(&xcRB, uxcRB, sizeof(xcRB)))
-                       return -EFAULT;
+static int zsecsendcprb_ioctl(struct ap_perms *perms, unsigned long arg)
+{
+       int rc;
+       struct ica_xcRB xcRB;
+       struct ica_xcRB __user *uxcRB = (void __user *) arg;
+
+       if (copy_from_user(&xcRB, uxcRB, sizeof(xcRB)))
+               return -EFAULT;
+       do {
+               rc = _zcrypt_send_cprb(perms, &xcRB);
+       } while (rc == -EAGAIN);
+       /* on failure: retry once again after a requested rescan */
+       if ((rc == -ENODEV) && (zcrypt_process_rescan()))
                do {
                        rc = _zcrypt_send_cprb(perms, &xcRB);
                } while (rc == -EAGAIN);
-               /* on failure: retry once again after a requested rescan */
-               if ((rc == -ENODEV) && (zcrypt_process_rescan()))
-                       do {
-                               rc = _zcrypt_send_cprb(perms, &xcRB);
-                       } while (rc == -EAGAIN);
-               if (rc)
-                       ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDCPRB rc=%d status=0x%x\n",
-                                  rc, xcRB.status);
-               if (copy_to_user(uxcRB, &xcRB, sizeof(xcRB)))
-                       return -EFAULT;
-               return rc;
-       }
-       case ZSENDEP11CPRB: {
-               struct ep11_urb __user *uxcrb = (void __user *)arg;
-               struct ep11_urb xcrb;
+       if (rc)
+               ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDCPRB rc=%d status=0x%x\n",
+                          rc, xcRB.status);
+       if (copy_to_user(uxcRB, &xcRB, sizeof(xcRB)))
+               return -EFAULT;
+       return rc;
+}
 
-               if (copy_from_user(&xcrb, uxcrb, sizeof(xcrb)))
-                       return -EFAULT;
+static int zsendep11cprb_ioctl(struct ap_perms *perms, unsigned long arg)
+{
+       int rc;
+       struct ep11_urb xcrb;
+       struct ep11_urb __user *uxcrb = (void __user *)arg;
+
+       if (copy_from_user(&xcrb, uxcrb, sizeof(xcrb)))
+               return -EFAULT;
+       do {
+               rc = _zcrypt_send_ep11_cprb(perms, &xcrb);
+       } while (rc == -EAGAIN);
+       /* on failure: retry once again after a requested rescan */
+       if ((rc == -ENODEV) && (zcrypt_process_rescan()))
                do {
                        rc = _zcrypt_send_ep11_cprb(perms, &xcrb);
                } while (rc == -EAGAIN);
-               /* on failure: retry once again after a requested rescan */
-               if ((rc == -ENODEV) && (zcrypt_process_rescan()))
-                       do {
-                               rc = _zcrypt_send_ep11_cprb(perms, &xcrb);
-                       } while (rc == -EAGAIN);
-               if (rc)
-                       ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDEP11CPRB rc=%d\n", rc);
-               if (copy_to_user(uxcrb, &xcrb, sizeof(xcrb)))
-                       return -EFAULT;
+       if (rc)
+               ZCRYPT_DBF(DBF_DEBUG, "ioctl ZSENDEP11CPRB rc=%d\n", rc);
+       if (copy_to_user(uxcrb, &xcrb, sizeof(xcrb)))
+               return -EFAULT;
+       return rc;
+}
+
+static long zcrypt_unlocked_ioctl(struct file *filp, unsigned int cmd,
+                                 unsigned long arg)
+{
+       int rc;
+       struct ap_perms *perms =
+               (struct ap_perms *) filp->private_data;
+
+       rc = zcrypt_check_ioctl(perms, cmd);
+       if (rc)
                return rc;
-       }
+
+       switch (cmd) {
+       case ICARSAMODEXPO:
+               return icarsamodexpo_ioctl(perms, arg);
+       case ICARSACRT:
+               return icarsacrt_ioctl(perms, arg);
+       case ZSECSENDCPRB:
+               return zsecsendcprb_ioctl(perms, arg);
+       case ZSENDEP11CPRB:
+               return zsendep11cprb_ioctl(perms, arg);
        case ZCRYPT_DEVICE_STATUS: {
                struct zcrypt_device_status_ext *device_status;
                size_t total_size = MAX_ZDEV_ENTRIES_EXT