[stgt] help tgt segfault
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Fri Dec 19 15:16:45 CET 2008
On Wed, 17 Dec 2008 18:51:41 +0100
Tomasz Chmielewski <mangoo at wpkg.org> wrote:
> FUJITA Tomonori schrieb:
>
> > Can you try one more time with this patch (including the previous
> > patch so please do git-reset --hard first).
>
> Here you are:
>
> Dec 17 18:46:27 megathecus tgtd: Target daemon logger with pid=21048 started!
Thanks a lot! This is very useful.
Can you try this again? Even if tgtd doesn't crash, please send the
log.
Thanks,
diff --git a/usr/iscsi/conn.c b/usr/iscsi/conn.c
index c205397..be22f75 100644
--- a/usr/iscsi/conn.c
+++ b/usr/iscsi/conn.c
@@ -82,15 +82,26 @@ void conn_exit(struct iscsi_connection *conn)
void conn_close(struct iscsi_connection *conn)
{
struct iscsi_task *task, *tmp;
+ int ret;
- conn->tp->ep_close(conn);
+ if (conn->closed) {
+ eprintf("connection already closed %p %u\n", conn, conn->refcount);
+ return;
+ }
+
+ conn->closed = 1;
- eprintf("connection closed %p %u\n", conn, conn->refcount);
+ ret = conn->tp->ep_close(conn);
+
+ eprintf("connection closed %p %u %d %d\n",
+ conn, conn->refcount, ret, errno);
/* may not have been in FFP yet */
if (!conn->session)
goto done;
+ eprintf("sesson %p %d\n", conn->session, conn->session->refcount);
+
/*
* We just closed the ep so we are not going to send/recv anything.
* Just free these up since they are not going to complete.
diff --git a/usr/iscsi/iscsi_tcp.c b/usr/iscsi/iscsi_tcp.c
index 2320b3e..e7bd48d 100644
--- a/usr/iscsi/iscsi_tcp.c
+++ b/usr/iscsi/iscsi_tcp.c
@@ -164,8 +164,8 @@ static void iscsi_tcp_event_handler(int fd, int events, void *data)
iscsi_tx_handler(conn);
if (conn->state == STATE_CLOSE) {
+ eprintf("connection closed %p\n", conn);
conn_close(conn);
- dprintf("connection closed\n");
}
}
@@ -300,6 +300,8 @@ static void iscsi_tcp_release(struct iscsi_connection *conn)
{
struct iscsi_tcp_connection *tcp_conn = TCP_CONN(conn);
+ eprintf("free connection %p\n", conn);
+
conn_exit(conn);
free(tcp_conn);
}
diff --git a/usr/iscsi/iscsid.c b/usr/iscsi/iscsid.c
index c22a6f6..2bab387 100644
--- a/usr/iscsi/iscsid.c
+++ b/usr/iscsi/iscsid.c
@@ -240,9 +240,11 @@ static void login_security_done(struct iscsi_connection *conn)
struct iscsi_connection *ent, *next;
/* do session reinstatement */
+ eprintf("session reinstatement, %p\n", session);
list_for_each_entry_safe(ent, next, &session->conn_list,
clist) {
+ eprintf("reinstatement close, %p %u\n", ent, ent->state);
conn_close(ent);
}
@@ -1085,6 +1087,8 @@ static int iscsi_scsi_cmd_done(uint64_t nid, int result, struct scsi_cmd *scmd)
* task got reassinged to another connection.
*/
if (task->conn->state == STATE_CLOSE) {
+ eprintf("connection already closed %p %u\n",
+ task->conn, task->conn->refcount);
iscsi_free_cmd_task(task);
return 0;
}
diff --git a/usr/iscsi/iscsid.h b/usr/iscsi/iscsid.h
index c03263a..4a8deb9 100644
--- a/usr/iscsi/iscsid.h
+++ b/usr/iscsi/iscsid.h
@@ -130,6 +130,10 @@ struct iscsi_task {
struct iscsi_connection {
int state;
+
+ /* should be a new state */
+ int closed;
+
int rx_iostate;
int tx_iostate;
int refcount;
diff --git a/usr/iscsi/session.c b/usr/iscsi/session.c
index 028d538..935053c 100644
--- a/usr/iscsi/session.c
+++ b/usr/iscsi/session.c
@@ -158,6 +158,8 @@ static void session_destroy(struct iscsi_session *session)
list_del(&session->hlist);
+ eprintf("free sesson %p\n", session);
+
free(session->initiator);
free(session->info);
free(session);
diff --git a/usr/tgtd.c b/usr/tgtd.c
index 758e7d5..f29dab1 100644
--- a/usr/tgtd.c
+++ b/usr/tgtd.c
@@ -137,6 +137,7 @@ static struct event_data *tgt_event_lookup(int fd)
void tgt_event_del(int fd)
{
struct event_data *tev;
+ int ret;
tev = tgt_event_lookup(fd);
if (!tev) {
@@ -144,7 +145,10 @@ void tgt_event_del(int fd)
return;
}
- epoll_ctl(ep_fd, EPOLL_CTL_DEL, fd, NULL);
+ ret = epoll_ctl(ep_fd, EPOLL_CTL_DEL, fd, NULL);
+ if (ret < 0)
+ eprintf("fail to remove epoll event %d %d\n", ret, errno);
+
list_del(&tev->e_list);
free(tev);
}
--
To unsubscribe from this list: send the line "unsubscribe stgt" in
the body of a message to majordomo at vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
More information about the stgt
mailing list