* Unlink SA from SAH and SPI hash under SAHTREE_WLOCK. * Expect that SA has extra reference due to lookup. * Release this references, also release SAH reference after unlink. */
| 1362 | * Release this references, also release SAH reference after unlink. |
| 1363 | */ |
| 1364 | static void |
| 1365 | key_unlinksav(struct secasvar *sav) |
| 1366 | { |
| 1367 | struct secashead *sah; |
| 1368 | |
| 1369 | KEYDBG(KEY_STAMP, |
| 1370 | printf("%s: SA(%p)\n", __func__, sav)); |
| 1371 | |
| 1372 | SAHTREE_UNLOCK_ASSERT(); |
| 1373 | SAHTREE_WLOCK(); |
| 1374 | if (sav->state == SADB_SASTATE_DEAD) { |
| 1375 | /* SA is already unlinked */ |
| 1376 | SAHTREE_WUNLOCK(); |
| 1377 | return; |
| 1378 | } |
| 1379 | /* Unlink from SAH */ |
| 1380 | if (sav->state == SADB_SASTATE_LARVAL) |
| 1381 | TAILQ_REMOVE(&sav->sah->savtree_larval, sav, chain); |
| 1382 | else |
| 1383 | TAILQ_REMOVE(&sav->sah->savtree_alive, sav, chain); |
| 1384 | /* Unlink from SPI hash */ |
| 1385 | LIST_REMOVE(sav, spihash); |
| 1386 | sav->state = SADB_SASTATE_DEAD; |
| 1387 | sah = sav->sah; |
| 1388 | SAHTREE_WUNLOCK(); |
| 1389 | key_freesav(&sav); |
| 1390 | /* Since we are unlinked, release reference to SAH */ |
| 1391 | key_freesah(&sah); |
| 1392 | } |
| 1393 | |
| 1394 | /* %%% SPD management */ |
| 1395 | /* |
no test coverage detected