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: [SCSI] mpt fusion: clear list of outstanding commands on host reset [SCSI] scsi_lib: only call scsi_unprep_request() under queue lock [SCSI] ibmvstgt: move crq_queue_create to the end of initialization [SCSI] libiscsi REGRESSION: fix passthrough support with older iscsi tools [SCSI] aacraid: disable Dell Percraid quirk on Adaptec 2200S and 2120S
This commit is contained in:
Коммит
9a1d103563
|
@ -2008,6 +2008,9 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)
|
||||||
return FAILED;
|
return FAILED;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* make sure we have no outstanding commands at this stage */
|
||||||
|
mptscsih_flush_running_cmds(hd);
|
||||||
|
|
||||||
ioc = hd->ioc;
|
ioc = hd->ioc;
|
||||||
printk(MYIOC_s_INFO_FMT "attempting host reset! (sc=%p)\n",
|
printk(MYIOC_s_INFO_FMT "attempting host reset! (sc=%p)\n",
|
||||||
ioc->name, SCpnt);
|
ioc->name, SCpnt);
|
||||||
|
|
|
@ -175,8 +175,8 @@ static struct aac_driver_ident aac_drivers[] = {
|
||||||
{ aac_rx_init, "percraid", "DELL ", "PERCRAID ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Boxster/PERC3DiB) */
|
{ aac_rx_init, "percraid", "DELL ", "PERCRAID ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* PERC 3/Di (Boxster/PERC3DiB) */
|
||||||
{ aac_rx_init, "aacraid", "ADAPTEC ", "catapult ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* catapult */
|
{ aac_rx_init, "aacraid", "ADAPTEC ", "catapult ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* catapult */
|
||||||
{ aac_rx_init, "aacraid", "ADAPTEC ", "tomcat ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* tomcat */
|
{ aac_rx_init, "aacraid", "ADAPTEC ", "tomcat ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* tomcat */
|
||||||
{ aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2120S ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2120S (Crusader) */
|
{ aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2120S ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Adaptec 2120S (Crusader) */
|
||||||
{ aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2200S ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan) */
|
{ aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2200S ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG }, /* Adaptec 2200S (Vulcan) */
|
||||||
{ aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2200S ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan-2m) */
|
{ aac_rx_init, "aacraid", "ADAPTEC ", "Adaptec 2200S ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Adaptec 2200S (Vulcan-2m) */
|
||||||
{ aac_rx_init, "aacraid", "Legend ", "Legend S220 ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S220 (Legend Crusader) */
|
{ aac_rx_init, "aacraid", "Legend ", "Legend S220 ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S220 (Legend Crusader) */
|
||||||
{ aac_rx_init, "aacraid", "Legend ", "Legend S230 ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S230 (Legend Vulcan) */
|
{ aac_rx_init, "aacraid", "Legend ", "Legend S230 ", 2, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* Legend S230 (Legend Vulcan) */
|
||||||
|
|
|
@ -864,21 +864,23 @@ static int ibmvstgt_probe(struct vio_dev *dev, const struct vio_device_id *id)
|
||||||
|
|
||||||
INIT_WORK(&vport->crq_work, handle_crq);
|
INIT_WORK(&vport->crq_work, handle_crq);
|
||||||
|
|
||||||
err = crq_queue_create(&vport->crq_queue, target);
|
err = scsi_add_host(shost, target->dev);
|
||||||
if (err)
|
if (err)
|
||||||
goto free_srp_target;
|
goto free_srp_target;
|
||||||
|
|
||||||
err = scsi_add_host(shost, target->dev);
|
|
||||||
if (err)
|
|
||||||
goto destroy_queue;
|
|
||||||
|
|
||||||
err = scsi_tgt_alloc_queue(shost);
|
err = scsi_tgt_alloc_queue(shost);
|
||||||
if (err)
|
if (err)
|
||||||
goto destroy_queue;
|
goto remove_host;
|
||||||
|
|
||||||
|
err = crq_queue_create(&vport->crq_queue, target);
|
||||||
|
if (err)
|
||||||
|
goto free_queue;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
destroy_queue:
|
free_queue:
|
||||||
crq_queue_destroy(target);
|
scsi_tgt_free_queue(shost);
|
||||||
|
remove_host:
|
||||||
|
scsi_remove_host(shost);
|
||||||
free_srp_target:
|
free_srp_target:
|
||||||
srp_target_free(target);
|
srp_target_free(target);
|
||||||
put_host:
|
put_host:
|
||||||
|
|
|
@ -489,12 +489,6 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
||||||
if (!__kfifo_get(session->cmdpool.queue,
|
if (!__kfifo_get(session->cmdpool.queue,
|
||||||
(void*)&task, sizeof(void*)))
|
(void*)&task, sizeof(void*)))
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
||||||
if ((hdr->opcode == (ISCSI_OP_NOOP_OUT | ISCSI_OP_IMMEDIATE)) &&
|
|
||||||
hdr->ttt == RESERVED_ITT) {
|
|
||||||
conn->ping_task = task;
|
|
||||||
conn->last_ping = jiffies;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* released in complete pdu for task we expect a response for, and
|
* released in complete pdu for task we expect a response for, and
|
||||||
|
@ -703,6 +697,11 @@ static void iscsi_send_nopout(struct iscsi_conn *conn, struct iscsi_nopin *rhdr)
|
||||||
task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0);
|
task = __iscsi_conn_send_pdu(conn, (struct iscsi_hdr *)&hdr, NULL, 0);
|
||||||
if (!task)
|
if (!task)
|
||||||
iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n");
|
iscsi_conn_printk(KERN_ERR, conn, "Could not send nopout\n");
|
||||||
|
else if (!rhdr) {
|
||||||
|
/* only track our nops */
|
||||||
|
conn->ping_task = task;
|
||||||
|
conn->last_ping = jiffies;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
static int iscsi_handle_reject(struct iscsi_conn *conn, struct iscsi_hdr *hdr,
|
||||||
|
|
|
@ -648,8 +648,8 @@ static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)
|
||||||
struct request *req = cmd->request;
|
struct request *req = cmd->request;
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
|
|
||||||
scsi_unprep_request(req);
|
|
||||||
spin_lock_irqsave(q->queue_lock, flags);
|
spin_lock_irqsave(q->queue_lock, flags);
|
||||||
|
scsi_unprep_request(req);
|
||||||
blk_requeue_request(q, req);
|
blk_requeue_request(q, req);
|
||||||
spin_unlock_irqrestore(q->queue_lock, flags);
|
spin_unlock_irqrestore(q->queue_lock, flags);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче