Skip to content

Commit 92f1a80

Browse files
sdimitropalash-gandhi
authored andcommitted
DLPX-84985 target: iscsi: fix deadlock in the iSCSI login code (#22)
1 parent 238d6d1 commit 92f1a80

File tree

1 file changed

+14
-3
lines changed

1 file changed

+14
-3
lines changed

drivers/target/iscsi/iscsi_target_nego.c

Lines changed: 14 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -472,12 +472,18 @@ static int iscsi_target_do_login(struct iscsit_conn *, struct iscsi_login *);
472472

473473
static bool __iscsi_target_sk_check_close(struct sock *sk)
474474
{
475-
if (sk->sk_state == TCP_CLOSE_WAIT || sk->sk_state == TCP_CLOSE) {
476-
pr_debug("__iscsi_target_sk_check_close: TCP_CLOSE_WAIT|TCP_CLOSE,"
475+
switch (sk->sk_state) {
476+
case TCP_FIN_WAIT1:
477+
case TCP_FIN_WAIT2:
478+
case TCP_CLOSE_WAIT:
479+
case TCP_LAST_ACK:
480+
case TCP_CLOSE:
481+
pr_debug("__iscsi_target_sk_check_close: socket closing,"
477482
"returning TRUE\n");
478483
return true;
484+
default:
485+
return false;
479486
}
480-
return false;
481487
}
482488

483489
static bool iscsi_target_sk_check_close(struct iscsit_conn *conn)
@@ -639,6 +645,7 @@ static void iscsi_target_do_login_rx(struct work_struct *work)
639645
} else if (rc == 1) {
640646
iscsit_stop_login_timer(conn);
641647
cancel_delayed_work(&conn->login_work);
648+
iscsit_stop_login_timer(conn);
642649
iscsi_target_nego_release(conn);
643650
iscsi_post_login_handler(np, conn, zero_tsih);
644651
iscsit_deaccess_np(np, tpg, tpg_np);
@@ -649,6 +656,7 @@ static void iscsi_target_do_login_rx(struct work_struct *work)
649656
iscsi_target_restore_sock_callbacks(conn);
650657
iscsit_stop_login_timer(conn);
651658
cancel_delayed_work(&conn->login_work);
659+
iscsit_stop_login_timer(conn);
652660
iscsi_target_login_drop(conn, login);
653661
iscsit_deaccess_np(np, tpg, tpg_np);
654662
}
@@ -1352,6 +1360,9 @@ int iscsi_target_start_negotiation(
13521360
set_bit(LOGIN_FLAGS_INITIAL_PDU, &conn->login_flags);
13531361
write_unlock_bh(&sk->sk_callback_lock);
13541362
}
1363+
1364+
iscsit_start_login_timer(conn);
1365+
13551366
/*
13561367
* If iscsi_target_do_login returns zero to signal more PDU
13571368
* exchanges are required to complete the login, go ahead and

0 commit comments

Comments
 (0)