forked from Minki/linux
5e0cf5e6c4
There are three timing problems in the kthread usages of iscsi_target_mod: - np_thread of struct iscsi_np - rx_thread and tx_thread of struct iscsi_conn In iscsit_close_connection(), it calls send_sig(SIGINT, conn->tx_thread, 1); kthread_stop(conn->tx_thread); In conn->tx_thread, which is iscsi_target_tx_thread(), when it receive SIGINT the kthread will exit without checking the return value of kthread_should_stop(). So if iscsi_target_tx_thread() exit right between send_sig(SIGINT...) and kthread_stop(...), the kthread_stop() will try to stop an already stopped kthread. This is invalid according to the documentation of kthread_stop(). (Fix -ECONNRESET logout handling in iscsi_target_tx_thread and early iscsi_target_rx_thread failure case - nab) Signed-off-by: Jiang Yi <jiangyilism@gmail.com> Cc: <stable@vger.kernel.org> # v3.12+ Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
21 lines
831 B
C
21 lines
831 B
C
#ifndef ISCSI_TARGET_ERL0_H
|
|
#define ISCSI_TARGET_ERL0_H
|
|
|
|
#include <linux/types.h>
|
|
|
|
struct iscsi_cmd;
|
|
struct iscsi_conn;
|
|
struct iscsi_session;
|
|
|
|
extern void iscsit_set_dataout_sequence_values(struct iscsi_cmd *);
|
|
extern int iscsit_check_pre_dataout(struct iscsi_cmd *, unsigned char *);
|
|
extern int iscsit_check_post_dataout(struct iscsi_cmd *, unsigned char *, u8);
|
|
extern void iscsit_start_time2retain_handler(struct iscsi_session *);
|
|
extern int iscsit_stop_time2retain_timer(struct iscsi_session *);
|
|
extern void iscsit_connection_reinstatement_rcfr(struct iscsi_conn *);
|
|
extern void iscsit_cause_connection_reinstatement(struct iscsi_conn *, int);
|
|
extern void iscsit_fall_back_to_erl0(struct iscsi_session *);
|
|
extern void iscsit_take_action_for_connection_exit(struct iscsi_conn *, bool *);
|
|
|
|
#endif /*** ISCSI_TARGET_ERL0_H ***/
|