diff options
author | Miloslav Trmač <mitr@redhat.com> | 2010-08-25 02:56:52 +0200 |
---|---|---|
committer | Miloslav Trmač <mitr@redhat.com> | 2010-08-25 03:07:13 +0200 |
commit | daa80bfb63be6fcab80f2d7f526976b3000572f2 (patch) | |
tree | d0e7e3f03f11f6538b3fe5c944862c23e0a6b31e | |
parent | 6aca7d2bca9cab65aa5b84de3aa735667478c289 (diff) | |
download | cryptodev-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.c | 57 |
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); |