Example #1
0
static void _zfcp_erp_lun_reopen_all(struct zfcp_port *port, int clear,
				     char *id)
{
	struct scsi_device *sdev;

	shost_for_each_device(sdev, port->adapter->scsi_host)
		if (sdev_to_zfcp(sdev)->port == port)
			_zfcp_erp_lun_reopen(sdev, clear, id, 0);
}
Example #2
0
void zfcp_erp_lun_reopen(struct scsi_device *sdev, int clear, char *id)
{
    unsigned long flags;
    struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
    struct zfcp_port *port = zfcp_sdev->port;
    struct zfcp_adapter *adapter = port->adapter;

    write_lock_irqsave(&adapter->erp_lock, flags);
    _zfcp_erp_lun_reopen(sdev, clear, id, 0);
    write_unlock_irqrestore(&adapter->erp_lock, flags);
}
Example #3
0
void zfcp_erp_lun_shutdown_wait(struct scsi_device *sdev, char *id)
{
    unsigned long flags;
    struct zfcp_scsi_dev *zfcp_sdev = sdev_to_zfcp(sdev);
    struct zfcp_port *port = zfcp_sdev->port;
    struct zfcp_adapter *adapter = port->adapter;
    int clear = ZFCP_STATUS_COMMON_RUNNING | ZFCP_STATUS_COMMON_ERP_FAILED;

    write_lock_irqsave(&adapter->erp_lock, flags);
    _zfcp_erp_lun_reopen(sdev, clear, id, ZFCP_STATUS_ERP_NO_REF);
    write_unlock_irqrestore(&adapter->erp_lock, flags);

    zfcp_erp_wait(adapter);
}
Example #4
0
static void zfcp_erp_strategy_followup_failed(struct zfcp_erp_action *act)
{
    switch (act->action) {
    case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
        _zfcp_erp_adapter_reopen(act->adapter, 0, "ersff_1");
        break;
    case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
        _zfcp_erp_port_forced_reopen(act->port, 0, "ersff_2");
        break;
    case ZFCP_ERP_ACTION_REOPEN_PORT:
        _zfcp_erp_port_reopen(act->port, 0, "ersff_3");
        break;
    case ZFCP_ERP_ACTION_REOPEN_LUN:
        _zfcp_erp_lun_reopen(act->sdev, 0, "ersff_4", 0);
        break;
    }
}
Example #5
0
static int zfcp_erp_strategy_statechange(struct zfcp_erp_action *act, int ret)
{
    int action = act->action;
    struct zfcp_adapter *adapter = act->adapter;
    struct zfcp_port *port = act->port;
    struct scsi_device *sdev = act->sdev;
    struct zfcp_scsi_dev *zfcp_sdev;
    u32 erp_status = act->status;

    switch (action) {
    case ZFCP_ERP_ACTION_REOPEN_ADAPTER:
        if (zfcp_erp_strat_change_det(&adapter->status, erp_status)) {
            _zfcp_erp_adapter_reopen(adapter,
                                     ZFCP_STATUS_COMMON_ERP_FAILED,
                                     "ersscg1");
            return ZFCP_ERP_EXIT;
        }
        break;

    case ZFCP_ERP_ACTION_REOPEN_PORT_FORCED:
    case ZFCP_ERP_ACTION_REOPEN_PORT:
        if (zfcp_erp_strat_change_det(&port->status, erp_status)) {
            _zfcp_erp_port_reopen(port,
                                  ZFCP_STATUS_COMMON_ERP_FAILED,
                                  "ersscg2");
            return ZFCP_ERP_EXIT;
        }
        break;

    case ZFCP_ERP_ACTION_REOPEN_LUN:
        zfcp_sdev = sdev_to_zfcp(sdev);
        if (zfcp_erp_strat_change_det(&zfcp_sdev->status, erp_status)) {
            _zfcp_erp_lun_reopen(sdev,
                                 ZFCP_STATUS_COMMON_ERP_FAILED,
                                 "ersscg3", 0);
            return ZFCP_ERP_EXIT;
        }
        break;
    }
    return ret;
}