void handle_iscsi_events(int fd) { struct session *session; struct iet_event event; int res; retry: if ((res = nl_read(fd, &event, sizeof(event))) < 0) { if (errno == EAGAIN) return; if (errno == EINTR) goto retry; log_error("read netlink fd (%d)", errno); exit(1); } log_debug(1, "conn %u session %llu target %u, state %u", event.cid, event.sid, event.tid, event.state); switch (event.state) { case E_CONN_CLOSE: if (!(session = session_find_id(event.tid, event.sid))) { log_warning("session %llu not found?", event.sid); goto retry; } if (--session->conn_cnt <= 0) session_remove(session); break; default: log_error("%s(%d) %u\n", __FUNCTION__, __LINE__, event.state); exit(-1); break; } }
void async_event(char *data) { struct tgt_event *ev = (struct tgt_event *) data; struct iet_msg *msg = (struct iet_msg *) ev->data; struct session *session; eprintf("%u %u\n", msg->msg_type, msg->result); switch (msg->k.conn_state_change.state) { case E_CONN_CLOSE: if (!(session = session_find_id(msg->k.conn_state_change.tid, msg->k.conn_state_change.sid))) { eprintf("session %#" PRIx64 " not found?", msg->k.conn_state_change.sid); } if (!--session->conn_cnt) session_remove(session); break; default: eprintf("%u\n", msg->k.conn_state_change.state); break; } }