summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorMiloslav Trmač <mitr@redhat.com>2010-08-25 02:56:52 +0200
committerMiloslav Trmač <mitr@redhat.com>2010-08-25 03:07:13 +0200
commitdaa80bfb63be6fcab80f2d7f526976b3000572f2 (patch)
treed0e7e3f03f11f6538b3fe5c944862c23e0a6b31e
parent6aca7d2bca9cab65aa5b84de3aa735667478c289 (diff)
downloadcryptodev-linux-daa80bfb63be6fcab80f2d7f526976b3000572f2.tar.gz
cryptodev-linux-daa80bfb63be6fcab80f2d7f526976b3000572f2.tar.xz
cryptodev-linux-daa80bfb63be6fcab80f2d7f526976b3000572f2.zip
Move ID handling out of _ncr_session_init
-rw-r--r--ncr-sessions.c57
1 files changed, 35 insertions, 22 deletions
diff --git a/ncr-sessions.c b/ncr-sessions.c
index 1c12d82..ab4c997 100644
--- a/ncr-sessions.c
+++ b/ncr-sessions.c
@@ -293,25 +293,20 @@ static int key_item_get_nla_read(struct key_item_st **st,
return ret;
}
-static int _ncr_session_init(struct ncr_lists *lists, ncr_crypto_op_t op,
- struct nlattr *tb[])
+static struct session_item_st *_ncr_session_init(struct ncr_lists *lists,
+ ncr_session_t desc,
+ ncr_crypto_op_t op,
+ struct nlattr *tb[])
{
const struct nlattr *nla;
- ncr_session_t desc;
- struct session_item_st* ns = NULL;
+ struct session_item_st *ns;
int ret;
const struct algo_properties_st *sign_hash;
- desc = session_alloc_desc(lists);
- if (desc < 0) {
- err();
- return desc;
- }
ns = ncr_session_new(desc);
if (ns == NULL) {
err();
- session_drop_desc(lists, desc);
- return -ENOMEM;
+ return ERR_PTR(-ENOMEM);
}
ns->op = op;
@@ -490,23 +485,38 @@ static int _ncr_session_init(struct ncr_lists *lists, ncr_crypto_op_t op,
goto fail;
}
- session_publish(lists, ns);
- ret = ns->desc;
+ return ns;
fail:
- if (ret < 0) {
- session_drop_desc(lists, desc);
- }
_ncr_sessions_item_put(ns);
- return ret;
+ return ERR_PTR(ret);
}
int ncr_session_init(struct ncr_lists *lists,
const struct ncr_session_init *session,
struct nlattr *tb[])
{
- return _ncr_session_init(lists, session->op, tb);
+ ncr_session_t desc;
+ struct session_item_st *sess;
+
+ desc = session_alloc_desc(lists);
+ if (desc < 0) {
+ err();
+ return desc;
+ }
+
+ sess = _ncr_session_init(lists, desc, session->op, tb);
+ if (IS_ERR(sess)) {
+ err();
+ session_drop_desc(lists, desc);
+ return PTR_ERR(sess);
+ }
+
+ session_publish(lists, sess);
+ _ncr_sessions_item_put(sess);
+
+ return desc;
}
static int _ncr_session_encrypt(struct session_item_st* sess, const struct scatterlist* input, unsigned input_cnt,
@@ -1088,18 +1098,21 @@ int ncr_session_once(struct ncr_lists *lists,
struct session_item_st *sess;
int ret, desc;
- desc = _ncr_session_init(lists, once->op, tb);
+ desc = session_alloc_desc(lists);
if (desc < 0) {
err();
return desc;
}
- sess = ncr_sessions_item_get(lists, desc);
- if (sess == NULL) {
+ sess = _ncr_session_init(lists, desc, once->op, tb);
+ if (IS_ERR(sess)) {
err();
- return -EINVAL;
+ session_drop_desc(lists, desc);
+ return PTR_ERR(sess);
}
+ session_publish(lists, sess);
+
if (mutex_lock_interruptible(&sess->mem_mutex)) {
err();
_ncr_sessions_item_put(sess);