summary refs log tree commit diff
path: root/crypto/pcrypt.c
diff options
context:
space:
mode:
authorDan Kruchinin <dkruchinin@acm.org>2010-07-14 14:34:15 +0400
committerHerbert Xu <herbert@gondor.apana.org.au>2010-07-19 13:50:20 +0800
commita3fb1e330dd21d96c2e07dda513ad7e9af8b6ccf (patch)
treec60e79c7039a0e91e20d13d5e28a64f9de92b59d /crypto/pcrypt.c
parent5e017dc3f8bc9e4a28983666e6bc00114a2018bb (diff)
downloadlinux-a3fb1e330dd21d96c2e07dda513ad7e9af8b6ccf.tar.gz
pcrypt: Added sysfs interface to pcrypt
Added sysfs interface to pcrypt. Now pcrypt subsystem creates two
sysfs directories with corresponding padata sysfs objects:
 /sys/kernel/pcrypt/[pencrypt|pdecrypt]

Signed-off-by: Dan Kruchinin <dkruchinin@acm.org>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'crypto/pcrypt.c')
-rw-r--r--crypto/pcrypt.c35
1 files changed, 32 insertions, 3 deletions
diff --git a/crypto/pcrypt.c b/crypto/pcrypt.c
index c9662e25595e..7153a50bce27 100644
--- a/crypto/pcrypt.c
+++ b/crypto/pcrypt.c
@@ -25,9 +25,11 @@
 #include <linux/module.h>
 #include <linux/slab.h>
 #include <linux/notifier.h>
+#include <linux/kobject.h>
 #include <crypto/pcrypt.h>
 
 struct pcrypt_instance {
+	const char *name;
 	struct padata_instance *pinst;
 	struct workqueue_struct *wq;
 
@@ -55,7 +57,7 @@ struct pcrypt_instance {
 
 static struct pcrypt_instance pencrypt;
 static struct pcrypt_instance pdecrypt;
-
+static struct kset           *pcrypt_kset;
 
 struct pcrypt_instance_ctx {
 	struct crypto_spawn spawn;
@@ -429,12 +431,25 @@ static int pcrypt_cpumask_change_notify(struct notifier_block *self,
 	return 0;
 }
 
+static int pcrypt_sysfs_add(struct padata_instance *pinst, const char *name)
+{
+	int ret;
+
+	pinst->kobj.kset = pcrypt_kset;
+	ret = kobject_add(&pinst->kobj, NULL, name);
+	if (!ret)
+		kobject_uevent(&pinst->kobj, KOBJ_ADD);
+
+	return ret;
+}
+
 static int __pcrypt_init_instance(struct pcrypt_instance *pcrypt,
 				  const char *name)
 {
 	int ret = -ENOMEM;
 	struct pcrypt_cpumask *mask;
 
+	pcrypt->name = name;
 	pcrypt->wq = create_workqueue(name);
 	if (!pcrypt->wq)
 		goto err;
@@ -459,7 +474,13 @@ static int __pcrypt_init_instance(struct pcrypt_instance *pcrypt,
 	if (ret)
 		goto err_free_cpumask;
 
+	ret = pcrypt_sysfs_add(pcrypt->pinst, name);
+	if (ret)
+		goto err_unregister_notifier;
+
 	return ret;
+err_unregister_notifier:
+	padata_unregister_cpumask_notifier(pcrypt->pinst, &pcrypt->nblock);
 err_free_cpumask:
 	free_cpumask_var(mask->mask);
 	kfree(mask);
@@ -473,6 +494,7 @@ err:
 
 static void __pcrypt_deinit_instance(struct pcrypt_instance *pcrypt)
 {
+	kobject_put(&pcrypt->pinst->kobj);
 	free_cpumask_var(pcrypt->cb_cpumask->mask);
 	kfree(pcrypt->cb_cpumask);
 
@@ -491,11 +513,15 @@ static struct crypto_template pcrypt_tmpl = {
 
 static int __init pcrypt_init(void)
 {
-	int err;
+	int err = -ENOMEM;
+
+	pcrypt_kset = kset_create_and_add("pcrypt", NULL, kernel_kobj);
+	if (!pcrypt_kset)
+		goto err;
 
 	err = __pcrypt_init_instance(&pencrypt, "pencrypt");
 	if (err)
-		goto err;
+		goto err_unreg_kset;
 
 	err = __pcrypt_init_instance(&pdecrypt, "pdecrypt");
 	if (err)
@@ -508,6 +534,8 @@ static int __init pcrypt_init(void)
 
 err_deinit_pencrypt:
 	__pcrypt_deinit_instance(&pencrypt);
+err_unreg_kset:
+	kset_unregister(pcrypt_kset);
 err:
 	return err;
 }
@@ -517,6 +545,7 @@ static void __exit pcrypt_exit(void)
 	__pcrypt_deinit_instance(&pencrypt);
 	__pcrypt_deinit_instance(&pdecrypt);
 
+	kset_unregister(pcrypt_kset);
 	crypto_unregister_template(&pcrypt_tmpl);
 }