From 7502f47dad40e034be02e4c5a906bf2b6fe8a38f Mon Sep 17 00:00:00 2001 From: Vladislav Bolkhovitin Date: Fri, 4 Oct 2013 02:17:43 +0000 Subject: [PATCH] Fix small possible race in sessions management In q2t_del_sess_work_fn() session can get ready to be destroyed before hardware_lock is taken From Bart Van Assche git-svn-id: http://svn.code.sf.net/p/scst/svn/trunk@5020 d57e44dd-8a1f-0410-8b47-8ef2f437770f --- qla2x00t/qla2x00-target/qla2x00t.c | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/qla2x00t/qla2x00-target/qla2x00t.c b/qla2x00t/qla2x00-target/qla2x00t.c index 044045309..26af288e8 100644 --- a/qla2x00t/qla2x00-target/qla2x00t.c +++ b/qla2x00t/qla2x00-target/qla2x00t.c @@ -1136,6 +1136,7 @@ static void q2t_undelete_sess(struct q2t_sess *sess) TRACE_ENTRY(); sBUG_ON(!sess->deleted); + sBUG_ON(!list_entry_in_list(&sess->sess_list_entry)); TRACE_MGMT_DBG("Undeleting sess %p", sess); list_move(&sess->sess_list_entry, &sess->tgt->sess_list); @@ -1175,8 +1176,12 @@ static void q2t_del_sess_work_fn(struct delayed_work *work) cancel = q2t_check_fcport_exist(ha, sess); spin_lock_irqsave(&pha->hardware_lock, flags); - if (!sess->deleted) { - /* sess was undeleted while we were thinking */ + if (!sess->deleted || + !list_entry_in_list(&sess->sess_list_entry)) { + /* + * session has been undeleted or got ready to + * be destroyed while we were entering here + */ goto put_continue; }