inst->alg.cra_module = tmpl->module;
        inst->alg.cra_flags |= CRYPTO_ALG_INSTANCE;
 
-       if (unlikely(!crypto_mod_get(&inst->alg)))
-               return -EAGAIN;
-
        down_write(&crypto_alg_sem);
 
        larval = __crypto_register_alg(&inst->alg);
                goto err;
 
        crypto_wait_for_test(larval);
-
-       /* Remove instance if test failed */
-       if (!(inst->alg.cra_flags & CRYPTO_ALG_TESTED))
-               crypto_unregister_instance(inst);
        err = 0;
 
 err:
-       crypto_mod_put(&inst->alg);
        return err;
 }
 EXPORT_SYMBOL_GPL(crypto_register_instance);
 
                                            u32 mask)
 {
        struct crypto_alg *alg;
+       u32 test = 0;
+
+       if (!((type | mask) & CRYPTO_ALG_TESTED))
+               test |= CRYPTO_ALG_TESTED;
 
        down_read(&crypto_alg_sem);
-       alg = __crypto_alg_lookup(name, type, mask);
+       alg = __crypto_alg_lookup(name, type | test, mask | test);
+       if (!alg && test)
+               alg = __crypto_alg_lookup(name, type, mask) ?
+                     ERR_PTR(-ELIBBAD) : NULL;
        up_read(&crypto_alg_sem);
 
        return alg;
                alg = crypto_alg_lookup(name, type, mask);
        }
 
-       if (alg)
-               return crypto_is_larval(alg) ? crypto_larval_wait(alg) : alg;
+       if (!IS_ERR_OR_NULL(alg) && crypto_is_larval(alg))
+               alg = crypto_larval_wait(alg);
+       else if (!alg)
+               alg = crypto_larval_add(name, type, mask);
 
-       return crypto_larval_add(name, type, mask);
+       return alg;
 }
 
 int crypto_probing_notify(unsigned long val, void *v)
        struct crypto_alg *larval;
        int ok;
 
-       if (!((type | mask) & CRYPTO_ALG_TESTED)) {
-               type |= CRYPTO_ALG_TESTED;
-               mask |= CRYPTO_ALG_TESTED;
-       }
-
        /*
         * If the internal flag is set for a cipher, require a caller to
         * to invoke the cipher with the internal flag to use that cipher.