Example #1
0
static int zfcp_erp_strategy_check_port(struct zfcp_port *port, int result)
{
    switch (result) {
    case ZFCP_ERP_SUCCEEDED :
        atomic_set(&port->erp_counter, 0);
        zfcp_erp_port_unblock(port);
        break;

    case ZFCP_ERP_FAILED :
        if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC) {
            zfcp_erp_port_block(port, 0);
            result = ZFCP_ERP_EXIT;
        }
        atomic_inc(&port->erp_counter);
        if (atomic_read(&port->erp_counter) > ZFCP_MAX_ERPS) {
            dev_err(&port->adapter->ccw_device->dev,
                    "ERP failed for remote port 0x%016Lx\n",
                    (unsigned long long)port->wwpn);
            zfcp_erp_set_port_status(port,
                                     ZFCP_STATUS_COMMON_ERP_FAILED);
        }
        break;
    }

    if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {
        zfcp_erp_port_block(port, 0);
        result = ZFCP_ERP_EXIT;
    }
    return result;
}
Example #2
0
static int zfcp_erp_open_ptp_port(struct zfcp_erp_action *act)
{
    struct zfcp_adapter *adapter = act->adapter;
    struct zfcp_port *port = act->port;

    if (port->wwpn != adapter->peer_wwpn) {
        zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED);
        return ZFCP_ERP_FAILED;
    }
    port->d_id = adapter->peer_d_id;
    return zfcp_erp_port_strategy_open_port(act);
}
Example #3
0
static int _zfcp_erp_port_reopen(struct zfcp_port *port, int clear, char *id)
{
    zfcp_erp_port_block(port, clear);
    zfcp_scsi_schedule_rport_block(port);

    if (atomic_read(&port->status) & ZFCP_STATUS_COMMON_ERP_FAILED) {

        zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_ERP_FAILED);
        return -EIO;
    }

    return zfcp_erp_action_enqueue(ZFCP_ERP_ACTION_REOPEN_PORT,
                                   port->adapter, port, NULL, id, 0);
}
static ssize_t zfcp_sysfs_port_failed_store(struct device *dev,
					    struct device_attribute *attr,
					    const char *buf, size_t count)
{
	struct zfcp_port *port = container_of(dev, struct zfcp_port, dev);
	unsigned long val;

	if (strict_strtoul(buf, 0, &val) || val != 0)
		return -EINVAL;

	zfcp_erp_set_port_status(port, ZFCP_STATUS_COMMON_RUNNING);
	zfcp_erp_port_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED, "sypfai2");
	zfcp_erp_wait(port->adapter);

	return count;
}