zcrypt: fix possible race when unloading zcrypt driver modules
Subsystems (2)
From: Ralph Wuerthner <[email protected]>
[S390] zcrypt: fix possible race when unloading zcrypt driver modules
Move try_module_get() call into spin protected block to prevent zcrypt driver module unload while submitting a request to driver.
Signed-off-by Ralph Wuerthner <[email protected]>
Signed-off-by Martin Schwidefsky <[email protected]>
---
drivers/s390/crypto/zcrypt_api.c | 12 ++++++------ 1 files changed, 6 insertions(+), 6 deletions(-)
drivers/s390/crypto/zcrypt_api.c +6 -6
@@ -298,14 +298,14 @@ static long zcrypt_rsa_modexpo(struct icget_device (&zdev->ap_dev->device); zdev->request_count++;__zcrypt_decrease_preference (zdev); -spin_unlock_bh (&zcrypt_device_lock);if (try_module_get (zdev->ap_dev->drv->driver.owner)) { +spin_unlock_bh (&zcrypt_device_lock); rc = zdev->ops->rsa_modexpo (zdev, mex); +spin_lock_bh (&zcrypt_device_lock);module_put (zdev->ap_dev->drv->driver.owner); }else rc = -EAGAIN ; -spin_lock_bh (&zcrypt_device_lock); zdev->request_count--;__zcrypt_increase_preference (zdev);put_device (&zdev->ap_dev->device);
@@ -373,14 +373,14 @@ static long zcrypt_rsa_crt(struct ica_rsget_device (&zdev->ap_dev->device); zdev->request_count++;__zcrypt_decrease_preference (zdev); -spin_unlock_bh (&zcrypt_device_lock);if (try_module_get (zdev->ap_dev->drv->driver.owner)) { +spin_unlock_bh (&zcrypt_device_lock); rc = zdev->ops->rsa_modexpo_crt (zdev, crt); +spin_lock_bh (&zcrypt_device_lock);module_put (zdev->ap_dev->drv->driver.owner); }else rc = -EAGAIN ; -spin_lock_bh (&zcrypt_device_lock); zdev->request_count--;__zcrypt_increase_preference (zdev);put_device (&zdev->ap_dev->device);
@@ -408,14 +408,14 @@ static long zcrypt_send_cprb(struct ica_get_device (&zdev->ap_dev->device); zdev->request_count++;__zcrypt_decrease_preference (zdev); -spin_unlock_bh (&zcrypt_device_lock);if (try_module_get (zdev->ap_dev->drv->driver.owner)) { +spin_unlock_bh (&zcrypt_device_lock); rc = zdev->ops->send_cprb (zdev, xcRB); +spin_lock_bh (&zcrypt_device_lock);module_put (zdev->ap_dev->drv->driver.owner); }else rc = -EAGAIN ; -spin_lock_bh (&zcrypt_device_lock); zdev->request_count--;__zcrypt_increase_preference (zdev);put_device (&zdev->ap_dev->device);