Module Name:    src
Committed By:   knakahara
Date:           Wed May 10 03:23:26 UTC 2017

Modified Files:
        src/sys/opencrypto: crypto.c

Log Message:
refactor crypto_unregister()

    - separate logic to crypto_unregister_locked()
    - refactor cryptocap cleanup condition


To generate a diff of this commit:
cvs rdiff -u -r1.60 -r1.61 src/sys/opencrypto/crypto.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/opencrypto/crypto.c
diff -u src/sys/opencrypto/crypto.c:1.60 src/sys/opencrypto/crypto.c:1.61
--- src/sys/opencrypto/crypto.c:1.60	Wed May 10 03:15:32 2017
+++ src/sys/opencrypto/crypto.c	Wed May 10 03:23:26 2017
@@ -1,4 +1,4 @@
-/*	$NetBSD: crypto.c,v 1.60 2017/05/10 03:15:32 knakahara Exp $ */
+/*	$NetBSD: crypto.c,v 1.61 2017/05/10 03:23:26 knakahara Exp $ */
 /*	$FreeBSD: src/sys/opencrypto/crypto.c,v 1.4.2.5 2003/02/26 00:14:05 sam Exp $	*/
 /*	$OpenBSD: crypto.c,v 1.41 2002/07/17 23:52:38 art Exp $	*/
 
@@ -53,7 +53,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.60 2017/05/10 03:15:32 knakahara Exp $");
+__KERNEL_RCSID(0, "$NetBSD: crypto.c,v 1.61 2017/05/10 03:23:26 knakahara Exp $");
 
 #include <sys/param.h>
 #include <sys/reboot.h>
@@ -612,6 +612,48 @@ crypto_register(u_int32_t driverid, int 
 	return err;
 }
 
+static int
+crypto_unregister_locked(u_int32_t driverid, int alg)
+{
+	int i;
+	u_int32_t ses;
+	struct cryptocap *cap;
+	bool lastalg = true;
+
+	KASSERT(mutex_owned(&crypto_drv_mtx));
+
+	if (CRYPTO_ALGORITHM_MIN <= alg && alg <= CRYPTO_ALGORITHM_MAX)
+		return EINVAL;
+
+	cap = crypto_checkdriver(driverid);
+	if (cap == NULL || cap->cc_alg[alg] == 0)
+		return EINVAL;
+
+	cap->cc_alg[alg] = 0;
+	cap->cc_max_op_len[alg] = 0;
+
+	/* Was this the last algorithm ? */
+	for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++)
+		if (cap->cc_alg[i] != 0) {
+			lastalg = false;
+			break;
+		}
+
+	if (lastalg) {
+		ses = cap->cc_sessions;
+		memset(cap, 0, sizeof(struct cryptocap));
+		if (ses != 0) {
+			/*
+			 * If there are pending sessions, just mark as invalid.
+			 */
+			cap->cc_flags |= CRYPTOCAP_F_CLEANUP;
+			cap->cc_sessions = ses;
+		}
+	}
+
+	return 0;
+}
+
 /*
  * Unregister a crypto driver. If there are pending sessions using it,
  * leave enough information around so that subsequent calls using those
@@ -621,40 +663,12 @@ crypto_register(u_int32_t driverid, int 
 int
 crypto_unregister(u_int32_t driverid, int alg)
 {
-	int i, err;
-	u_int32_t ses;
-	struct cryptocap *cap;
+	int err;
 
 	mutex_enter(&crypto_drv_mtx);
-
-	cap = crypto_checkdriver(driverid);
-	if (cap != NULL &&
-	    (CRYPTO_ALGORITHM_MIN <= alg && alg <= CRYPTO_ALGORITHM_MAX) &&
-	    cap->cc_alg[alg] != 0) {
-		cap->cc_alg[alg] = 0;
-		cap->cc_max_op_len[alg] = 0;
-
-		/* Was this the last algorithm ? */
-		for (i = CRYPTO_ALGORITHM_MIN; i <= CRYPTO_ALGORITHM_MAX; i++)
-			if (cap->cc_alg[i] != 0)
-				break;
-
-		if (i == CRYPTO_ALGORITHM_MAX + 1) {
-			ses = cap->cc_sessions;
-			memset(cap, 0, sizeof(struct cryptocap));
-			if (ses != 0) {
-				/*
-				 * If there are pending sessions, just mark as invalid.
-				 */
-				cap->cc_flags |= CRYPTOCAP_F_CLEANUP;
-				cap->cc_sessions = ses;
-			}
-		}
-		err = 0;
-	} else
-		err = EINVAL;
-
+	err = crypto_unregister_locked(driverid, alg);
 	mutex_exit(&crypto_drv_mtx);
+
 	return err;
 }
 

Reply via email to