1 Star 0 Fork 28

zero/open-iscsi

forked from src-openEuler/open-iscsi 
加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
0002-iscsid-Check-nr_sessions-when-creating-a-copy-of-exi.patch 3.09 KB
一键复制 编辑 原始数据 按行查看 历史
wj196 提交于 2020-07-15 16:05 . rename patches and add changelog
From 47849daf73c1978491c05e9619063ff8a529ca48 Mon Sep 17 00:00:00 2001
From: Tang Chen <tang.chen@huawei.com>
Date: Thu, 12 Oct 2017 04:56:16 +0800
Subject: [PATCH 1/1] iscsid: Check nr_sessions when creating a copy of
existing session
For multipath configurations, you may want more than one session to be
created on each iface record. If node.session.nr_sessions is greater
than 1, performing a 'login' for that node will ensure that the
appropriate number of sessions is created.
node.session.nr_sessions = 1
In iscsiadm command, we set session.multiple to 1, which means we can
create multiple copies of an existing session.
iscsi_login_portal()
|--> rec->session.multiple = 1
But in iscsid, we didn't check nr_sessions when executing login task.
__session_login_task()
|--> session_is_running()
|--> iscsi_sysfs_for_each_session()
|--> if (rec->session.multiple)
log_debug(2, "Adding a copy of an existing session");
So this patch adds a checking to iscsid login task.
Signed-off-by: Tang Chen <tang.chen@huawei.com>
---
usr/initiator.c | 31 ++++++++++++++++++-------------
1 files changed, 18 insertions(+), 13 deletions(-)
diff --git a/usr/initiator.c b/usr/initiator.c
index a86d1e6..9248962 100644
--- a/usr/initiator.c
+++ b/usr/initiator.c
@@ -1754,10 +1754,11 @@ static int iscsi_sched_ev_context(struct iscsi_ev_context *ev_context,
return 0;
}
-static iscsi_session_t* session_find_by_rec(node_rec_t *rec)
+static int session_find_by_rec(node_rec_t *rec)
{
struct iscsi_transport *t;
iscsi_session_t *session;
+ int nr_found = 0;
list_for_each_entry(t, &transports, list) {
list_for_each_entry(session, &t->sessions, list) {
@@ -1766,24 +1767,23 @@ static iscsi_session_t* session_find_by_rec(node_rec_t *rec)
session->nrec.conn[0].port,
&session->nrec.iface,
MATCH_ANY_SID))
- return session;
+ nr_found++;
}
}
- return NULL;
+ return nr_found;
}
/*
* a session could be running in the kernel but not in iscsid
* due to a resync or because some other app started the session
*/
-static int session_is_running(node_rec_t *rec)
+static int session_is_running(node_rec_t *rec, int *nr_found)
{
- int nr_found = 0;
-
- if (session_find_by_rec(rec))
+ *nr_found = session_find_by_rec(rec);
+ if (*nr_found)
return 1;
- if (iscsi_sysfs_for_each_session(rec, &nr_found, iscsi_match_session,
+ if (iscsi_sysfs_for_each_session(rec, nr_found, iscsi_match_session,
0))
return 1;
@@ -1795,12 +1795,17 @@ static int __session_login_task(node_rec_t *rec, queue_task_t *qtask)
iscsi_session_t *session;
iscsi_conn_t *conn;
struct iscsi_transport *t;
- int rc;
-
- if (session_is_running(rec)) {
- if (rec->session.multiple)
+ int rc, nr_found = 0;
+
+ if (session_is_running(rec, &nr_found)) {
+ if (rec->session.multiple) {
+ if (nr_found >= rec->session.nr_sessions) {
+ log_debug(2, "Cannot add more copy of session,"
+ " %d found.\n", nr_found);
+ return ISCSI_ERR_SESS_EXISTS;
+ }
log_debug(2, "Adding a copy of an existing session");
- else
+ } else
return ISCSI_ERR_SESS_EXISTS;
}
--
1.8.3.1
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/wubo009/open-iscsi.git
git@gitee.com:wubo009/open-iscsi.git
wubo009
open-iscsi
open-iscsi
master

搜索帮助