OSDN Git Service

Crypto/chcr: Checking cra_refcnt before unregistering the algorithms
authorAyush Sawal <ayush.sawal@chelsio.com>
Tue, 9 Jun 2020 21:24:32 +0000 (02:54 +0530)
committerDavid S. Miller <davem@davemloft.net>
Thu, 11 Jun 2020 00:05:02 +0000 (17:05 -0700)
This patch puts a check for algorithm unregister, to avoid removal of
driver if the algorithm is under use.

Signed-off-by: Ayush Sawal <ayush.sawal@chelsio.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/crypto/chelsio/chcr_algo.c

index f8b5513..4c25536 100644 (file)
@@ -4391,22 +4391,32 @@ static int chcr_unregister_alg(void)
        for (i = 0; i < ARRAY_SIZE(driver_algs); i++) {
                switch (driver_algs[i].type & CRYPTO_ALG_TYPE_MASK) {
                case CRYPTO_ALG_TYPE_SKCIPHER:
-                       if (driver_algs[i].is_registered)
+                       if (driver_algs[i].is_registered && refcount_read(
+                           &driver_algs[i].alg.skcipher.base.cra_refcnt)
+                           == 1) {
                                crypto_unregister_skcipher(
                                                &driver_algs[i].alg.skcipher);
+                               driver_algs[i].is_registered = 0;
+                       }
                        break;
                case CRYPTO_ALG_TYPE_AEAD:
-                       if (driver_algs[i].is_registered)
+                       if (driver_algs[i].is_registered && refcount_read(
+                           &driver_algs[i].alg.aead.base.cra_refcnt) == 1) {
                                crypto_unregister_aead(
                                                &driver_algs[i].alg.aead);
+                               driver_algs[i].is_registered = 0;
+                       }
                        break;
                case CRYPTO_ALG_TYPE_AHASH:
-                       if (driver_algs[i].is_registered)
+                       if (driver_algs[i].is_registered && refcount_read(
+                           &driver_algs[i].alg.hash.halg.base.cra_refcnt)
+                           == 1) {
                                crypto_unregister_ahash(
                                                &driver_algs[i].alg.hash);
+                               driver_algs[i].is_registered = 0;
+                       }
                        break;
                }
-               driver_algs[i].is_registered = 0;
        }
        return 0;
 }