Patch "target: fix ALUA transition timeout handling" has been added to the 4.4-stable tree
Subsystems (2)
This is a note to let you know that I've just added the patch titled
target: fix ALUA transition timeout handling
to the 4.4-stable tree which can be found at:
http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary
The filename of the patch is:
target-fix-alua-transition-timeout-handling.patch
and it can be found in the queue-4.4 subdirectory.
If you, or anyone else, feels it should not be added to the stable tree, please let <[email protected]> know about it.
Quoted 1 line
From foo@baz Mon Dec 18 14:47:43 CET 2017
From: Mike Christie <[email protected]>
Date: Thu, 2 Mar 2017 04:59:48 -0600
Subject: target: fix ALUA transition timeout handling
From: Mike Christie <[email protected]>
[ Upstream commit d7175373f2745ed4abe5b388d5aabd06304f801e ]
The implicit transition time tells initiators the min time
to wait before timing out a transition. We currently schedule the transition to occur in tg_pt_gp_implicit_trans_secs seconds so there is no room for delays. If core_alua_do_transition_tg_pt_work->core_alua_update_tpg_primary_metadata needs to write out info to a remote file, then the initiator can easily time out the operation.
--- drivers/target/target_core_alua.c | 23 ++++++++--------------- include/target/target_core_base.h | 2 +- 2 files changed, 9 insertions(+), 16 deletions(-)
drivers/target/target_core_alua.c +8 -15
@@ -1010,7 +1010,7 @@ static void core_alua_queue_state_changestatic void core_alua_do_transition_tg_pt_work (struct work_struct *work) {struct t10_alua_tg_pt_gp *tg_pt_gp =container_of (work, - struct t10_alua_tg_pt_gp, tg_pt_gp_transition_work.work); + struct t10_alua_tg_pt_gp, tg_pt_gp_transition_work);struct se_device *dev = tg_pt_gp->tg_pt_gp_dev;bool explicit = (tg_pt_gp->tg_pt_gp_alua_access_status ==ALUA_STATUS_ALTERED_BY_EXPLICIT_STPG );
@@ -1073,13 +1073,12 @@ static int core_alua_do_transition_tg_pt/* * Flush any pending transitions */ -if (!explicit && tg_pt_gp->tg_pt_gp_implicit_trans_secs && -atomic_read (&tg_pt_gp->tg_pt_gp_alua_access_state) == +if (!explicit &&atomic_read (&tg_pt_gp->tg_pt_gp_alua_access_state) ==ALUA_ACCESS_STATE_TRANSITION ) {/* Just in case */ tg_pt_gp->tg_pt_gp_alua_pending_state = new_state; tg_pt_gp->tg_pt_gp_transition_complete = &wait; -flush_delayed_work (&tg_pt_gp->tg_pt_gp_transition_work); +flush_work (&tg_pt_gp->tg_pt_gp_transition_work);wait_for_completion (&wait); tg_pt_gp->tg_pt_gp_transition_complete =NULL ;return 0 ;
@@ -1114,15 +1113,9 @@ static int core_alua_do_transition_tg_ptatomic_inc (&tg_pt_gp->tg_pt_gp_ref_cnt);spin_unlock (&dev->t10_alua.tg_pt_gps_lock); -if (!explicit && tg_pt_gp->tg_pt_gp_implicit_trans_secs) { -unsigned long transition_tmo; - - transition_tmo = tg_pt_gp->tg_pt_gp_implicit_trans_secs *HZ ; -schedule_delayed_work (&tg_pt_gp->tg_pt_gp_transition_work, - transition_tmo); - }else { +schedule_work (&tg_pt_gp->tg_pt_gp_transition_work); +if (explicit) { tg_pt_gp->tg_pt_gp_transition_complete = &wait; -schedule_delayed_work (&tg_pt_gp->tg_pt_gp_transition_work,0 );wait_for_completion (&wait); tg_pt_gp->tg_pt_gp_transition_complete =NULL ; }
@@ -1690,8 +1683,8 @@ struct t10_alua_tg_pt_gp *core_alua_allomutex_init (&tg_pt_gp->tg_pt_gp_md_mutex);spin_lock_init (&tg_pt_gp->tg_pt_gp_lock);atomic_set (&tg_pt_gp->tg_pt_gp_ref_cnt,0 ); -INIT_DELAYED_WORK (&tg_pt_gp->tg_pt_gp_transition_work, - core_alua_do_transition_tg_pt_work); +INIT_WORK (&tg_pt_gp->tg_pt_gp_transition_work, + core_alua_do_transition_tg_pt_work); tg_pt_gp->tg_pt_gp_dev = dev;atomic_set (&tg_pt_gp->tg_pt_gp_alua_access_state,ALUA_ACCESS_STATE_ACTIVE_OPTIMIZED );
@@ -1799,7 +1792,7 @@ void core_alua_free_tg_pt_gp( dev->t10_alua.alua_tg_pt_gps_counter--;spin_unlock (&dev->t10_alua.tg_pt_gps_lock); -flush_delayed_work (&tg_pt_gp->tg_pt_gp_transition_work); +flush_work (&tg_pt_gp->tg_pt_gp_transition_work);/* * Allow a struct t10_alua_tg_pt_gp_member * referenced by
include/target/target_core_base.h +1 -1
@@ -299,7 +299,7 @@ struct t10_alua_tg_pt_gp {struct list_head tg_pt_gp_lun_list;struct se_lun *tg_pt_gp_alua_lun;struct se_node_acl *tg_pt_gp_alua_nacl; -struct delayed_work tg_pt_gp_transition_work; +struct work_struct tg_pt_gp_transition_work;struct completion *tg_pt_gp_transition_complete; };
Patches currently in stable-queue which might be from [email protected] are
queue-4.4/target-use-system-workqueue-for-alua-transitions.patch queue-4.4/target-iscsi-fix-a-race-condition-in-iscsit_add_reject_from_cmd.patch queue-4.4/target-fix-alua-transition-timeout-handling.patch queue-4.4/target-fix-race-during-implicit-transition-work-flushes.patch