}
+static inline void sdp_kill_id_and_release(struct sdp_sock *ssk)
+{
+ struct sock *sk = &ssk->isk.sk;
+ struct rdma_cm_id *id;
+
+ lock_sock(sk);
+ id = ssk->id;
+ ssk->id = NULL;
+ release_sock(sk);
+
+ if (id)
+ rdma_destroy_id(id);
+ sdp_common_release(sk);
+}
+
static void sdp_destruct(struct sock *sk)
{
struct sdp_sock *ssk = sdp_sk(sk);
goto done;
list_for_each_entry_safe(s, t, &ssk->backlog_queue, backlog_queue) {
- sdp_common_release(&s->isk.sk);
+ sdp_kill_id_and_release(s);
}
list_for_each_entry_safe(s, t, &ssk->accept_queue, accept_queue) {
- sdp_common_release(&s->isk.sk);
+ sdp_kill_id_and_release(s);
}
done:
rdma_destroy_id(id);
list_for_each_entry_safe(s, t, &ssk->backlog_queue, backlog_queue) {
- sdp_common_release(&s->isk.sk);
+ sdp_kill_id_and_release(s);
}
list_for_each_entry_safe(s, t, &ssk->accept_queue, accept_queue) {
- sdp_common_release(&s->isk.sk);
+ sdp_kill_id_and_release(s);
}
lock_sock(sk);