[stgt] [PATCH] iscsi: target->events_list race
FUJITA Tomonori
fujita.tomonori at lab.ntt.co.jp
Wed Jun 9 01:42:11 CEST 2010
Ok, we need this for pthread per target.
=
From: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
Subject: [PATCH] iscsi: target->events_list race
target->events_list can be accessed by the main and target pthreads.
Signed-off-by: FUJITA Tomonori <fujita.tomonori at lab.ntt.co.jp>
---
usr/iscsi/iscsi_tcp.c | 11 +++++++++++
usr/iscsi/iscsid.h | 1 +
usr/iscsi/target.c | 6 ++++++
3 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/usr/iscsi/iscsi_tcp.c b/usr/iscsi/iscsi_tcp.c
index 471eea0..d1edd84 100644
--- a/usr/iscsi/iscsi_tcp.c
+++ b/usr/iscsi/iscsi_tcp.c
@@ -31,6 +31,7 @@
#include <netinet/tcp.h>
#include <sys/epoll.h>
#include <sys/socket.h>
+#include <pthread.h>
#include "iscsid.h"
#include "tgtd.h"
@@ -170,8 +171,10 @@ static void iscsi_tcp_event_handler(int fd, int events, void *data)
if (tcp_conn->pthread) {
struct iscsi_target *target = conn->session->target;
+ pthread_mutex_lock(&target->event_lock);
do_tgt_event_del(target->efd, &target->events_list,
tcp_conn->fd);
+ pthread_mutex_unlock(&target->event_lock);
/* let the main thread handle this */
tcp_conn->pthread = 0;
tgt_event_modify(tcp_conn->fd, EPOLLIN|EPOLLOUT|EPOLLERR);
@@ -283,9 +286,15 @@ static void iscsi_tcp_conn_nexus_init(struct iscsi_connection *conn)
if (iscsi_pthread_per_target()) {
/* remove the conn from the main thread. */
conn->tp->ep_event_modify(conn, 0);
+
+ pthread_mutex_lock(&target->event_lock);
+
do_tgt_event_add(target->efd, &target->events_list,
tcp_conn->fd, EPOLLIN,
iscsi_tcp_event_handler, conn);
+
+ pthread_mutex_unlock(&target->event_lock);
+
tcp_conn->pthread = 1;
}
@@ -368,8 +377,10 @@ static void iscsi_event_modify(struct iscsi_connection *conn, int events)
if (tcp_conn->pthread) {
struct iscsi_target *target = conn->session->target;
+ pthread_mutex_lock(&target->event_lock);
do_tgt_event_modify(target->efd, &target->events_list,
tcp_conn->fd, events);
+ pthread_mutex_unlock(&target->event_lock);
} else {
ret = tgt_event_modify(tcp_conn->fd, events);
if (ret)
diff --git a/usr/iscsi/iscsid.h b/usr/iscsi/iscsid.h
index 40f3ff4..1e70d81 100644
--- a/usr/iscsi/iscsid.h
+++ b/usr/iscsi/iscsid.h
@@ -246,6 +246,7 @@ struct iscsi_target {
struct list_head isns_list;
int efd;
+ pthread_mutex_t event_lock;
struct list_head events_list;
struct bs_finish bsfin;
diff --git a/usr/iscsi/target.c b/usr/iscsi/target.c
index cd45fb0..b547626 100644
--- a/usr/iscsi/target.c
+++ b/usr/iscsi/target.c
@@ -256,6 +256,8 @@ void iscsi_target_destroy(int tid)
list_del(&target->tlist);
+ pthread_mutex_init(&target->event_lock, NULL);
+
if (target->bsfin.thread) {
target->stop_pthread = 1;
pthread_kill(target->bsfin.thread, SIGUSR2);
@@ -283,9 +285,13 @@ static void *iscsi_thread_fn(void *arg)
sigaddset(&mask, SIGUSR2);
pthread_sigmask(SIG_BLOCK, &mask, NULL);
+ pthread_mutex_lock(&t->event_lock);
+
do_tgt_event_add(t->efd, &t->events_list, sig_fd, EPOLLIN,
bs_sig_request_done, &t->bsfin);
+ pthread_mutex_unlock(&t->event_lock);
+
retry:
nevent = epoll_wait(t->efd, events, ARRAY_SIZE(events), 1000);
if (nevent < 0) {
--
1.6.5
--
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