|
@@ -693,6 +693,19 @@ int iscsi_session_chkready(struct iscsi_cls_session *session)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(iscsi_session_chkready);
|
|
|
|
|
|
+int iscsi_is_session_online(struct iscsi_cls_session *session)
|
|
|
+{
|
|
|
+ unsigned long flags;
|
|
|
+ int ret = 0;
|
|
|
+
|
|
|
+ spin_lock_irqsave(&session->lock, flags);
|
|
|
+ if (session->state == ISCSI_SESSION_LOGGED_IN)
|
|
|
+ ret = 1;
|
|
|
+ spin_unlock_irqrestore(&session->lock, flags);
|
|
|
+ return ret;
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(iscsi_is_session_online);
|
|
|
+
|
|
|
static void iscsi_session_release(struct device *dev)
|
|
|
{
|
|
|
struct iscsi_cls_session *session = iscsi_dev_to_session(dev);
|
|
@@ -1433,6 +1446,40 @@ void iscsi_conn_error_event(struct iscsi_cls_conn *conn, enum iscsi_err error)
|
|
|
}
|
|
|
EXPORT_SYMBOL_GPL(iscsi_conn_error_event);
|
|
|
|
|
|
+void iscsi_conn_login_event(struct iscsi_cls_conn *conn,
|
|
|
+ enum iscsi_conn_state state)
|
|
|
+{
|
|
|
+ struct nlmsghdr *nlh;
|
|
|
+ struct sk_buff *skb;
|
|
|
+ struct iscsi_uevent *ev;
|
|
|
+ struct iscsi_internal *priv;
|
|
|
+ int len = NLMSG_SPACE(sizeof(*ev));
|
|
|
+
|
|
|
+ priv = iscsi_if_transport_lookup(conn->transport);
|
|
|
+ if (!priv)
|
|
|
+ return;
|
|
|
+
|
|
|
+ skb = alloc_skb(len, GFP_ATOMIC);
|
|
|
+ if (!skb) {
|
|
|
+ iscsi_cls_conn_printk(KERN_ERR, conn, "gracefully ignored "
|
|
|
+ "conn login (%d)\n", state);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
+ nlh = __nlmsg_put(skb, 0, 0, 0, (len - sizeof(*nlh)), 0);
|
|
|
+ ev = NLMSG_DATA(nlh);
|
|
|
+ ev->transport_handle = iscsi_handle(conn->transport);
|
|
|
+ ev->type = ISCSI_KEVENT_CONN_LOGIN_STATE;
|
|
|
+ ev->r.conn_login.state = state;
|
|
|
+ ev->r.conn_login.cid = conn->cid;
|
|
|
+ ev->r.conn_login.sid = iscsi_conn_get_sid(conn);
|
|
|
+ iscsi_multicast_skb(skb, ISCSI_NL_GRP_ISCSID, GFP_ATOMIC);
|
|
|
+
|
|
|
+ iscsi_cls_conn_printk(KERN_INFO, conn, "detected conn login (%d)\n",
|
|
|
+ state);
|
|
|
+}
|
|
|
+EXPORT_SYMBOL_GPL(iscsi_conn_login_event);
|
|
|
+
|
|
|
static int
|
|
|
iscsi_if_send_reply(uint32_t group, int seq, int type, int done, int multi,
|
|
|
void *payload, int size)
|