-
- Downloads
iscsi-target: Fix missed wakeup race in TX thread
The sleeping code in iscsi_target_tx_thread() is susceptible to the classic missed wakeup race: - TX thread finishes handle_immediate_queue() and handle_response_queue(), thinks both queues are empty. - Another thread adds a queue entry and does wake_up_process(), which does nothing because the TX thread is still awake. - TX thread does schedule_timeout() and sleeps forever. In practice this can kill an iSCSI connection if for example an initiator does single-threaded writes and the target misses the wakeup window when queueing an R2T; in this case the connection will be stuck until the initiator loses patience and does some task management operation (or kills the connection entirely). Fix this by converting to wait_event_interruptible(), which does not suffer from this sort of race. Signed-off-by:Roland Dreier <roland@purestorage.com> Cc: Andy Grover <agrover@redhat.com> Cc: Hannes Reinecke <hare@suse.de> Cc: Christoph Hellwig <hch@lst.de> Cc: stable@vger.kernel.org Signed-off-by:
Nicholas Bellinger <nab@linux-iscsi.org>
Showing
- drivers/target/iscsi/iscsi_target.c 3 additions, 1 deletiondrivers/target/iscsi/iscsi_target.c
- drivers/target/iscsi/iscsi_target_core.h 1 addition, 0 deletionsdrivers/target/iscsi/iscsi_target_core.h
- drivers/target/iscsi/iscsi_target_login.c 1 addition, 0 deletionsdrivers/target/iscsi/iscsi_target_login.c
- drivers/target/iscsi/iscsi_target_util.c 20 additions, 2 deletionsdrivers/target/iscsi/iscsi_target_util.c
- drivers/target/iscsi/iscsi_target_util.h 1 addition, 0 deletionsdrivers/target/iscsi/iscsi_target_util.h
Loading
Please register or sign in to comment