11daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/* 21daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp device driver 31daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 41daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Tracking of manually configured LUNs and helper functions to 51daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * register the LUNs with the SCSI midlayer. 61daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 71daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Copyright IBM Corporation 2010 81daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 91daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 101daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt#include "zfcp_def.h" 111daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt#include "zfcp_ext.h" 121daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 131daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 141daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_scsi_scan - Register LUN with SCSI midlayer 151daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @unit: The zfcp LUN/unit to register 161daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 171daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * When the SCSI midlayer is not allowed to automatically scan and 181daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * attach SCSI devices, zfcp has to register the single devices with 191daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * the SCSI midlayer. 201daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 211daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittvoid zfcp_unit_scsi_scan(struct zfcp_unit *unit) 221daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 231daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct fc_rport *rport = unit->port->rport; 241daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unsigned int lun; 251daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 261daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt lun = scsilun_to_int((struct scsi_lun *) &unit->fcp_lun); 271daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 281daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (rport && rport->port_state == FC_PORTSTATE_ONLINE) 291daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_scan_target(&rport->dev, 0, rport->scsi_target_id, lun, 1); 301daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 311daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 321daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittstatic void zfcp_unit_scsi_scan_work(struct work_struct *work) 331daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 341daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit = container_of(work, struct zfcp_unit, 351daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_work); 361daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 371daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt zfcp_unit_scsi_scan(unit); 381daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 391daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 401daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 411daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 421daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_queue_scsi_scan - Register configured units on port 431daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @port: The zfcp_port where to register units 441daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 451daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * After opening a port, all units configured on this port have to be 461daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * registered with the SCSI midlayer. This function should be called 471daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * after calling fc_remote_port_add, so that the fc_rport is already 481daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * ONLINE and the call to scsi_scan_target runs the same way as the 491daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * call in the FC transport class. 501daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 511daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittvoid zfcp_unit_queue_scsi_scan(struct zfcp_port *port) 521daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 531daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit; 541daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 551daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt read_lock_irq(&port->unit_list_lock); 561daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt list_for_each_entry(unit, &port->unit_list, list) { 571daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt get_device(&unit->dev); 581daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (scsi_queue_work(port->adapter->scsi_host, 591daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt &unit->scsi_work) <= 0) 601daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 611daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 621daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt read_unlock_irq(&port->unit_list_lock); 631daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 641daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 651daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittstatic struct zfcp_unit *_zfcp_unit_find(struct zfcp_port *port, u64 fcp_lun) 661daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 671daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit; 681daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 691daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt list_for_each_entry(unit, &port->unit_list, list) 701daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (unit->fcp_lun == fcp_lun) { 711daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt get_device(&unit->dev); 721daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return unit; 731daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 741daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 751daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return NULL; 761daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 771daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 781daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 791daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_find - Find and return zfcp_unit with specified FCP LUN 801daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @port: zfcp_port where to look for the unit 811daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @fcp_lun: 64 Bit FCP LUN used to identify the zfcp_unit 821daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 831daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * If zfcp_unit is found, a reference is acquired that has to be 841daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * released later. 851daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 861daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns: Pointer to the zfcp_unit, or NULL if there is no zfcp_unit 871daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * with the specified FCP LUN. 881daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 891daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittstruct zfcp_unit *zfcp_unit_find(struct zfcp_port *port, u64 fcp_lun) 901daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 911daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit; 921daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 931daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt read_lock_irq(&port->unit_list_lock); 941daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit = _zfcp_unit_find(port, fcp_lun); 951daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt read_unlock_irq(&port->unit_list_lock); 961daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return unit; 971daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 981daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 991daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 1001daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_release - Drop reference to zfcp_port and free memory of zfcp_unit. 1011daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @dev: pointer to device in zfcp_unit 1021daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 1031daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittstatic void zfcp_unit_release(struct device *dev) 1041daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 1051daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit = container_of(dev, struct zfcp_unit, dev); 1061daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1071daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->port->dev); 1081daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt kfree(unit); 1091daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 1101daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1111daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 1121daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_enqueue - enqueue unit to unit list of a port. 1131daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @port: pointer to port where unit is added 1141daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @fcp_lun: FCP LUN of unit to be enqueued 1151daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns: 0 success 1161daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 1171daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Sets up some unit internal structures and creates sysfs entry. 1181daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 1191daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittint zfcp_unit_add(struct zfcp_port *port, u64 fcp_lun) 1201daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 1211daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit; 1221daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1231daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit = zfcp_unit_find(port, fcp_lun); 1241daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (unit) { 1251daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 1261daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return -EEXIST; 1271daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 1281daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1291daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit = kzalloc(sizeof(struct zfcp_unit), GFP_KERNEL); 1301daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (!unit) 1311daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return -ENOMEM; 1321daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1331daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->port = port; 1341daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->fcp_lun = fcp_lun; 1351daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->dev.parent = &port->dev; 1361daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->dev.release = zfcp_unit_release; 1371daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt INIT_WORK(&unit->scsi_work, zfcp_unit_scsi_scan_work); 1381daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1391daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (dev_set_name(&unit->dev, "0x%016llx", 1401daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt (unsigned long long) fcp_lun)) { 1411daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt kfree(unit); 1421daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return -ENOMEM; 1431daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 1441daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1451a9708cd352e3b25500704daee9270d879e48199Christof Schmitt get_device(&port->dev); 1461a9708cd352e3b25500704daee9270d879e48199Christof Schmitt 1471daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (device_register(&unit->dev)) { 1481daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 1491daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return -ENOMEM; 1501daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 1511daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1521daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (sysfs_create_group(&unit->dev.kobj, &zfcp_sysfs_unit_attrs)) { 1531daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt device_unregister(&unit->dev); 1541daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return -EINVAL; 1551daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 1561daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1571daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_lock_irq(&port->unit_list_lock); 1581daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt list_add_tail(&unit->list, &port->unit_list); 1591daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_unlock_irq(&port->unit_list_lock); 1601daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1611daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt zfcp_unit_scsi_scan(unit); 1621daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1631daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return 0; 1641daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 1651daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1661daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 1671daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_sdev - Return SCSI device for zfcp_unit 1681daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @unit: The zfcp_unit where to get the SCSI device for 1691daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 1701daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns: scsi_device pointer on success, NULL if there is no SCSI 1711daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * device for this zfcp_unit 1721daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 1731daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * On success, the caller also holds a reference to the SCSI device 1741daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * that must be released with scsi_device_put. 1751daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 1761daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittstruct scsi_device *zfcp_unit_sdev(struct zfcp_unit *unit) 1771daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 1781daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct Scsi_Host *shost; 1791daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_port *port; 1801daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unsigned int lun; 1811daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1821daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt lun = scsilun_to_int((struct scsi_lun *) &unit->fcp_lun); 1831daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt port = unit->port; 1841daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt shost = port->adapter->scsi_host; 1851daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return scsi_device_lookup(shost, 0, port->starget_id, lun); 1861daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 1871daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1881daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 1891daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_sdev_status - Return zfcp LUN status for SCSI device 1901daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @unit: The unit to lookup the SCSI device for 1911daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 1921daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns the zfcp LUN status field of the SCSI device if the SCSI device 1931daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * for the zfcp_unit exists, 0 otherwise. 1941daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 1951daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittunsigned int zfcp_unit_sdev_status(struct zfcp_unit *unit) 1961daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 1971daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unsigned int status = 0; 1981daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct scsi_device *sdev; 1991daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_scsi_dev *zfcp_sdev; 2001daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2011daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt sdev = zfcp_unit_sdev(unit); 2021daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (sdev) { 2031daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt zfcp_sdev = sdev_to_zfcp(sdev); 2041daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt status = atomic_read(&zfcp_sdev->status); 2051daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_device_put(sdev); 2061daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 2071daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2081daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return status; 2091daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 2101daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2111daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 2121daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_remove - Remove entry from list of configured units 2131daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @port: The port where to remove the unit from the configuration 2141daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @fcp_lun: The 64 bit LUN of the unit to remove 2151daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 2161daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns: -EINVAL if a unit with the specified LUN does not exist, 2171daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 0 on success. 2181daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 2191daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittint zfcp_unit_remove(struct zfcp_port *port, u64 fcp_lun) 2201daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 2211daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit; 2221daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct scsi_device *sdev; 2231daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2241daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_lock_irq(&port->unit_list_lock); 2251daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit = _zfcp_unit_find(port, fcp_lun); 2261daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (unit) 2271daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt list_del(&unit->list); 2281daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_unlock_irq(&port->unit_list_lock); 2291daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2301daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (!unit) 2311daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return -EINVAL; 2321daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2331daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt sdev = zfcp_unit_sdev(unit); 2341daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (sdev) { 2351daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_remove_device(sdev); 2361daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_device_put(sdev); 2371daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 2381daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2391daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 2401daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2411daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt zfcp_device_unregister(&unit->dev, &zfcp_sysfs_unit_attrs); 2421daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2431daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return 0; 2441daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 245