| .. | .. |
|---|
| 267 | 267 | goto out; |
|---|
| 268 | 268 | } |
|---|
| 269 | 269 | |
|---|
| 270 | + /* Open session with loaded TA */ |
|---|
| 271 | + handle_open_session(arg, &session_info, param); |
|---|
| 272 | + if (arg->ret != TEEC_SUCCESS) { |
|---|
| 273 | + pr_err("open_session failed %d\n", arg->ret); |
|---|
| 274 | + handle_unload_ta(ta_handle); |
|---|
| 275 | + kref_put(&sess->refcount, destroy_session); |
|---|
| 276 | + goto out; |
|---|
| 277 | + } |
|---|
| 278 | + |
|---|
| 270 | 279 | /* Find an empty session index for the given TA */ |
|---|
| 271 | 280 | spin_lock(&sess->lock); |
|---|
| 272 | 281 | i = find_first_zero_bit(sess->sess_mask, TEE_NUM_SESSIONS); |
|---|
| 273 | | - if (i < TEE_NUM_SESSIONS) |
|---|
| 282 | + if (i < TEE_NUM_SESSIONS) { |
|---|
| 283 | + sess->session_info[i] = session_info; |
|---|
| 284 | + set_session_id(ta_handle, i, &arg->session); |
|---|
| 274 | 285 | set_bit(i, sess->sess_mask); |
|---|
| 286 | + } |
|---|
| 275 | 287 | spin_unlock(&sess->lock); |
|---|
| 276 | 288 | |
|---|
| 277 | 289 | if (i >= TEE_NUM_SESSIONS) { |
|---|
| 278 | 290 | pr_err("reached maximum session count %d\n", TEE_NUM_SESSIONS); |
|---|
| 291 | + handle_close_session(ta_handle, session_info); |
|---|
| 279 | 292 | handle_unload_ta(ta_handle); |
|---|
| 280 | 293 | kref_put(&sess->refcount, destroy_session); |
|---|
| 281 | 294 | rc = -ENOMEM; |
|---|
| 282 | 295 | goto out; |
|---|
| 283 | 296 | } |
|---|
| 284 | 297 | |
|---|
| 285 | | - /* Open session with loaded TA */ |
|---|
| 286 | | - handle_open_session(arg, &session_info, param); |
|---|
| 287 | | - if (arg->ret != TEEC_SUCCESS) { |
|---|
| 288 | | - pr_err("open_session failed %d\n", arg->ret); |
|---|
| 289 | | - spin_lock(&sess->lock); |
|---|
| 290 | | - clear_bit(i, sess->sess_mask); |
|---|
| 291 | | - spin_unlock(&sess->lock); |
|---|
| 292 | | - handle_unload_ta(ta_handle); |
|---|
| 293 | | - kref_put(&sess->refcount, destroy_session); |
|---|
| 294 | | - goto out; |
|---|
| 295 | | - } |
|---|
| 296 | | - |
|---|
| 297 | | - sess->session_info[i] = session_info; |
|---|
| 298 | | - set_session_id(ta_handle, i, &arg->session); |
|---|
| 299 | 298 | out: |
|---|
| 300 | 299 | free_pages((u64)ta, get_order(ta_size)); |
|---|
| 301 | 300 | return rc; |
|---|