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 * 7a53c8fab3f87c995c30ac226a03af95361243144Heiko Carstens * Copyright IBM Corp. 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; 249cb78c16f5dadefd8dc5ba0ae5a2f26cd59419b3Hannes Reinecke u64 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 107d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier atomic_dec(&unit->port->units); 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; 122d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier int retval = 0; 123d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier 124d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier mutex_lock(&zfcp_sysfs_port_units_mutex); 125d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier if (atomic_read(&port->units) == -1) { 126d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier /* port is already gone */ 127d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier retval = -ENODEV; 128d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier goto out; 129d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier } 1301daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1311daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit = zfcp_unit_find(port, fcp_lun); 1321daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (unit) { 1331daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 134d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier retval = -EEXIST; 135d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier goto out; 1361daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 1371daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1381daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit = kzalloc(sizeof(struct zfcp_unit), GFP_KERNEL); 139d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier if (!unit) { 140d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier retval = -ENOMEM; 141d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier goto out; 142d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier } 1431daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1441daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->port = port; 1451daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->fcp_lun = fcp_lun; 1461daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->dev.parent = &port->dev; 1471daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit->dev.release = zfcp_unit_release; 14886bdf218a717b77cb775b82ce48c7847cb72a86dSebastian Ott unit->dev.groups = zfcp_unit_attr_groups; 1491daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt INIT_WORK(&unit->scsi_work, zfcp_unit_scsi_scan_work); 1501daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1511daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (dev_set_name(&unit->dev, "0x%016llx", 1521daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt (unsigned long long) fcp_lun)) { 1531daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt kfree(unit); 154d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier retval = -ENOMEM; 155d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier goto out; 1561daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 1571daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1581daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (device_register(&unit->dev)) { 1591daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 160d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier retval = -ENOMEM; 161d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier goto out; 1621daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 1631daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 164d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier atomic_inc(&port->units); /* under zfcp_sysfs_port_units_mutex ! */ 165d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier 1661daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_lock_irq(&port->unit_list_lock); 1671daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt list_add_tail(&unit->list, &port->unit_list); 1681daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_unlock_irq(&port->unit_list_lock); 1691daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1701daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt zfcp_unit_scsi_scan(unit); 1711daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 172d99b601b63386f3395dc26a699ae703a273d9982Steffen Maierout: 173d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier mutex_unlock(&zfcp_sysfs_port_units_mutex); 174d99b601b63386f3395dc26a699ae703a273d9982Steffen Maier return retval; 1751daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 1761daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1771daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 1781daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_sdev - Return SCSI device for zfcp_unit 1791daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @unit: The zfcp_unit where to get the SCSI device for 1801daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 1811daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns: scsi_device pointer on success, NULL if there is no SCSI 1821daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * device for this zfcp_unit 1831daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 1841daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * On success, the caller also holds a reference to the SCSI device 1851daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * that must be released with scsi_device_put. 1861daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 1871daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittstruct scsi_device *zfcp_unit_sdev(struct zfcp_unit *unit) 1881daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 1891daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct Scsi_Host *shost; 1901daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_port *port; 1919cb78c16f5dadefd8dc5ba0ae5a2f26cd59419b3Hannes Reinecke u64 lun; 1921daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1931daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt lun = scsilun_to_int((struct scsi_lun *) &unit->fcp_lun); 1941daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt port = unit->port; 1951daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt shost = port->adapter->scsi_host; 1961daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return scsi_device_lookup(shost, 0, port->starget_id, lun); 1971daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 1981daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 1991daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 2001daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_sdev_status - Return zfcp LUN status for SCSI device 2011daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @unit: The unit to lookup the SCSI device for 2021daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 2031daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns the zfcp LUN status field of the SCSI device if the SCSI device 2041daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * for the zfcp_unit exists, 0 otherwise. 2051daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 2061daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittunsigned int zfcp_unit_sdev_status(struct zfcp_unit *unit) 2071daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 2081daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unsigned int status = 0; 2091daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct scsi_device *sdev; 2101daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_scsi_dev *zfcp_sdev; 2111daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2121daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt sdev = zfcp_unit_sdev(unit); 2131daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (sdev) { 2141daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt zfcp_sdev = sdev_to_zfcp(sdev); 2151daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt status = atomic_read(&zfcp_sdev->status); 2161daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_device_put(sdev); 2171daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 2181daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2191daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return status; 2201daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 2211daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2221daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt/** 2231daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * zfcp_unit_remove - Remove entry from list of configured units 2241daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @port: The port where to remove the unit from the configuration 2251daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * @fcp_lun: The 64 bit LUN of the unit to remove 2261daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 2271daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * Returns: -EINVAL if a unit with the specified LUN does not exist, 2281daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt * 0 on success. 2291daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt */ 2301daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmittint zfcp_unit_remove(struct zfcp_port *port, u64 fcp_lun) 2311daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt{ 2321daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct zfcp_unit *unit; 2331daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt struct scsi_device *sdev; 2341daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2351daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_lock_irq(&port->unit_list_lock); 2361daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt unit = _zfcp_unit_find(port, fcp_lun); 2371daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (unit) 2381daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt list_del(&unit->list); 2391daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt write_unlock_irq(&port->unit_list_lock); 2401daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2411daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (!unit) 2421daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return -EINVAL; 2431daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2441daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt sdev = zfcp_unit_sdev(unit); 2451daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt if (sdev) { 2461daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_remove_device(sdev); 2471daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt scsi_device_put(sdev); 2481daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt } 2491daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2501daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt put_device(&unit->dev); 2511daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 25286bdf218a717b77cb775b82ce48c7847cb72a86dSebastian Ott device_unregister(&unit->dev); 2531daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt 2541daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt return 0; 2551daa4eb50fa5cd4c8f9c55452606e786fd42053bChristof Schmitt} 256