static ssize_t zfcp_sysfs_adapter_failed_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct ccw_device *cdev = to_ccwdev(dev); struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); unsigned long val; int retval = 0; if (!adapter) return -ENODEV; if (strict_strtoul(buf, 0, &val) || val != 0) { retval = -EINVAL; goto out; } zfcp_erp_modify_adapter_status(adapter, "syafai1", NULL, ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET); zfcp_erp_adapter_reopen(adapter, ZFCP_STATUS_COMMON_ERP_FAILED, "syafai2", NULL); zfcp_erp_wait(adapter); out: zfcp_ccw_adapter_put(adapter); return retval ? retval : (ssize_t) count; }
static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct ccw_device *cdev = to_ccwdev(dev); struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); struct zfcp_port *port; u64 wwpn; int retval = -EINVAL; if (!adapter) return -ENODEV; if (strict_strtoull(buf, 0, (unsigned long long *) &wwpn)) goto out; port = zfcp_get_port_by_wwpn(adapter, wwpn); if (!port) goto out; else retval = 0; write_lock_irq(&adapter->port_list_lock); list_del(&port->list); write_unlock_irq(&adapter->port_list_lock); put_device(&port->dev); zfcp_erp_port_shutdown(port, 0, "syprs_1", NULL); zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs); out: zfcp_ccw_adapter_put(adapter); return retval ? retval : (ssize_t) count; }
static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun) { struct ccw_device *cdev; struct zfcp_adapter *adapter; struct zfcp_port *port; cdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid); if (!cdev) return; if (ccw_device_set_online(cdev)) goto out_ccw_device; adapter = zfcp_ccw_adapter_by_cdev(cdev); if (!adapter) goto out_ccw_device; port = zfcp_get_port_by_wwpn(adapter, wwpn); if (!port) goto out_port; flush_work(&port->rport_work); zfcp_unit_add(port, lun); put_device(&port->dev); out_port: zfcp_ccw_adapter_put(adapter); out_ccw_device: put_device(&cdev->dev); return; }
static struct zfcp_adapter *zfcp_cfdc_get_adapter(u32 devno) { char busid[9]; struct ccw_device *cdev; struct zfcp_adapter *adapter; snprintf(busid, sizeof(busid), "0.0.%04x", devno); cdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid); if (!cdev) return NULL; adapter = zfcp_ccw_adapter_by_cdev(cdev); put_device(&cdev->dev); return adapter; }
static ssize_t zfcp_sysfs_port_rescan_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct ccw_device *cdev = to_ccwdev(dev); struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); if (!adapter) return -ENODEV; /* sync the user-space- with the kernel-invocation of scan_work */ queue_work(adapter->work_queue, &adapter->scan_work); flush_work(&adapter->scan_work); zfcp_ccw_adapter_put(adapter); return (ssize_t) count; }
static ssize_t zfcp_sysfs_port_remove_store(struct device *dev, struct device_attribute *attr, const char *buf, size_t count) { struct ccw_device *cdev = to_ccwdev(dev); struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); struct zfcp_port *port; u64 wwpn; int retval = -EINVAL; if (!adapter) return -ENODEV; if (strict_strtoull(buf, 0, (unsigned long long *) &wwpn)) goto out; port = zfcp_get_port_by_wwpn(adapter, wwpn); if (!port) goto out; else retval = 0; mutex_lock(&zfcp_sysfs_port_units_mutex); if (atomic_read(&port->units) > 0) { retval = -EBUSY; mutex_unlock(&zfcp_sysfs_port_units_mutex); goto out; } /* port is about to be removed, so no more unit_add */ atomic_set(&port->units, -1); mutex_unlock(&zfcp_sysfs_port_units_mutex); write_lock_irq(&adapter->port_list_lock); list_del(&port->list); write_unlock_irq(&adapter->port_list_lock); put_device(&port->dev); zfcp_erp_port_shutdown(port, 0, "syprs_1"); zfcp_device_unregister(&port->dev, &zfcp_sysfs_port_attrs); out: zfcp_ccw_adapter_put(adapter); return retval ? retval : (ssize_t) count; }
static ssize_t zfcp_sysfs_adapter_failed_show(struct device *dev, struct device_attribute *attr, char *buf) { struct ccw_device *cdev = to_ccwdev(dev); struct zfcp_adapter *adapter = zfcp_ccw_adapter_by_cdev(cdev); int i; if (!adapter) return -ENODEV; if (atomic_read(&adapter->status) & ZFCP_STATUS_COMMON_ERP_FAILED) i = sprintf(buf, "1\n"); else i = sprintf(buf, "0\n"); zfcp_ccw_adapter_put(adapter); return i; }
static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun) { struct ccw_device *cdev; struct zfcp_adapter *adapter; struct zfcp_port *port; struct zfcp_unit *unit; cdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid); if (!cdev) return; if (ccw_device_set_online(cdev)) goto out_ccw_device; adapter = zfcp_ccw_adapter_by_cdev(cdev); if (!adapter) goto out_ccw_device; port = zfcp_get_port_by_wwpn(adapter, wwpn); if (!port) goto out_port; unit = zfcp_unit_enqueue(port, lun); if (IS_ERR(unit)) goto out_unit; zfcp_erp_unit_reopen(unit, 0, "auidc_1", NULL); zfcp_erp_wait(adapter); flush_work(&unit->scsi_work); out_unit: put_device(&port->dev); out_port: zfcp_ccw_adapter_put(adapter); out_ccw_device: put_device(&cdev->dev); return; }