You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07: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: (53 commits) [SCSI] libosd: OSD2r05: on-the-wire changes for latest OSD2 revision 5. [SCSI] libosd: OSD2r05: OSD_CRYPTO_KEYID_SIZE will grow 20 => 32 bytes [SCSI] libosd: OSD2r05: Prepare for rev5 attribute list changes [SCSI] libosd: fix potential ERR_PTR dereference in osd_initiator.c [SCSI] mpt2sas : bump driver version to 01.100.02.00 [SCSI] mpt2sas: fix hotplug event processing [SCSI] mpt2sas : release diagnotic buffers prior host reset [SCSI] mpt2sas : Broadcast Primative AEN bug fix [SCSI] mpt2sas : Identify Dell series-7 adapters at driver load time [SCSI] mpt2sas : driver name needs to be in the MPT2IOCINFO ioctl [SCSI] mpt2sas : running out of message frames [SCSI] mpt2sas : fix oops when firmware sends large sense buffer size [SCSI] mpt2sas : the sanity check in base_interrupt needs to be on dword boundary [SCSI] mpt2sas : unique ioctl magic number [SCSI] fix sign extension with 1.5TB usb-storage LBD=y [SCSI] ipr: Fix sleeping function called with interrupts disabled [SCSI] fcoe: fip: add multicast filter to receive FIP advertisements. [SCSI] libfc: Fix compilation warnings with allmodconfig [SCSI] fcoe: fix spelling typos and bad comments [SCSI] fcoe: don't export functions that are internal to fcoe ...
This commit is contained in:
@@ -599,6 +599,7 @@ static struct scsi_host_template iscsi_iser_sht = {
|
||||
.eh_abort_handler = iscsi_eh_abort,
|
||||
.eh_device_reset_handler= iscsi_eh_device_reset,
|
||||
.eh_target_reset_handler= iscsi_eh_target_reset,
|
||||
.target_alloc = iscsi_target_alloc,
|
||||
.use_clustering = DISABLE_CLUSTERING,
|
||||
.proc_name = "iscsi_iser",
|
||||
.this_id = -1,
|
||||
|
||||
@@ -97,9 +97,7 @@ static void __init zfcp_init_device_configure(char *busid, u64 wwpn, u64 lun)
|
||||
ccw_device_set_online(adapter->ccw_device);
|
||||
|
||||
zfcp_erp_wait(adapter);
|
||||
wait_event(adapter->erp_done_wqh,
|
||||
!(atomic_read(&unit->status) &
|
||||
ZFCP_STATUS_UNIT_SCSI_WORK_PENDING));
|
||||
flush_work(&unit->scsi_work);
|
||||
|
||||
down(&zfcp_data.config_sema);
|
||||
zfcp_unit_put(unit);
|
||||
@@ -279,6 +277,7 @@ struct zfcp_unit *zfcp_unit_enqueue(struct zfcp_port *port, u64 fcp_lun)
|
||||
|
||||
atomic_set(&unit->refcount, 0);
|
||||
init_waitqueue_head(&unit->remove_wq);
|
||||
INIT_WORK(&unit->scsi_work, zfcp_scsi_scan);
|
||||
|
||||
unit->port = port;
|
||||
unit->fcp_lun = fcp_lun;
|
||||
@@ -525,6 +524,8 @@ int zfcp_adapter_enqueue(struct ccw_device *ccw_device)
|
||||
|
||||
atomic_clear_mask(ZFCP_STATUS_COMMON_REMOVE, &adapter->status);
|
||||
|
||||
zfcp_fc_nameserver_init(adapter);
|
||||
|
||||
if (!zfcp_adapter_scsi_register(adapter))
|
||||
return 0;
|
||||
|
||||
@@ -553,7 +554,6 @@ void zfcp_adapter_dequeue(struct zfcp_adapter *adapter)
|
||||
|
||||
cancel_work_sync(&adapter->scan_work);
|
||||
cancel_work_sync(&adapter->stat_work);
|
||||
cancel_delayed_work_sync(&adapter->nsp.work);
|
||||
zfcp_adapter_scsi_unregister(adapter);
|
||||
sysfs_remove_group(&adapter->ccw_device->dev.kobj,
|
||||
&zfcp_sysfs_adapter_attrs);
|
||||
@@ -671,8 +671,7 @@ void zfcp_port_dequeue(struct zfcp_port *port)
|
||||
list_del(&port->list);
|
||||
write_unlock_irq(&zfcp_data.config_lock);
|
||||
if (port->rport)
|
||||
fc_remote_port_delete(port->rport);
|
||||
port->rport = NULL;
|
||||
port->rport->dd_data = NULL;
|
||||
zfcp_adapter_put(port->adapter);
|
||||
sysfs_remove_group(&port->sysfs_device.kobj, &zfcp_sysfs_port_attrs);
|
||||
device_unregister(&port->sysfs_device);
|
||||
|
||||
@@ -108,7 +108,6 @@ static int zfcp_ccw_set_online(struct ccw_device *ccw_device)
|
||||
/* initialize request counter */
|
||||
BUG_ON(!zfcp_reqlist_isempty(adapter));
|
||||
adapter->req_no = 0;
|
||||
zfcp_fc_nameserver_init(adapter);
|
||||
|
||||
zfcp_erp_modify_adapter_status(adapter, "ccsonl1", NULL,
|
||||
ZFCP_STATUS_COMMON_RUNNING, ZFCP_SET);
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
* Userspace interface for accessing the
|
||||
* Access Control Lists / Control File Data Channel
|
||||
*
|
||||
* Copyright IBM Corporation 2008
|
||||
* Copyright IBM Corporation 2008, 2009
|
||||
*/
|
||||
|
||||
#define KMSG_COMPONENT "zfcp"
|
||||
@@ -197,6 +197,7 @@ static long zfcp_cfdc_dev_ioctl(struct file *file, unsigned int command,
|
||||
retval = -ENXIO;
|
||||
goto free_buffer;
|
||||
}
|
||||
zfcp_adapter_get(adapter);
|
||||
|
||||
retval = zfcp_cfdc_sg_setup(data->command, fsf_cfdc->sg,
|
||||
data_user->control_file);
|
||||
|
||||
@@ -255,7 +255,6 @@ enum zfcp_wka_status {
|
||||
/* logical unit status */
|
||||
#define ZFCP_STATUS_UNIT_SHARED 0x00000004
|
||||
#define ZFCP_STATUS_UNIT_READONLY 0x00000008
|
||||
#define ZFCP_STATUS_UNIT_SCSI_WORK_PENDING 0x00000020
|
||||
|
||||
/* FSF request status (this does not have a common part) */
|
||||
#define ZFCP_STATUS_FSFREQ_TASK_MANAGEMENT 0x00000002
|
||||
@@ -530,6 +529,7 @@ struct zfcp_unit {
|
||||
struct zfcp_erp_action erp_action; /* pending error recovery */
|
||||
atomic_t erp_counter;
|
||||
struct zfcp_latencies latencies;
|
||||
struct work_struct scsi_work;
|
||||
};
|
||||
|
||||
/* FSF request */
|
||||
|
||||
@@ -719,6 +719,7 @@ static void zfcp_erp_adapter_strategy_close(struct zfcp_erp_action *act)
|
||||
zfcp_qdio_close(adapter);
|
||||
zfcp_fsf_req_dismiss_all(adapter);
|
||||
adapter->fsf_req_seq_no = 0;
|
||||
zfcp_fc_wka_port_force_offline(&adapter->nsp);
|
||||
/* all ports and units are closed */
|
||||
zfcp_erp_modify_adapter_status(adapter, "erascl1", NULL,
|
||||
ZFCP_STATUS_COMMON_OPEN, ZFCP_CLEAR);
|
||||
@@ -1176,48 +1177,6 @@ static void zfcp_erp_action_dequeue(struct zfcp_erp_action *erp_action)
|
||||
}
|
||||
}
|
||||
|
||||
struct zfcp_erp_add_work {
|
||||
struct zfcp_unit *unit;
|
||||
struct work_struct work;
|
||||
};
|
||||
|
||||
static void zfcp_erp_scsi_scan(struct work_struct *work)
|
||||
{
|
||||
struct zfcp_erp_add_work *p =
|
||||
container_of(work, struct zfcp_erp_add_work, work);
|
||||
struct zfcp_unit *unit = p->unit;
|
||||
struct fc_rport *rport = unit->port->rport;
|
||||
|
||||
if (rport && rport->port_state == FC_PORTSTATE_ONLINE)
|
||||
scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
|
||||
scsilun_to_int((struct scsi_lun *)&unit->fcp_lun), 0);
|
||||
atomic_clear_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
|
||||
zfcp_unit_put(unit);
|
||||
wake_up(&unit->port->adapter->erp_done_wqh);
|
||||
kfree(p);
|
||||
}
|
||||
|
||||
static void zfcp_erp_schedule_work(struct zfcp_unit *unit)
|
||||
{
|
||||
struct zfcp_erp_add_work *p;
|
||||
|
||||
p = kzalloc(sizeof(*p), GFP_KERNEL);
|
||||
if (!p) {
|
||||
dev_err(&unit->port->adapter->ccw_device->dev,
|
||||
"Registering unit 0x%016Lx on port 0x%016Lx failed\n",
|
||||
(unsigned long long)unit->fcp_lun,
|
||||
(unsigned long long)unit->port->wwpn);
|
||||
return;
|
||||
}
|
||||
|
||||
zfcp_unit_get(unit);
|
||||
atomic_set_mask(ZFCP_STATUS_UNIT_SCSI_WORK_PENDING, &unit->status);
|
||||
INIT_WORK(&p->work, zfcp_erp_scsi_scan);
|
||||
p->unit = unit;
|
||||
if (!queue_work(zfcp_data.work_queue, &p->work))
|
||||
zfcp_unit_put(unit);
|
||||
}
|
||||
|
||||
static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
|
||||
{
|
||||
struct zfcp_adapter *adapter = act->adapter;
|
||||
@@ -1226,11 +1185,11 @@ static void zfcp_erp_action_cleanup(struct zfcp_erp_action *act, int result)
|
||||
|
||||
switch (act->action) {
|
||||
case ZFCP_ERP_ACTION_REOPEN_UNIT:
|
||||
flush_work(&port->rport_work);
|
||||
if ((result == ZFCP_ERP_SUCCEEDED) && !unit->device) {
|
||||
if (!(atomic_read(&unit->status) &
|
||||
ZFCP_STATUS_UNIT_SCSI_WORK_PENDING))
|
||||
zfcp_erp_schedule_work(unit);
|
||||
zfcp_unit_get(unit);
|
||||
if (scsi_queue_work(unit->port->adapter->scsi_host,
|
||||
&unit->scsi_work) <= 0)
|
||||
zfcp_unit_put(unit);
|
||||
}
|
||||
zfcp_unit_put(unit);
|
||||
break;
|
||||
@@ -1352,6 +1311,11 @@ static int zfcp_erp_thread(void *data)
|
||||
|
||||
while (!(atomic_read(&adapter->status) &
|
||||
ZFCP_STATUS_ADAPTER_ERP_THREAD_KILL)) {
|
||||
|
||||
zfcp_rec_dbf_event_thread_lock("erthrd1", adapter);
|
||||
ignore = down_interruptible(&adapter->erp_ready_sem);
|
||||
zfcp_rec_dbf_event_thread_lock("erthrd2", adapter);
|
||||
|
||||
write_lock_irqsave(&adapter->erp_lock, flags);
|
||||
next = adapter->erp_ready_head.next;
|
||||
write_unlock_irqrestore(&adapter->erp_lock, flags);
|
||||
@@ -1363,10 +1327,6 @@ static int zfcp_erp_thread(void *data)
|
||||
if (zfcp_erp_strategy(act) != ZFCP_ERP_DISMISSED)
|
||||
zfcp_erp_wakeup(adapter);
|
||||
}
|
||||
|
||||
zfcp_rec_dbf_event_thread_lock("erthrd1", adapter);
|
||||
ignore = down_interruptible(&adapter->erp_ready_sem);
|
||||
zfcp_rec_dbf_event_thread_lock("erthrd2", adapter);
|
||||
}
|
||||
|
||||
atomic_clear_mask(ZFCP_STATUS_ADAPTER_ERP_THREAD_UP, &adapter->status);
|
||||
|
||||
@@ -106,6 +106,7 @@ extern void zfcp_fc_plogi_evaluate(struct zfcp_port *, struct fsf_plogi *);
|
||||
extern void zfcp_test_link(struct zfcp_port *);
|
||||
extern void zfcp_fc_link_test_work(struct work_struct *);
|
||||
extern void zfcp_fc_nameserver_init(struct zfcp_adapter *);
|
||||
extern void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *);
|
||||
|
||||
/* zfcp_fsf.c */
|
||||
extern int zfcp_fsf_open_port(struct zfcp_erp_action *);
|
||||
@@ -158,6 +159,7 @@ extern void zfcp_scsi_rport_work(struct work_struct *);
|
||||
extern void zfcp_scsi_schedule_rport_register(struct zfcp_port *);
|
||||
extern void zfcp_scsi_schedule_rport_block(struct zfcp_port *);
|
||||
extern void zfcp_scsi_schedule_rports_block(struct zfcp_adapter *);
|
||||
extern void zfcp_scsi_scan(struct work_struct *);
|
||||
|
||||
/* zfcp_sysfs.c */
|
||||
extern struct attribute_group zfcp_sysfs_unit_attrs;
|
||||
|
||||
+16
-17
@@ -98,13 +98,6 @@ static void zfcp_wka_port_offline(struct work_struct *work)
|
||||
struct zfcp_wka_port *wka_port =
|
||||
container_of(dw, struct zfcp_wka_port, work);
|
||||
|
||||
/* Don't wait forvever. If the wka_port is too busy take it offline
|
||||
through a new call later */
|
||||
if (!wait_event_timeout(wka_port->completion_wq,
|
||||
atomic_read(&wka_port->refcount) == 0,
|
||||
HZ >> 1))
|
||||
return;
|
||||
|
||||
mutex_lock(&wka_port->mutex);
|
||||
if ((atomic_read(&wka_port->refcount) != 0) ||
|
||||
(wka_port->status != ZFCP_WKA_PORT_ONLINE))
|
||||
@@ -142,6 +135,14 @@ void zfcp_fc_nameserver_init(struct zfcp_adapter *adapter)
|
||||
INIT_DELAYED_WORK(&wka_port->work, zfcp_wka_port_offline);
|
||||
}
|
||||
|
||||
void zfcp_fc_wka_port_force_offline(struct zfcp_wka_port *wka)
|
||||
{
|
||||
cancel_delayed_work_sync(&wka->work);
|
||||
mutex_lock(&wka->mutex);
|
||||
wka->status = ZFCP_WKA_PORT_OFFLINE;
|
||||
mutex_unlock(&wka->mutex);
|
||||
}
|
||||
|
||||
static void _zfcp_fc_incoming_rscn(struct zfcp_fsf_req *fsf_req, u32 range,
|
||||
struct fcp_rscn_element *elem)
|
||||
{
|
||||
@@ -372,7 +373,8 @@ static void zfcp_fc_adisc_handler(unsigned long data)
|
||||
|
||||
if (adisc->els.status) {
|
||||
/* request rejected or timed out */
|
||||
zfcp_erp_port_forced_reopen(port, 0, "fcadh_1", NULL);
|
||||
zfcp_erp_port_forced_reopen(port, ZFCP_STATUS_COMMON_ERP_FAILED,
|
||||
"fcadh_1", NULL);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@@ -431,11 +433,6 @@ void zfcp_fc_link_test_work(struct work_struct *work)
|
||||
container_of(work, struct zfcp_port, test_link_work);
|
||||
int retval;
|
||||
|
||||
if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_UNBLOCKED)) {
|
||||
zfcp_port_put(port);
|
||||
return; /* port erp is running and will update rport status */
|
||||
}
|
||||
|
||||
zfcp_port_get(port);
|
||||
port->rport_task = RPORT_DEL;
|
||||
zfcp_scsi_rport_work(&port->rport_work);
|
||||
@@ -542,6 +539,9 @@ static void zfcp_validate_port(struct zfcp_port *port)
|
||||
{
|
||||
struct zfcp_adapter *adapter = port->adapter;
|
||||
|
||||
if (!(atomic_read(&port->status) & ZFCP_STATUS_COMMON_NOESC))
|
||||
return;
|
||||
|
||||
atomic_clear_mask(ZFCP_STATUS_COMMON_NOESC, &port->status);
|
||||
|
||||
if ((port->supported_classes != 0) ||
|
||||
@@ -602,10 +602,8 @@ static int zfcp_scan_eval_gpn_ft(struct zfcp_gpn_ft *gpn_ft, int max_entries)
|
||||
if (acc->wwpn == fc_host_port_name(adapter->scsi_host))
|
||||
continue;
|
||||
port = zfcp_get_port_by_wwpn(adapter, acc->wwpn);
|
||||
if (port) {
|
||||
zfcp_port_get(port);
|
||||
if (port)
|
||||
continue;
|
||||
}
|
||||
|
||||
port = zfcp_port_enqueue(adapter, acc->wwpn,
|
||||
ZFCP_STATUS_COMMON_NOESC, d_id);
|
||||
@@ -637,7 +635,8 @@ int zfcp_scan_ports(struct zfcp_adapter *adapter)
|
||||
max_entries = chain ? ZFCP_GPN_FT_MAX_ENTRIES : ZFCP_GPN_FT_ENTRIES;
|
||||
max_bytes = chain ? ZFCP_GPN_FT_MAX_SIZE : ZFCP_CT_SIZE_ONE_PAGE;
|
||||
|
||||
if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT)
|
||||
if (fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPORT &&
|
||||
fc_host_port_type(adapter->scsi_host) != FC_PORTTYPE_NPIV)
|
||||
return 0;
|
||||
|
||||
ret = zfcp_wka_port_get(&adapter->nsp);
|
||||
|
||||
@@ -172,12 +172,16 @@ static void zfcp_fsf_link_down_info_eval(struct zfcp_fsf_req *req, char *id,
|
||||
struct fsf_link_down_info *link_down)
|
||||
{
|
||||
struct zfcp_adapter *adapter = req->adapter;
|
||||
unsigned long flags;
|
||||
|
||||
if (atomic_read(&adapter->status) & ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED)
|
||||
return;
|
||||
|
||||
atomic_set_mask(ZFCP_STATUS_ADAPTER_LINK_UNPLUGGED, &adapter->status);
|
||||
|
||||
read_lock_irqsave(&zfcp_data.config_lock, flags);
|
||||
zfcp_scsi_schedule_rports_block(adapter);
|
||||
read_unlock_irqrestore(&zfcp_data.config_lock, flags);
|
||||
|
||||
if (!link_down)
|
||||
goto out;
|
||||
@@ -645,30 +649,30 @@ static void zfcp_fsf_exchange_port_data_handler(struct zfcp_fsf_req *req)
|
||||
}
|
||||
}
|
||||
|
||||
static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
|
||||
__releases(&adapter->req_q_lock)
|
||||
__acquires(&adapter->req_q_lock)
|
||||
static int zfcp_fsf_sbal_check(struct zfcp_adapter *adapter)
|
||||
{
|
||||
struct zfcp_qdio_queue *req_q = &adapter->req_q;
|
||||
|
||||
spin_lock_bh(&adapter->req_q_lock);
|
||||
if (atomic_read(&req_q->count))
|
||||
return 1;
|
||||
spin_unlock_bh(&adapter->req_q_lock);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int zfcp_fsf_req_sbal_get(struct zfcp_adapter *adapter)
|
||||
{
|
||||
long ret;
|
||||
|
||||
if (atomic_read(&req_q->count) <= -REQUEST_LIST_SIZE)
|
||||
return -EIO;
|
||||
if (atomic_read(&req_q->count) > 0)
|
||||
return 0;
|
||||
|
||||
atomic_dec(&req_q->count);
|
||||
spin_unlock_bh(&adapter->req_q_lock);
|
||||
ret = wait_event_interruptible_timeout(adapter->request_wq,
|
||||
atomic_read(&req_q->count) >= 0,
|
||||
5 * HZ);
|
||||
spin_lock_bh(&adapter->req_q_lock);
|
||||
atomic_inc(&req_q->count);
|
||||
|
||||
zfcp_fsf_sbal_check(adapter), 5 * HZ);
|
||||
if (ret > 0)
|
||||
return 0;
|
||||
if (!ret)
|
||||
atomic_inc(&adapter->qdio_outb_full);
|
||||
|
||||
spin_lock_bh(&adapter->req_q_lock);
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
@@ -766,8 +770,9 @@ static struct zfcp_fsf_req *zfcp_fsf_req_create(struct zfcp_adapter *adapter,
|
||||
static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
|
||||
{
|
||||
struct zfcp_adapter *adapter = req->adapter;
|
||||
unsigned long flags;
|
||||
int idx;
|
||||
unsigned long flags;
|
||||
int idx;
|
||||
int with_qtcb = (req->qtcb != NULL);
|
||||
|
||||
/* put allocated FSF request into hash table */
|
||||
spin_lock_irqsave(&adapter->req_list_lock, flags);
|
||||
@@ -789,7 +794,7 @@ static int zfcp_fsf_req_send(struct zfcp_fsf_req *req)
|
||||
}
|
||||
|
||||
/* Don't increase for unsolicited status */
|
||||
if (req->qtcb)
|
||||
if (with_qtcb)
|
||||
adapter->fsf_req_seq_no++;
|
||||
adapter->req_no++;
|
||||
|
||||
@@ -1253,13 +1258,13 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
|
||||
|
||||
spin_lock_bh(&adapter->req_q_lock);
|
||||
if (zfcp_fsf_req_sbal_get(adapter))
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
|
||||
req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_CONFIG_DATA,
|
||||
0, NULL);
|
||||
if (IS_ERR(req)) {
|
||||
retval = PTR_ERR(req);
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
sbale = zfcp_qdio_sbale_req(req);
|
||||
@@ -1278,14 +1283,16 @@ int zfcp_fsf_exchange_config_data_sync(struct zfcp_adapter *adapter,
|
||||
|
||||
zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
|
||||
retval = zfcp_fsf_req_send(req);
|
||||
out:
|
||||
spin_unlock_bh(&adapter->req_q_lock);
|
||||
if (!retval)
|
||||
wait_event(req->completion_wq,
|
||||
req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
|
||||
|
||||
zfcp_fsf_req_free(req);
|
||||
return retval;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_bh(&adapter->req_q_lock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
@@ -1352,13 +1359,13 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
|
||||
|
||||
spin_lock_bh(&adapter->req_q_lock);
|
||||
if (zfcp_fsf_req_sbal_get(adapter))
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
|
||||
req = zfcp_fsf_req_create(adapter, FSF_QTCB_EXCHANGE_PORT_DATA, 0,
|
||||
NULL);
|
||||
if (IS_ERR(req)) {
|
||||
retval = PTR_ERR(req);
|
||||
goto out;
|
||||
goto out_unlock;
|
||||
}
|
||||
|
||||
if (data)
|
||||
@@ -1371,14 +1378,18 @@ int zfcp_fsf_exchange_port_data_sync(struct zfcp_adapter *adapter,
|
||||
req->handler = zfcp_fsf_exchange_port_data_handler;
|
||||
zfcp_fsf_start_timer(req, ZFCP_FSF_REQUEST_TIMEOUT);
|
||||
retval = zfcp_fsf_req_send(req);
|
||||
out:
|
||||
spin_unlock_bh(&adapter->req_q_lock);
|
||||
|
||||
if (!retval)
|
||||
wait_event(req->completion_wq,
|
||||
req->status & ZFCP_STATUS_FSFREQ_COMPLETED);
|
||||
zfcp_fsf_req_free(req);
|
||||
|
||||
return retval;
|
||||
|
||||
out_unlock:
|
||||
spin_unlock_bh(&adapter->req_q_lock);
|
||||
return retval;
|
||||
}
|
||||
|
||||
static void zfcp_fsf_open_port_handler(struct zfcp_fsf_req *req)
|
||||
@@ -2472,8 +2483,6 @@ out:
|
||||
|
||||
static void zfcp_fsf_control_file_handler(struct zfcp_fsf_req *req)
|
||||
{
|
||||
if (req->qtcb->header.fsf_status != FSF_GOOD)
|
||||
req->status |= ZFCP_STATUS_FSFREQ_ERROR;
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -171,7 +171,7 @@ static int zfcp_scsi_eh_abort_handler(struct scsi_cmnd *scpnt)
|
||||
write_unlock_irqrestore(&adapter->abort_lock, flags);
|
||||
zfcp_scsi_dbf_event_abort("lte1", adapter, scpnt, NULL,
|
||||
old_req_id);
|
||||
return SUCCESS;
|
||||
return FAILED; /* completion could be in progress */
|
||||
}
|
||||
old_req->data = NULL;
|
||||
|
||||
@@ -486,10 +486,12 @@ static void zfcp_set_rport_dev_loss_tmo(struct fc_rport *rport, u32 timeout)
|
||||
*/
|
||||
static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
{
|
||||
struct zfcp_port *port = rport->dd_data;
|
||||
struct zfcp_port *port;
|
||||
|
||||
write_lock_irq(&zfcp_data.config_lock);
|
||||
port->rport = NULL;
|
||||
port = rport->dd_data;
|
||||
if (port)
|
||||
port->rport = NULL;
|
||||
write_unlock_irq(&zfcp_data.config_lock);
|
||||
}
|
||||
|
||||
@@ -503,9 +505,18 @@ static void zfcp_scsi_dev_loss_tmo_callbk(struct fc_rport *rport)
|
||||
*/
|
||||
static void zfcp_scsi_terminate_rport_io(struct fc_rport *rport)
|
||||
{
|
||||
struct zfcp_port *port = rport->dd_data;
|
||||
struct zfcp_port *port;
|
||||
|
||||
zfcp_erp_port_reopen(port, 0, "sctrpi1", NULL);
|
||||
write_lock_irq(&zfcp_data.config_lock);
|
||||
port = rport->dd_data;
|
||||
if (port)
|
||||
zfcp_port_get(port);
|
||||
write_unlock_irq(&zfcp_data.config_lock);
|
||||
|
||||
if (port) {
|
||||
zfcp_erp_port_reopen(port, 0, "sctrpi1", NULL);
|
||||
zfcp_port_put(port);
|
||||
}
|
||||
}
|
||||
|
||||
static void zfcp_scsi_rport_register(struct zfcp_port *port)
|
||||
@@ -534,8 +545,10 @@ static void zfcp_scsi_rport_register(struct zfcp_port *port)
|
||||
|
||||
static void zfcp_scsi_rport_block(struct zfcp_port *port)
|
||||
{
|
||||
if (port->rport)
|
||||
fc_remote_port_delete(port->rport);
|
||||
struct fc_rport *rport = port->rport;
|
||||
|
||||
if (rport)
|
||||
fc_remote_port_delete(rport);
|
||||
}
|
||||
|
||||
void zfcp_scsi_schedule_rport_register(struct zfcp_port *port)
|
||||
@@ -583,6 +596,23 @@ void zfcp_scsi_rport_work(struct work_struct *work)
|
||||
}
|
||||
|
||||
|
||||
void zfcp_scsi_scan(struct work_struct *work)
|
||||
{
|
||||
struct zfcp_unit *unit = container_of(work, struct zfcp_unit,
|
||||
scsi_work);
|
||||
struct fc_rport *rport;
|
||||
|
||||
flush_work(&unit->port->rport_work);
|
||||
rport = unit->port->rport;
|
||||
|
||||
if (rport && rport->port_state == FC_PORTSTATE_ONLINE)
|
||||
scsi_scan_target(&rport->dev, 0, rport->scsi_target_id,
|
||||
scsilun_to_int((struct scsi_lun *)
|
||||
&unit->fcp_lun), 0);
|
||||
|
||||
zfcp_unit_put(unit);
|
||||
}
|
||||
|
||||
struct fc_function_template zfcp_transport_functions = {
|
||||
.show_starget_port_id = 1,
|
||||
.show_starget_port_name = 1,
|
||||
|
||||
@@ -254,12 +254,21 @@ static ssize_t zfcp_sysfs_unit_remove_store(struct device *dev,
|
||||
|
||||
write_lock_irq(&zfcp_data.config_lock);
|
||||
unit = zfcp_get_unit_by_lun(port, fcp_lun);
|
||||
if (unit && (atomic_read(&unit->refcount) == 0)) {
|
||||
zfcp_unit_get(unit);
|
||||
atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE, &unit->status);
|
||||
list_move(&unit->list, &unit_remove_lh);
|
||||
} else
|
||||
unit = NULL;
|
||||
if (unit) {
|
||||
write_unlock_irq(&zfcp_data.config_lock);
|
||||
/* wait for possible timeout during SCSI probe */
|
||||
flush_work(&unit->scsi_work);
|
||||
write_lock_irq(&zfcp_data.config_lock);
|
||||
|
||||
if (atomic_read(&unit->refcount) == 0) {
|
||||
zfcp_unit_get(unit);
|
||||
atomic_set_mask(ZFCP_STATUS_COMMON_REMOVE,
|
||||
&unit->status);
|
||||
list_move(&unit->list, &unit_remove_lh);
|
||||
} else {
|
||||
unit = NULL;
|
||||
}
|
||||
}
|
||||
|
||||
write_unlock_irq(&zfcp_data.config_lock);
|
||||
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
#include "cxgb3i_offload.h"
|
||||
#include "cxgb3i_ddp.h"
|
||||
|
||||
#define CXGB3I_SCSI_QDEPTH_DFLT 128
|
||||
#define CXGB3I_SCSI_HOST_QDEPTH 1024
|
||||
#define CXGB3I_MAX_TARGET CXGB3I_MAX_CONN
|
||||
#define CXGB3I_MAX_LUN 512
|
||||
#define ISCSI_PDU_NONPAYLOAD_MAX \
|
||||
|
||||
@@ -120,20 +120,26 @@ static void clear_ddp_map(struct cxgb3i_ddp_info *ddp, unsigned int tag,
|
||||
}
|
||||
|
||||
static inline int ddp_find_unused_entries(struct cxgb3i_ddp_info *ddp,
|
||||
int start, int max, int count,
|
||||
unsigned int start, unsigned int max,
|
||||
unsigned int count,
|
||||
struct cxgb3i_gather_list *gl)
|
||||
{
|
||||
unsigned int i, j;
|
||||
unsigned int i, j, k;
|
||||
|
||||
/* not enough entries */
|
||||
if ((max - start) < count)
|
||||
return -EBUSY;
|
||||
|
||||
max -= count;
|
||||
spin_lock(&ddp->map_lock);
|
||||
for (i = start; i <= max;) {
|
||||
for (j = 0; j < count; j++) {
|
||||
if (ddp->gl_map[i + j])
|
||||
for (i = start; i < max;) {
|
||||
for (j = 0, k = i; j < count; j++, k++) {
|
||||
if (ddp->gl_map[k])
|
||||
break;
|
||||
}
|
||||
if (j == count) {
|
||||
for (j = 0; j < count; j++)
|
||||
ddp->gl_map[i + j] = gl;
|
||||
for (j = 0, k = i; j < count; j++, k++)
|
||||
ddp->gl_map[k] = gl;
|
||||
spin_unlock(&ddp->map_lock);
|
||||
return i;
|
||||
}
|
||||
@@ -354,7 +360,7 @@ int cxgb3i_ddp_tag_reserve(struct t3cdev *tdev, unsigned int tid,
|
||||
struct cxgb3i_ddp_info *ddp = tdev->ulp_iscsi;
|
||||
struct pagepod_hdr hdr;
|
||||
unsigned int npods;
|
||||
int idx = -1, idx_max;
|
||||
int idx = -1;
|
||||
int err = -ENOMEM;
|
||||
u32 sw_tag = *tagp;
|
||||
u32 tag;
|
||||
@@ -367,17 +373,17 @@ int cxgb3i_ddp_tag_reserve(struct t3cdev *tdev, unsigned int tid,
|
||||
}
|
||||
|
||||
npods = (gl->nelem + PPOD_PAGES_MAX - 1) >> PPOD_PAGES_SHIFT;
|
||||
idx_max = ddp->nppods - npods + 1;
|
||||
|
||||
if (ddp->idx_last == ddp->nppods)
|
||||
idx = ddp_find_unused_entries(ddp, 0, idx_max, npods, gl);
|
||||
idx = ddp_find_unused_entries(ddp, 0, ddp->nppods, npods, gl);
|
||||
else {
|
||||
idx = ddp_find_unused_entries(ddp, ddp->idx_last + 1,
|
||||
idx_max, npods, gl);
|
||||
if (idx < 0 && ddp->idx_last >= npods)
|
||||
ddp->nppods, npods, gl);
|
||||
if (idx < 0 && ddp->idx_last >= npods) {
|
||||
idx = ddp_find_unused_entries(ddp, 0,
|
||||
ddp->idx_last - npods + 1,
|
||||
min(ddp->idx_last + npods, ddp->nppods),
|
||||
npods, gl);
|
||||
}
|
||||
}
|
||||
if (idx < 0) {
|
||||
ddp_log_debug("xferlen %u, gl %u, npods %u NO DDP.\n",
|
||||
|
||||
@@ -876,13 +876,14 @@ static struct scsi_host_template cxgb3i_host_template = {
|
||||
.proc_name = "cxgb3i",
|
||||
.queuecommand = iscsi_queuecommand,
|
||||
.change_queue_depth = iscsi_change_queue_depth,
|
||||
.can_queue = CXGB3I_SCSI_QDEPTH_DFLT - 1,
|
||||
.can_queue = CXGB3I_SCSI_HOST_QDEPTH,
|
||||
.sg_tablesize = SG_ALL,
|
||||
.max_sectors = 0xFFFF,
|
||||
.cmd_per_lun = CXGB3I_SCSI_QDEPTH_DFLT,
|
||||
.cmd_per_lun = ISCSI_DEF_CMD_PER_LUN,
|
||||
.eh_abort_handler = iscsi_eh_abort,
|
||||
.eh_device_reset_handler = iscsi_eh_device_reset,
|
||||
.eh_target_reset_handler = iscsi_eh_target_reset,
|
||||
.target_alloc = iscsi_target_alloc,
|
||||
.use_clustering = DISABLE_CLUSTERING,
|
||||
.this_id = -1,
|
||||
};
|
||||
|
||||
@@ -1737,7 +1737,7 @@ int cxgb3i_c3cn_send_pdus(struct s3_conn *c3cn, struct sk_buff *skb)
|
||||
c3cn_tx_debug("c3cn 0x%p, snd %u - %u > %u.\n",
|
||||
c3cn, c3cn->write_seq, c3cn->snd_una,
|
||||
cxgb3_snd_win);
|
||||
err = -EAGAIN;
|
||||
err = -ENOBUFS;
|
||||
goto out_err;
|
||||
}
|
||||
|
||||
@@ -1775,6 +1775,8 @@ done:
|
||||
out_err:
|
||||
if (copied == 0 && err == -EPIPE)
|
||||
copied = c3cn->err ? c3cn->err : -EPIPE;
|
||||
else
|
||||
copied = err;
|
||||
goto done;
|
||||
}
|
||||
|
||||
|
||||
@@ -400,17 +400,18 @@ int cxgb3i_conn_xmit_pdu(struct iscsi_task *task)
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (err < 0 && err != -EAGAIN) {
|
||||
kfree_skb(skb);
|
||||
cxgb3i_tx_debug("itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
|
||||
task->itt, skb, skb->len, skb->data_len, err);
|
||||
iscsi_conn_printk(KERN_ERR, task->conn, "xmit err %d.\n", err);
|
||||
iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
|
||||
if (err == -EAGAIN || err == -ENOBUFS) {
|
||||
/* reset skb to send when we are called again */
|
||||
tdata->skb = skb;
|
||||
return err;
|
||||
}
|
||||
/* reset skb to send when we are called again */
|
||||
tdata->skb = skb;
|
||||
return -EAGAIN;
|
||||
|
||||
kfree_skb(skb);
|
||||
cxgb3i_tx_debug("itt 0x%x, skb 0x%p, len %u/%u, xmit err %d.\n",
|
||||
task->itt, skb, skb->len, skb->data_len, err);
|
||||
iscsi_conn_printk(KERN_ERR, task->conn, "xmit err %d.\n", err);
|
||||
iscsi_conn_failure(task->conn, ISCSI_ERR_XMIT_FAILED);
|
||||
return err;
|
||||
}
|
||||
|
||||
int cxgb3i_pdu_init(void)
|
||||
|
||||
+22
-37
@@ -57,7 +57,7 @@ DEFINE_RWLOCK(fcoe_hostlist_lock);
|
||||
DEFINE_TIMER(fcoe_timer, NULL, 0, 0);
|
||||
DEFINE_PER_CPU(struct fcoe_percpu_s, fcoe_percpu);
|
||||
|
||||
/* Function Prototyes */
|
||||
/* Function Prototypes */
|
||||
static int fcoe_reset(struct Scsi_Host *shost);
|
||||
static int fcoe_xmit(struct fc_lport *, struct fc_frame *);
|
||||
static int fcoe_rcv(struct sk_buff *, struct net_device *,
|
||||
@@ -138,7 +138,6 @@ static struct scsi_host_template fcoe_shost_template = {
|
||||
/**
|
||||
* fcoe_lport_config() - sets up the fc_lport
|
||||
* @lp: ptr to the fc_lport
|
||||
* @shost: ptr to the parent scsi host
|
||||
*
|
||||
* Returns: 0 for success
|
||||
*/
|
||||
@@ -256,6 +255,7 @@ static int fcoe_netdev_config(struct fc_lport *lp, struct net_device *netdev)
|
||||
rtnl_lock();
|
||||
memcpy(flogi_maddr, (u8[6]) FC_FCOE_FLOGI_MAC, ETH_ALEN);
|
||||
dev_unicast_add(fc->real_dev, flogi_maddr, ETH_ALEN);
|
||||
dev_mc_add(fc->real_dev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0);
|
||||
rtnl_unlock();
|
||||
|
||||
/*
|
||||
@@ -380,7 +380,7 @@ static int fcoe_if_destroy(struct net_device *netdev)
|
||||
dev_mc_delete(fc->real_dev, FIP_ALL_ENODE_MACS, ETH_ALEN, 0);
|
||||
rtnl_unlock();
|
||||
|
||||
/* Free the per-CPU revieve threads */
|
||||
/* Free the per-CPU receive threads */
|
||||
fcoe_percpu_clean(lp);
|
||||
|
||||
/* Free existing skbs */
|
||||
@@ -720,7 +720,7 @@ static void fcoe_percpu_thread_destroy(unsigned int cpu)
|
||||
}
|
||||
#else
|
||||
/*
|
||||
* This a non-SMP scenario where the singluar Rx thread is
|
||||
* This a non-SMP scenario where the singular Rx thread is
|
||||
* being removed. Free all skbs and stop the thread.
|
||||
*/
|
||||
spin_lock_bh(&p->fcoe_rx_list.lock);
|
||||
@@ -777,7 +777,7 @@ static struct notifier_block fcoe_cpu_notifier = {
|
||||
* @skb: the receive skb
|
||||
* @dev: associated net device
|
||||
* @ptype: context
|
||||
* @odldev: last device
|
||||
* @olddev: last device
|
||||
*
|
||||
* this function will receive the packet and build fc frame and pass it up
|
||||
*
|
||||
@@ -884,7 +884,6 @@ err2:
|
||||
kfree_skb(skb);
|
||||
return -1;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_rcv);
|
||||
|
||||
/**
|
||||
* fcoe_start_io() - pass to netdev to start xmit for fcoe
|
||||
@@ -905,7 +904,7 @@ static inline int fcoe_start_io(struct sk_buff *skb)
|
||||
}
|
||||
|
||||
/**
|
||||
* fcoe_get_paged_crc_eof() - in case we need alloc a page for crc_eof
|
||||
* fcoe_get_paged_crc_eof() - in case we need to alloc a page for crc_eof
|
||||
* @skb: the skb to be xmitted
|
||||
* @tlen: total len
|
||||
*
|
||||
@@ -947,7 +946,7 @@ static int fcoe_get_paged_crc_eof(struct sk_buff *skb, int tlen)
|
||||
|
||||
/**
|
||||
* fcoe_fc_crc() - calculates FC CRC in this fcoe skb
|
||||
* @fp: the fc_frame containg data to be checksummed
|
||||
* @fp: the fc_frame containing data to be checksummed
|
||||
*
|
||||
* This uses crc32() to calculate the crc for fc frame
|
||||
* Return : 32 bit crc
|
||||
@@ -1011,7 +1010,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
|
||||
wlen = skb->len / FCOE_WORD_TO_BYTE;
|
||||
|
||||
if (!lp->link_up) {
|
||||
kfree(skb);
|
||||
kfree_skb(skb);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -1062,7 +1061,7 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
|
||||
cp = NULL;
|
||||
}
|
||||
|
||||
/* adjust skb netowrk/transport offsets to match mac/fcoe/fc */
|
||||
/* adjust skb network/transport offsets to match mac/fcoe/fc */
|
||||
skb_push(skb, elen + hlen);
|
||||
skb_reset_mac_header(skb);
|
||||
skb_reset_network_header(skb);
|
||||
@@ -1123,7 +1122,6 @@ int fcoe_xmit(struct fc_lport *lp, struct fc_frame *fp)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_xmit);
|
||||
|
||||
/**
|
||||
* fcoe_percpu_receive_thread() - recv thread per cpu
|
||||
@@ -1296,17 +1294,16 @@ void fcoe_watchdog(ulong vp)
|
||||
|
||||
|
||||
/**
|
||||
* fcoe_check_wait_queue() - put the skb into fcoe pending xmit queue
|
||||
* @lp: the fc_port for this skb
|
||||
* @skb: the associated skb to be xmitted
|
||||
* fcoe_check_wait_queue() - attempt to clear the transmit backlog
|
||||
* @lp: the fc_lport
|
||||
*
|
||||
* This empties the wait_queue, dequeue the head of the wait_queue queue
|
||||
* and calls fcoe_start_io() for each packet, if all skb have been
|
||||
* transmitted, return qlen or -1 if a error occurs, then restore
|
||||
* wait_queue and try again later.
|
||||
* wait_queue and try again later.
|
||||
*
|
||||
* The wait_queue is used when the skb transmit fails. skb will go
|
||||
* in the wait_queue which will be emptied by the time function OR
|
||||
* in the wait_queue which will be emptied by the timer function or
|
||||
* by the next skb transmit.
|
||||
*
|
||||
* Returns: 0 for success
|
||||
@@ -1355,10 +1352,6 @@ out:
|
||||
*/
|
||||
static void fcoe_dev_setup()
|
||||
{
|
||||
/*
|
||||
* here setup a interface specific wd time to
|
||||
* monitor the link state
|
||||
*/
|
||||
register_netdevice_notifier(&fcoe_notifier);
|
||||
}
|
||||
|
||||
@@ -1437,10 +1430,9 @@ out:
|
||||
|
||||
/**
|
||||
* fcoe_if_to_netdev() - parse a name buffer to get netdev
|
||||
* @ifname: fixed array for output parsed ifname
|
||||
* @buffer: incoming buffer to be copied
|
||||
*
|
||||
* Returns: NULL or ptr to netdeive
|
||||
* Returns: NULL or ptr to net_device
|
||||
*/
|
||||
static struct net_device *fcoe_if_to_netdev(const char *buffer)
|
||||
{
|
||||
@@ -1458,7 +1450,7 @@ static struct net_device *fcoe_if_to_netdev(const char *buffer)
|
||||
}
|
||||
|
||||
/**
|
||||
* fcoe_netdev_to_module_owner() - finds out the nic drive moddule of the netdev
|
||||
* fcoe_netdev_to_module_owner() - finds out the driver module of the netdev
|
||||
* @netdev: the target netdev
|
||||
*
|
||||
* Returns: ptr to the struct module, NULL for failure
|
||||
@@ -1488,7 +1480,7 @@ fcoe_netdev_to_module_owner(const struct net_device *netdev)
|
||||
* Holds the Ethernet driver module by try_module_get() for
|
||||
* the corresponding netdev.
|
||||
*
|
||||
* Returns: 0 for succsss
|
||||
* Returns: 0 for success
|
||||
*/
|
||||
static int fcoe_ethdrv_get(const struct net_device *netdev)
|
||||
{
|
||||
@@ -1510,7 +1502,7 @@ static int fcoe_ethdrv_get(const struct net_device *netdev)
|
||||
* Releases the Ethernet driver module by module_put for
|
||||
* the corresponding netdev.
|
||||
*
|
||||
* Returns: 0 for succsss
|
||||
* Returns: 0 for success
|
||||
*/
|
||||
static int fcoe_ethdrv_put(const struct net_device *netdev)
|
||||
{
|
||||
@@ -1528,7 +1520,7 @@ static int fcoe_ethdrv_put(const struct net_device *netdev)
|
||||
|
||||
/**
|
||||
* fcoe_destroy() - handles the destroy from sysfs
|
||||
* @buffer: expcted to be a eth if name
|
||||
* @buffer: expected to be an eth if name
|
||||
* @kp: associated kernel param
|
||||
*
|
||||
* Returns: 0 for success
|
||||
@@ -1565,7 +1557,7 @@ out_nodev:
|
||||
|
||||
/**
|
||||
* fcoe_create() - Handles the create call from sysfs
|
||||
* @buffer: expcted to be a eth if name
|
||||
* @buffer: expected to be an eth if name
|
||||
* @kp: associated kernel param
|
||||
*
|
||||
* Returns: 0 for success
|
||||
@@ -1652,7 +1644,6 @@ int fcoe_link_ok(struct fc_lport *lp)
|
||||
|
||||
return rc;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_link_ok);
|
||||
|
||||
/**
|
||||
* fcoe_percpu_clean() - Clear the pending skbs for an lport
|
||||
@@ -1684,7 +1675,6 @@ void fcoe_percpu_clean(struct fc_lport *lp)
|
||||
spin_unlock_bh(&pp->fcoe_rx_list.lock);
|
||||
}
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_percpu_clean);
|
||||
|
||||
/**
|
||||
* fcoe_clean_pending_queue() - Dequeue a skb and free it
|
||||
@@ -1705,7 +1695,6 @@ void fcoe_clean_pending_queue(struct fc_lport *lp)
|
||||
}
|
||||
spin_unlock_bh(&fc->fcoe_pending_queue.lock);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_clean_pending_queue);
|
||||
|
||||
/**
|
||||
* fcoe_reset() - Resets the fcoe
|
||||
@@ -1719,11 +1708,10 @@ int fcoe_reset(struct Scsi_Host *shost)
|
||||
fc_lport_reset(lport);
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_reset);
|
||||
|
||||
/**
|
||||
* fcoe_hostlist_lookup_softc() - find the corresponding lport by a given device
|
||||
* @device: this is currently ptr to net_device
|
||||
* @dev: this is currently ptr to net_device
|
||||
*
|
||||
* Returns: NULL or the located fcoe_softc
|
||||
*/
|
||||
@@ -1757,11 +1745,10 @@ struct fc_lport *fcoe_hostlist_lookup(const struct net_device *netdev)
|
||||
|
||||
return (fc) ? fc->ctlr.lp : NULL;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_hostlist_lookup);
|
||||
|
||||
/**
|
||||
* fcoe_hostlist_add() - Add a lport to lports list
|
||||
* @lp: ptr to the fc_lport to badded
|
||||
* @lp: ptr to the fc_lport to be added
|
||||
*
|
||||
* Returns: 0 for success
|
||||
*/
|
||||
@@ -1778,11 +1765,10 @@ int fcoe_hostlist_add(const struct fc_lport *lp)
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_hostlist_add);
|
||||
|
||||
/**
|
||||
* fcoe_hostlist_remove() - remove a lport from lports list
|
||||
* @lp: ptr to the fc_lport to badded
|
||||
* @lp: ptr to the fc_lport to be removed
|
||||
*
|
||||
* Returns: 0 for success
|
||||
*/
|
||||
@@ -1798,7 +1784,6 @@ int fcoe_hostlist_remove(const struct fc_lport *lp)
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(fcoe_hostlist_remove);
|
||||
|
||||
/**
|
||||
* fcoe_init() - fcoe module loading initialization
|
||||
|
||||
@@ -122,7 +122,7 @@ static void fcoe_ctlr_reset_fcfs(struct fcoe_ctlr *fip)
|
||||
}
|
||||
|
||||
/**
|
||||
* fcoe_ctrl_destroy() - Disable and tear-down the FCoE controller.
|
||||
* fcoe_ctlr_destroy() - Disable and tear-down the FCoE controller.
|
||||
* @fip: FCoE controller.
|
||||
*
|
||||
* This is called by FCoE drivers before freeing the &fcoe_ctlr.
|
||||
|
||||
+9
-4
@@ -3654,6 +3654,7 @@ static int ipr_slave_configure(struct scsi_device *sdev)
|
||||
{
|
||||
struct ipr_ioa_cfg *ioa_cfg = (struct ipr_ioa_cfg *) sdev->host->hostdata;
|
||||
struct ipr_resource_entry *res;
|
||||
struct ata_port *ap = NULL;
|
||||
unsigned long lock_flags = 0;
|
||||
|
||||
spin_lock_irqsave(ioa_cfg->host->host_lock, lock_flags);
|
||||
@@ -3672,12 +3673,16 @@ static int ipr_slave_configure(struct scsi_device *sdev)
|
||||
}
|
||||
if (ipr_is_vset_device(res) || ipr_is_scsi_disk(res))
|
||||
sdev->allow_restart = 1;
|
||||
if (ipr_is_gata(res) && res->sata_port) {
|
||||
if (ipr_is_gata(res) && res->sata_port)
|
||||
ap = res->sata_port->ap;
|
||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
||||
|
||||
if (ap) {
|
||||
scsi_adjust_queue_depth(sdev, 0, IPR_MAX_CMD_PER_ATA_LUN);
|
||||
ata_sas_slave_configure(sdev, res->sata_port->ap);
|
||||
} else {
|
||||
ata_sas_slave_configure(sdev, ap);
|
||||
} else
|
||||
scsi_adjust_queue_depth(sdev, 0, sdev->host->cmd_per_lun);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
spin_unlock_irqrestore(ioa_cfg->host->host_lock, lock_flags);
|
||||
return 0;
|
||||
|
||||
@@ -463,7 +463,7 @@ static int iscsi_sw_tcp_pdu_init(struct iscsi_task *task,
|
||||
}
|
||||
|
||||
if (err) {
|
||||
iscsi_conn_failure(conn, err);
|
||||
/* got invalid offset/len */
|
||||
return -EIO;
|
||||
}
|
||||
return 0;
|
||||
@@ -851,6 +851,7 @@ static struct scsi_host_template iscsi_sw_tcp_sht = {
|
||||
.use_clustering = DISABLE_CLUSTERING,
|
||||
.slave_alloc = iscsi_sw_tcp_slave_alloc,
|
||||
.slave_configure = iscsi_sw_tcp_slave_configure,
|
||||
.target_alloc = iscsi_target_alloc,
|
||||
.proc_name = "iscsi_tcp",
|
||||
.this_id = -1,
|
||||
};
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user