scsi: sched/wait: Add wait_event_lock_irq_timeout for TASK_UNINTERRUPTIBLE usage
commit 25ab0bc334b43bbbe4eabc255006ce42a9424da2 upstream. Short of reverting commit00d909a107
("scsi: target: Make the session shutdown code also wait for commands that are being aborted") for v4.19, target-core needs a wait_event_t macro can be executed using TASK_UNINTERRUPTIBLE to function correctly with existing fabric drivers that expect to run with signals pending during session shutdown and active se_cmd I/O quiesce. The most notable is iscsi-target/iser-target, while ibmvscsi_tgt invokes session shutdown logic from userspace via configfs attribute that could also potentially have signals pending. So go ahead and introduce wait_event_lock_irq_timeout() to achieve this, and update + rename __wait_event_lock_irq_timeout() to make it accept 'state' as a parameter. Fixes:00d909a107
("scsi: target: Make the session shutdown code also wait for commands that are being aborted") Cc: <stable@vger.kernel.org> # v4.19+ Cc: Bart Van Assche <bvanassche@acm.org> Cc: Mike Christie <mchristi@redhat.com> Cc: Hannes Reinecke <hare@suse.com> Cc: Christoph Hellwig <hch@lst.de> Cc: Sagi Grimberg <sagi@grimberg.me> Cc: Bryant G. Ly <bryantly@linux.vnet.ibm.com> Cc: Peter Zijlstra (Intel) <peterz@infradead.org> Tested-by: Nicholas Bellinger <nab@linux-iscsi.org> Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org> Reviewed-by: Bryant G. Ly <bly@catalogicsoftware.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Reviewed-by: Bart Van Assche <bvanassche@acm.org> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
parent
1ff435098f
commit
fd594155e4
1 changed files with 15 additions and 5 deletions
|
@ -1052,10 +1052,9 @@ do { \
|
|||
__ret; \
|
||||
})
|
||||
|
||||
#define __wait_event_interruptible_lock_irq_timeout(wq_head, condition, \
|
||||
lock, timeout) \
|
||||
#define __wait_event_lock_irq_timeout(wq_head, condition, lock, timeout, state) \
|
||||
___wait_event(wq_head, ___wait_cond_timeout(condition), \
|
||||
TASK_INTERRUPTIBLE, 0, timeout, \
|
||||
state, 0, timeout, \
|
||||
spin_unlock_irq(&lock); \
|
||||
__ret = schedule_timeout(__ret); \
|
||||
spin_lock_irq(&lock));
|
||||
|
@ -1089,8 +1088,19 @@ do { \
|
|||
({ \
|
||||
long __ret = timeout; \
|
||||
if (!___wait_cond_timeout(condition)) \
|
||||
__ret = __wait_event_interruptible_lock_irq_timeout( \
|
||||
wq_head, condition, lock, timeout); \
|
||||
__ret = __wait_event_lock_irq_timeout( \
|
||||
wq_head, condition, lock, timeout, \
|
||||
TASK_INTERRUPTIBLE); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
#define wait_event_lock_irq_timeout(wq_head, condition, lock, timeout) \
|
||||
({ \
|
||||
long __ret = timeout; \
|
||||
if (!___wait_cond_timeout(condition)) \
|
||||
__ret = __wait_event_lock_irq_timeout( \
|
||||
wq_head, condition, lock, timeout, \
|
||||
TASK_UNINTERRUPTIBLE); \
|
||||
__ret; \
|
||||
})
|
||||
|
||||
|
|
Loading…
Reference in a new issue