SCSI bug fixes for 2.6.28-rc9
Subsystems (5)
James Bottomley
maintainerPATCH 1/1 SCSI bug fixes for 2.6.28-rc9
These should hopefully address the major bugzilla issues in SCSI. They fix several oopses, including the remaining block timer related ones. The patch is available here:
master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
The short changelog is:
Brian King (1):
ibmvstgt: move crq_queue_create to the end of initialization
Hillier, Gernot (1):
aacraid: disable Dell Percraid quirk on Adaptec 2200S and 2120S
James Bottomley (2):
mpt fusion: clear list of outstanding commands on host reset
scsi_lib: only call scsi_unprep_request() under queue lock
Mike Christie (1):
libiscsi REGRESSION: fix passthrough support with older iscsi tools
The diffstat:
drivers/message/fusion/mptscsih.c | 3 +++ drivers/scsi/aacraid/linit.c | 4 ++-- drivers/scsi/ibmvscsi/ibmvstgt.c | 16 +++++++++------- drivers/scsi/libiscsi.c | 11 +++++------ drivers/scsi/scsi_lib.c | 2 +- 5 files changed, 20 insertions(+), 16 deletions(-)
and the full diff is below.
James
---
drivers/message/fusion/mptscsih.c +3 -0
@@ -2008,6 +2008,9 @@ mptscsih_host_reset(struct scsi_cmnd *SCpnt)return FAILED ; } +/* make sure we have no outstanding commands at this stage */ +mptscsih_flush_running_cmds (hd); + ioc = hd->ioc;printk (MYIOC_s_INFO_FMT"attempting host reset! (sc=%p)\n" , ioc->name, SCpnt);
drivers/scsi/aacraid/linit.c +2 -2
@@ -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, "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 ", "Adaptec 2120S ", 1, AAC_QUIRK_31BIT | AAC_QUIRK_34SG | AAC_QUIRK_SCSI_32 }, /* 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 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 }, /* 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", "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) */
drivers/scsi/ibmvscsi/ibmvstgt.c +9 -7
@@ -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); - err =crq_queue_create (&vport->crq_queue, target); + err =scsi_add_host (shost, target->dev);if (err) goto free_srp_target; - err =scsi_add_host (shost, target->dev); + err =scsi_tgt_alloc_queue (shost);if (err) - goto destroy_queue; + goto remove_host; - err =scsi_tgt_alloc_queue (shost); + err =crq_queue_create (&vport->crq_queue, target);if (err) - goto destroy_queue; + goto free_queue;return 0 ; -destroy_queue: -crq_queue_destroy (target); +free_queue: +scsi_tgt_free_queue (shost); +remove_host: +scsi_remove_host (shost); free_srp_target:srp_target_free (target); put_host:
drivers/scsi/libiscsi.c +5 -6
@@ -489,12 +489,6 @@ __iscsi_conn_send_pdu(struct iscsi_conn *conn, struct iscsi_hdr *hdr,if (!__kfifo_get (session->cmdpool.queue, (void *)&task,sizeof (void *)))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
@@ -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 );if (!task)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,
drivers/scsi/scsi_lib.c +1 -1
@@ -648,8 +648,8 @@ static void scsi_requeue_command(struct request_queue *q, struct scsi_cmnd *cmd)struct request *req = cmd->request;unsigned long flags; -scsi_unprep_request (req);spin_lock_irqsave (q->queue_lock, flags); +scsi_unprep_request (req);blk_requeue_request (q, req);spin_unlock_irqrestore (q->queue_lock, flags);