struct iscsi_cls_conn * iscsi_tcp_conn_setup(struct iscsi_cls_session *cls_session, int dd_data_size, uint32_t conn_idx) { struct iscsi_conn *conn; struct iscsi_cls_conn *cls_conn; struct iscsi_tcp_conn *tcp_conn; cls_conn = iscsi_conn_setup(cls_session, sizeof(*tcp_conn), conn_idx); if (!cls_conn) return NULL; conn = cls_conn->dd_data; /* * due to strange issues with iser these are not set * in iscsi_conn_setup */ conn->max_recv_dlength = ISCSI_DEF_MAX_RECV_SEG_LEN; tcp_conn = conn->dd_data; tcp_conn->iscsi_conn = conn; tcp_conn->dd_data = kzalloc(dd_data_size, GFP_KERNEL); if (!tcp_conn->dd_data) { iscsi_conn_teardown(cls_conn); return NULL; } return cls_conn; }
void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn) { struct iscsi_conn *conn = cls_conn->dd_data; struct iscsi_tcp_conn *tcp_conn = conn->dd_data; kfree(tcp_conn->dd_data); iscsi_conn_teardown(cls_conn); }
static void iscsi_iser_conn_destroy(struct iscsi_cls_conn *cls_conn) { struct iscsi_conn *conn = cls_conn->dd_data; struct iscsi_iser_conn *iser_conn = conn->dd_data; struct iser_conn *ib_conn = iser_conn->ib_conn; iscsi_conn_teardown(cls_conn); if (ib_conn) { ib_conn->iser_conn = NULL; iser_conn_put(ib_conn); } }
static void iscsi_iser_conn_destroy(struct iscsi_cls_conn *cls_conn) { struct iscsi_conn *conn = cls_conn->dd_data; struct iser_conn *ib_conn = conn->dd_data; iscsi_conn_teardown(cls_conn); /* * Userspace will normally call the stop callback and * already have freed the ib_conn, but if it goofed up then * we free it here. */ if (ib_conn) { ib_conn->iscsi_conn = NULL; iser_conn_put(ib_conn, 1); /* deref iscsi/ib conn unbinding */ } }
void iscsi_tcp_conn_teardown(struct iscsi_cls_conn *cls_conn) { iscsi_conn_teardown(cls_conn); }