.. | .. |
---|
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; |
---|