Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 947a9aca authored by Swen Schillig's avatar Swen Schillig Committed by James Bottomley
Browse files

[SCSI] zfcp: fix queue, scheduled work processing.



Ensure the refcounting is correct even if we were not able to
schedule a work. In addition we have to make sure no scheduled
work is pending while we're dequeing the adapter from the
systems environment.

Signed-off-by: default avatarSwen Schillig <swen@vnet.ibm.com>
Signed-off-by: default avatarChristof Schmitt <christof.schmitt@de.ibm.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 2cb5b2ca
Loading
Loading
Loading
Loading
+1 −0
Original line number Original line Diff line number Diff line
@@ -554,6 +554,7 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)


	cancel_work_sync(&adapter->scan_work);
	cancel_work_sync(&adapter->scan_work);
	cancel_work_sync(&adapter->stat_work);
	cancel_work_sync(&adapter->stat_work);
	cancel_delayed_work_sync(&adapter->nsp.work);
	zfcp_adapter_scsi_unregister(adapter);
	zfcp_adapter_scsi_unregister(adapter);
	sysfs_remove_group(&adapter->ccw_device->dev.kobj,
	sysfs_remove_group(&adapter->ccw_device->dev.kobj,
			   &zfcp_sysfs_adapter_attrs);
			   &zfcp_sysfs_adapter_attrs);
+7 −3
Original line number Original line Diff line number Diff line
@@ -857,7 +857,7 @@ void zfcp_erp_port_strategy_open_lookup(struct work_struct *work)
	port->erp_action.step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
	port->erp_action.step = ZFCP_ERP_STEP_NAMESERVER_LOOKUP;
	if (retval)
	if (retval)
		zfcp_erp_notify(&port->erp_action, ZFCP_ERP_FAILED);
		zfcp_erp_notify(&port->erp_action, ZFCP_ERP_FAILED);

	zfcp_port_put(port);
}
}


static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act)
static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act)
@@ -873,7 +873,10 @@ static int zfcp_erp_port_strategy_open_common(struct zfcp_erp_action *act)
		if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
		if (fc_host_port_type(adapter->scsi_host) == FC_PORTTYPE_PTP)
			return zfcp_erp_open_ptp_port(act);
			return zfcp_erp_open_ptp_port(act);
		if (!port->d_id) {
		if (!port->d_id) {
			queue_work(zfcp_data.work_queue, &port->gid_pn_work);
			zfcp_port_get(port);
			if (!queue_work(zfcp_data.work_queue,
					&port->gid_pn_work))
				zfcp_port_put(port);
			return ZFCP_ERP_CONTINUES;
			return ZFCP_ERP_CONTINUES;
		}
		}
	case ZFCP_ERP_STEP_NAMESERVER_LOOKUP:
	case ZFCP_ERP_STEP_NAMESERVER_LOOKUP:
@@ -1211,7 +1214,8 @@ static void zfcp_erp_schedule_work(struct zfcp_unit *unit)
	atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
	atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
	INIT_WORK(&p->work, zfcp_erp_scsi_scan);
	INIT_WORK(&p->work, zfcp_erp_scsi_scan);
	p->unit = unit;
	p->unit = unit;
	queue_work(zfcp_data.work_queue, &p->work);
	if (!queue_work(zfcp_data.work_queue, &p->work))
		zfcp_unit_put(unit);
}
}


static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)