Commit 1bc35475 authored by Xiang Chen's avatar Xiang Chen Committed by Martin K. Petersen
Browse files

scsi: libsas: Refactor sas_queue_deferred_work()

In the second part of function __sas_drain_work(), deferred work is queued.
This functionality is required other places so factor it out into the
function sas_queue_deferred_work().

Link: https://lore.kernel.org/r/1639999298-244569-12-git-send-email-chenxiang66@hisilicon.com


Reviewed-by: default avatarJohn Garry <john.garry@huawei.com>
Signed-off-by: default avatarXiang Chen <chenxiang66@hisilicon.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 4ea775ab
Loading
Loading
Loading
Loading
+14 −11
Original line number Diff line number Diff line
@@ -41,12 +41,23 @@ static int sas_queue_event(int event, struct sas_work *work,
	return rc;
}


void __sas_drain_work(struct sas_ha_struct *ha)
void sas_queue_deferred_work(struct sas_ha_struct *ha)
{
	struct sas_work *sw, *_sw;
	int ret;

	spin_lock_irq(&ha->lock);
	list_for_each_entry_safe(sw, _sw, &ha->defer_q, drain_node) {
		list_del_init(&sw->drain_node);
		ret = sas_queue_work(ha, sw);
		if (ret != 1)
			sas_free_event(to_asd_sas_event(&sw->work));
	}
	spin_unlock_irq(&ha->lock);
}

void __sas_drain_work(struct sas_ha_struct *ha)
{
	set_bit(SAS_HA_DRAINING, &ha->state);
	/* flush submitters */
	spin_lock_irq(&ha->lock);
@@ -55,16 +66,8 @@ void __sas_drain_work(struct sas_ha_struct *ha)
	drain_workqueue(ha->event_q);
	drain_workqueue(ha->disco_q);

	spin_lock_irq(&ha->lock);
	clear_bit(SAS_HA_DRAINING, &ha->state);
	list_for_each_entry_safe(sw, _sw, &ha->defer_q, drain_node) {
		list_del_init(&sw->drain_node);
		ret = sas_queue_work(ha, sw);
		if (ret != 1)
			sas_free_event(to_asd_sas_event(&sw->work));

	}
	spin_unlock_irq(&ha->lock);
	sas_queue_deferred_work(ha);
}

int sas_drain_work(struct sas_ha_struct *ha)
+1 −0
Original line number Diff line number Diff line
@@ -57,6 +57,7 @@ void sas_unregister_ports(struct sas_ha_struct *sas_ha);

void sas_disable_revalidation(struct sas_ha_struct *ha);
void sas_enable_revalidation(struct sas_ha_struct *ha);
void sas_queue_deferred_work(struct sas_ha_struct *ha);
void __sas_drain_work(struct sas_ha_struct *ha);

void sas_deform_port(struct asd_sas_phy *phy, int gone);