mirror of
https://github.com/BobTheBlinker/android_kernel_motorola_sm6375.git
synced 2026-10-30 19:51:31 -04:00
Merge git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6
* git://git.kernel.org/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6: (34 commits) [SCSI] qla2xxx: Fix NULL ptr deref bug in fail path during queue create [SCSI] st: fix possible memory use after free after MTSETBLK ioctl [SCSI] be2iscsi: Moving to pci_pools v3 [SCSI] libiscsi: iscsi_session_setup to allow for private space [SCSI] be2iscsi: add 10Gbps iSCSI - BladeEngine 2 driver [SCSI] zfcp: Fix hang when offlining device with offline chpid [SCSI] zfcp: Fix lockdep warning when offlining device with offline chpid [SCSI] zfcp: Fix oops during shutdown of offline device [SCSI] zfcp: Fix initial device and cfdc for delayed adapter allocation [SCSI] zfcp: correctly initialize unchained requests [SCSI] mpt2sas: Bump version 02.100.03.00 [SCSI] mpt2sas: Support dev remove when phy status is MPI2_EVENT_SAS_TOPO_PHYSTATUS_VACANT [SCSI] mpt2sas: Timeout occurred within the HANDSHAKE logic while waiting on firmware to ACK. [SCSI] mpt2sas: Call init_completion on a per request basis. [SCSI] mpt2sas: Target Reset will be issued from Interrupt context. [SCSI] mpt2sas: Added SCSIIO, Internal and high priority memory pools to support multiple TM [SCSI] mpt2sas: Copyright change to 2009. [SCSI] mpt2sas: Added mpi2_history.txt for MPI2 headers. [SCSI] mpt2sas: Update driver to MPI2 REV K headers. [SCSI] bfa: Brocade BFA FC SCSI driver ...
This commit is contained in:
commit
69585dd69e
259 changed files with 58442 additions and 666 deletions
|
|
@ -80,28 +80,35 @@ int zfcp_reqlist_isempty(struct zfcp_adapter *adapter)
|
|||
|
||||
static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun)
|
||||
{
|
||||
struct ccw_device *ccwdev;
|
||||
struct zfcp_adapter *adapter;
|
||||
struct zfcp_port *port;
|
||||
struct zfcp_unit *unit;
|
||||
|
||||
mutex_lock(&zfcp_data.config_mutex);
|
||||
read_lock_irq(&zfcp_data.config_lock);
|
||||
adapter = zfcp_get_adapter_by_busid(busid);
|
||||
if (adapter)
|
||||
zfcp_adapter_get(adapter);
|
||||
read_unlock_irq(&zfcp_data.config_lock);
|
||||
ccwdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
|
||||
if (!ccwdev)
|
||||
return;
|
||||
|
||||
if (ccw_device_set_online(ccwdev))
|
||||
goto out_ccwdev;
|
||||
|
||||
mutex_lock(&zfcp_data.config_mutex);
|
||||
adapter = dev_get_drvdata(&ccwdev->dev);
|
||||
if (!adapter)
|
||||
goto out_adapter;
|
||||
port = zfcp_port_enqueue(adapter, wwpn, 0, 0);
|
||||
if (IS_ERR(port))
|
||||
goto out_unlock;
|
||||
zfcp_adapter_get(adapter);
|
||||
|
||||
port = zfcp_get_port_by_wwpn(adapter, wwpn);
|
||||
if (!port)
|
||||
goto out_port;
|
||||
|
||||
zfcp_port_get(port);
|
||||
unit = zfcp_unit_enqueue(port, lun);
|
||||
if (IS_ERR(unit))
|
||||
goto out_unit;
|
||||
mutex_unlock(&zfcp_data.config_mutex);
|
||||
ccw_device_set_online(adapter->ccw_device);
|
||||
|
||||
zfcp_erp_unit_reopen(unit, 0, "auidc_1", NULL);
|
||||
zfcp_erp_wait(adapter);
|
||||
flush_work(&unit->scsi_work);
|
||||
|
||||
|
|
@ -111,8 +118,10 @@ out_unit:
|
|||
zfcp_port_put(port);
|
||||
out_port:
|
||||
zfcp_adapter_put(adapter);
|
||||
out_adapter:
|
||||
out_unlock:
|
||||
mutex_unlock(&zfcp_data.config_mutex);
|
||||
out_ccwdev:
|
||||
put_device(&ccwdev->dev);
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
@ -593,10 +602,8 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
|
|||
int retval = 0;
|
||||
unsigned long flags;
|
||||
|
||||
cancel_work_sync(&adapter->scan_work);
|
||||
cancel_work_sync(&adapter->stat_work);
|
||||
zfcp_fc_wka_ports_force_offline(adapter->gs);
|
||||
zfcp_adapter_scsi_unregister(adapter);
|
||||
sysfs_remove_group(&adapter->ccw_device->dev.kobj,
|
||||
&zfcp_sysfs_adapter_attrs);
|
||||
dev_set_drvdata(&adapter->ccw_device->dev, NULL);
|
||||
|
|
|
|||
|
|
@ -102,6 +102,14 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device)
|
|||
adapter = dev_get_drvdata(&ccw_device->dev);
|
||||
if (!adapter)
|
||||
goto out;
|
||||
mutex_unlock(&zfcp_data.config_mutex);
|
||||
|
||||
cancel_work_sync(&adapter->scan_work);
|
||||
|
||||
mutex_lock(&zfcp_data.config_mutex);
|
||||
|
||||
/* this also removes the scsi devices, so call it first */
|
||||
zfcp_adapter_scsi_unregister(adapter);
|
||||
|
||||
write_lock_irq(&zfcp_data.config_lock);
|
||||
list_for_each_entry_safe(port, p, &adapter->port_list_head, list) {
|
||||
|
|
@ -117,11 +125,8 @@ static void zfcp_ccw_remove(struct ccw_device *ccw_device)
|
|||
write_unlock_irq(&zfcp_data.config_lock);
|
||||
|
||||
list_for_each_entry_safe(port, p, &port_remove_lh, list) {
|
||||
list_for_each_entry_safe(unit, u, &unit_remove_lh, list) {
|
||||
if (unit->device)
|
||||
scsi_remove_device(unit->device);
|
||||
list_for_each_entry_safe(unit, u, &unit_remove_lh, list)
|
||||
zfcp_unit_dequeue(unit);
|
||||
}
|
||||
zfcp_port_dequeue(port);
|
||||
}
|
||||
wait_event(adapter->remove_wq, atomic_read(&adapter->refcount) == 0);
|
||||
|
|
@ -192,13 +197,9 @@ static int zfcp_ccw_set_offline(struct ccw_device *ccw_device)
|
|||
|
||||
mutex_lock(&zfcp_data.config_mutex);
|
||||
adapter = dev_get_drvdata(&ccw_device->dev);
|
||||
if (!adapter)
|
||||
goto out;
|
||||
|
||||
zfcp_erp_adapter_shutdown(adapter, 0, "ccsoff1", NULL);
|
||||
zfcp_erp_wait(adapter);
|
||||
mutex_unlock(&zfcp_data.config_mutex);
|
||||
out:
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
|
@ -253,13 +254,17 @@ static void zfcp_ccw_shutdown(struct ccw_device *cdev)
|
|||
|
||||
mutex_lock(&zfcp_data.config_mutex);
|
||||
adapter = dev_get_drvdata(&cdev->dev);
|
||||
if (!adapter)
|
||||
goto out;
|
||||
|
||||
zfcp_erp_adapter_shutdown(adapter, 0, "ccshut1", NULL);
|
||||
zfcp_erp_wait(adapter);
|
||||
zfcp_erp_thread_kill(adapter);
|
||||
out:
|
||||
mutex_unlock(&zfcp_data.config_mutex);
|
||||
}
|
||||
|
||||
static struct ccw_driver zfcp_ccw_driver = {
|
||||
struct ccw_driver zfcp_ccw_driver = {
|
||||
.owner = THIS_MODULE,
|
||||
.name = "zfcp",
|
||||
.ids = zfcp_ccw_device_id,
|
||||
|
|
@ -284,20 +289,3 @@ int __init zfcp_ccw_register(void)
|
|||
{
|
||||
return ccw_driver_register(&zfcp_ccw_driver);
|
||||
}
|
||||
|
||||
/**
|
||||
* zfcp_get_adapter_by_busid - find zfcp_adapter struct
|
||||
* @busid: bus id string of zfcp adapter to find
|
||||
*/
|
||||
struct zfcp_adapter *zfcp_get_adapter_by_busid(char *busid)
|
||||
{
|
||||
struct ccw_device *ccw_device;
|
||||
struct zfcp_adapter *adapter = NULL;
|
||||
|
||||
ccw_device = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
|
||||
if (ccw_device) {
|
||||
adapter = dev_get_drvdata(&ccw_device->dev);
|
||||
put_device(&ccw_device->dev);
|
||||
}
|
||||
return adapter;
|
||||
}
|
||||
|
|
|
|||
|
|
@ -86,8 +86,23 @@ static int zfcp_cfdc_copy_to_user(void __user *user_buffer,
|
|||
static struct zfcp_adapter *zfcp_cfdc_get_adapter(u32 devno)
|
||||
{
|
||||
char busid[9];
|
||||
struct ccw_device *ccwdev;
|
||||
struct zfcp_adapter *adapter = NULL;
|
||||
|
||||
snprintf(busid, sizeof(busid), "0.0.%04x", devno);
|
||||
return zfcp_get_adapter_by_busid(busid);
|
||||
ccwdev = get_ccwdev_by_busid(&zfcp_ccw_driver, busid);
|
||||
if (!ccwdev)
|
||||
goto out;
|
||||
|
||||
adapter = dev_get_drvdata(&ccwdev->dev);
|
||||
if (!adapter)
|
||||
goto out_put;
|
||||
|
||||
zfcp_adapter_get(adapter);
|
||||
out_put:
|
||||
put_device(&ccwdev->dev);
|
||||
out:
|
||||
return adapter;
|
||||
}
|
||||
|
||||
static int zfcp_cfdc_set_fsf(struct zfcp_fsf_cfdc *fsf_cfdc, int command)
|
||||
|
|
|
|||
|
|
@ -28,7 +28,7 @@ extern int zfcp_sg_setup_table(struct scatterlist *, int);
|
|||
/* zfcp_ccw.c */
|
||||
extern int zfcp_ccw_register(void);
|
||||
extern int zfcp_ccw_priv_sch(struct zfcp_adapter *);
|
||||
extern struct zfcp_adapter *zfcp_get_adapter_by_busid(char *);
|
||||
extern struct ccw_driver zfcp_ccw_driver;
|
||||
|
||||
/* zfcp_cfdc.c */
|
||||
extern struct miscdevice zfcp_cfdc_misc;
|
||||
|
|
|
|||
|
|
@ -1058,11 +1058,25 @@ static int zfcp_fsf_setup_ct_els_sbals(struct zfcp_fsf_req *req,
|
|||
bytes = zfcp_qdio_sbals_from_sg(adapter->qdio, &req->queue_req,
|
||||
SBAL_FLAGS0_TYPE_WRITE_READ,
|
||||
sg_resp, max_sbals);
|
||||
req->qtcb->bottom.support.resp_buf_length = bytes;
|
||||
if (bytes <= 0)
|
||||
return -EIO;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int zfcp_fsf_setup_ct_els(struct zfcp_fsf_req *req,
|
||||
struct scatterlist *sg_req,
|
||||
struct scatterlist *sg_resp,
|
||||
int max_sbals)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = zfcp_fsf_setup_ct_els_sbals(req, sg_req, sg_resp, max_sbals);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/* common settings for ct/gs and els requests */
|
||||
req->qtcb->bottom.support.resp_buf_length = bytes;
|
||||
req->qtcb->bottom.support.service_class = FSF_CLASS_3;
|
||||
req->qtcb->bottom.support.timeout = 2 * R_A_TOV;
|
||||
zfcp_fsf_start_timer(req, 2 * R_A_TOV + 10);
|
||||
|
|
@ -1094,8 +1108,8 @@ int zfcp_fsf_send_ct(struct zfcp_send_ct *ct, mempool_t *pool)
|
|||
}
|
||||
|
||||
req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
|
||||
ret = zfcp_fsf_setup_ct_els_sbals(req, ct->req, ct->resp,
|
||||
FSF_MAX_SBALS_PER_REQ);
|
||||
ret = zfcp_fsf_setup_ct_els(req, ct->req, ct->resp,
|
||||
FSF_MAX_SBALS_PER_REQ);
|
||||
if (ret)
|
||||
goto failed_send;
|
||||
|
||||
|
|
@ -1192,7 +1206,7 @@ int zfcp_fsf_send_els(struct zfcp_send_els *els)
|
|||
}
|
||||
|
||||
req->status |= ZFCP_STATUS_FSFREQ_CLEANUP;
|
||||
ret = zfcp_fsf_setup_ct_els_sbals(req, els->req, els->resp, 2);
|
||||
ret = zfcp_fsf_setup_ct_els(req, els->req, els->resp, 2);
|
||||
|
||||
if (ret)
|
||||
goto failed_send;
|
||||
|
|
|
|||
Loading…
Reference in a new issue