SCSI bug fixes for 2.6.24-rc3
Subsystems (7)
James Bottomley
maintainerPATCH 1/1 SCSI bug fixes for 2.6.24-rc3
This is a bit of a rash of bug fixes. The qla1280 is actually a bug fix (in spite of the title---it's actually correcting an existing problem with the qla1280 implementation of accessors that broke the current driver).
The patch is available here:
master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
The short changelog is:
Alan Cox (1):
aacraid: fix security weakness
Jeff Garzik (1):
NCR5380: Fix bugs and canonicalize irq handler usage
Jes Sorensen (1):
qla1280: convert to use the data buffer accessors
Martin Peschke (2):
zfcp: fix cleanup of dismissed error recovery actions
zfcp: fix dismissal of error recovery actions
Salyzyn, Mark (2):
aacraid: fix up le32 issues in BlinkLED
aacraid: fix potential panic in thread stop
Stephen Rothwell (1):
aacraid: don't assign cpu_to_le32(constant) to u8
Tony Battersby (2):
iscsi: return data transfer residual for data-out commands
iscsi_tcp: fix potential lockup with write commands
and the diffstat:
s390/scsi/zfcp_erp.c | 18 +- scsi/aacraid/commsup.c | 8 - scsi/aacraid/linit.c | 7 scsi/atari_scsi.c | 10 - scsi/dtc.c | 5 scsi/g_NCR5380.c | 5 scsi/iscsi_tcp.c | 139 ++++++++--------- scsi/iscsi_tcp.h | 34 ++-- scsi/libiscsi.c | 3 scsi/mac_scsi.c | 4 scsi/pas16.c | 5 scsi/qla1280.c | 387 +++++++++++++++++++++---------------------------- scsi/sun3_scsi.c | 4 scsi/sun3_scsi_vme.c | 4 scsi/t128.c | 5 15 files changed, 292 insertions(+), 346 deletions(-)
The actual diffs are below.
James
drivers/s390/scsi/zfcp_erp.c +9 -9
@@ -977,7 +977,9 @@ static void zfcp_erp_action_dismiss(struct zfcp_erp_action *erp_action)debug_text_event (adapter->erp_dbf,2 ,"a_adis" );debug_event (adapter->erp_dbf,2 , &erp_action->action,sizeof (int )); -zfcp_erp_async_handler_nolock (erp_action,ZFCP_STATUS_ERP_DISMISSED ); + erp_action->status |=ZFCP_STATUS_ERP_DISMISSED ; +if (zfcp_erp_action_exists (erp_action) ==ZFCP_ERP_ACTION_RUNNING ) +zfcp_erp_action_ready (erp_action); }int
@@ -1063,7 +1065,7 @@ zfcp_erp_thread(void *data) &adapter->status)) {write_lock_irqsave (&adapter->erp_lock, flags); - next = adapter->erp_ready_head.prev; + next = adapter->erp_ready_head.next;write_unlock_irqrestore (&adapter->erp_lock, flags);if (next != &adapter->erp_ready_head) {
@@ -1153,15 +1155,13 @@ zfcp_erp_strategy(struct zfcp_erp_action *erp_action)/* * check for dismissed status again to avoid follow-up actions, -* failing of targets and so on for dismissed actions +* failing of targets and so on for dismissed actions, +* we go through down() here because there has been an up() */ - retval =zfcp_erp_strategy_check_action (erp_action, retval); +if (erp_action->status &ZFCP_STATUS_ERP_DISMISSED ) + retval =ZFCP_ERP_CONTINUES ;switch (retval) { -case ZFCP_ERP_DISMISSED : -/* leave since this action has ridden to its ancestors */ -debug_text_event (adapter->erp_dbf,6 ,"a_st_dis2" ); - goto unlock;case ZFCP_ERP_NOMEM :/* no memory to continue immediately, let it sleep */ if (!(erp_action->status &ZFCP_STATUS_ERP_LOWMEM )) {
@@ -3089,7 +3089,7 @@ zfcp_erp_action_enqueue(int action, ++adapter->erp_total_count;/* finally put it into 'ready' queue and kick erp thread */ -list_add (&erp_action->list, &adapter->erp_ready_head); +list_add_tail (&erp_action->list, &adapter->erp_ready_head);up (&adapter->erp_ready_sem); retval =0 ; out:
drivers/scsi/aacraid/commsup.c +4 -4
@@ -1339,10 +1339,10 @@ int aac_check_health(struct aac_dev * aac) aif = (struct aac_aifcmd *)hw_fib->data; aif->command =cpu_to_le32 (AifCmdEventNotify); aif->seqnum =cpu_to_le32 (0xFFFFFFFF ); - aif->data[0 ] =cpu_to_le32 (AifEnExpEvent); - aif->data[1 ] =cpu_to_le32 (AifExeFirmwarePanic); - aif->data[2 ] =cpu_to_le32 (AifHighPriority); - aif->data[3 ] =cpu_to_le32 (BlinkLED); + aif->data[0 ] = AifEnExpEvent; + aif->data[1 ] = AifExeFirmwarePanic; + aif->data[2 ] = AifHighPriority; + aif->data[3 ] = BlinkLED;/* * Put the FIB onto the
drivers/scsi/aacraid/linit.c +4 -3
@@ -636,7 +636,7 @@ static int aac_cfg_open(struct inode *inode, struct file *file)static int aac_cfg_ioctl (struct inode *inode,struct file *file,unsigned int cmd,unsigned long arg) { -if (!capable (CAP_SYS_ADMIN )) +if (!capable (CAP_SYS_RAWIO ))return -EPERM ;return aac_do_ioctl (file->private_data, cmd, (void __user *)arg); }
@@ -691,7 +691,7 @@ static int aac_compat_ioctl(struct scsi_device *sdev, int cmd, void __user *arg)static long aac_compat_cfg_ioctl (struct file *file,unsigned cmd,unsigned long arg) { -if (!capable (CAP_SYS_ADMIN )) +if (!capable (CAP_SYS_RAWIO ))return -EPERM ;return aac_compat_do_ioctl ((struct aac_dev *)file->private_data, cmd, arg); }
@@ -950,7 +950,8 @@ static struct scsi_host_template aac_driver_template = {static void __aac_shutdown (struct aac_dev * aac) { -kthread_stop (aac->thread); +if (aac->aif_thread) +kthread_stop (aac->thread);aac_send_shutdown (aac);aac_adapter_disable_int (aac);free_irq (aac->pdev->irq, aac);
drivers/scsi/atari_scsi.c +5 -5
@@ -393,7 +393,7 @@ static irqreturn_t scsi_tt_intr(int irq, void *dummy)#endif /* REAL_DMA */ -NCR5380_intr (0 ,0 ); +NCR5380_intr (irq, dummy);#if 0 /* To be sure the int is not masked */
@@ -458,7 +458,7 @@ static irqreturn_t scsi_falcon_intr(int irq, void *dummy)#endif /* REAL_DMA */ -NCR5380_intr (0 ,0 ); +NCR5380_intr (irq, dummy);return IRQ_HANDLED ; }
@@ -684,7 +684,7 @@ int atari_scsi_detect(struct scsi_host_template *host)* interrupt after having cleared the pending flag for the DMA * interrupt. */ if (request_irq (IRQ_TT_MFP_SCSI , scsi_tt_intr,IRQ_TYPE_SLOW , -"SCSI NCR5380" , scsi_tt_intr)) { +"SCSI NCR5380" , instance)) {printk (KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting" ,IRQ_TT_MFP_SCSI );scsi_unregister (atari_scsi_host);atari_stram_free (atari_dma_buffer);
@@ -701,7 +701,7 @@ int atari_scsi_detect(struct scsi_host_template *host) IRQ_TYPE_PRIO, "Hades DMA emulator", hades_dma_emulator)) {printk (KERN_ERR "atari_scsi_detect: cannot allocate irq %d, aborting (MACH_IS_HADES)" ,IRQ_AUTO_2 ); -free_irq (IRQ_TT_MFP_SCSI , scsi_tt_intr); +free_irq (IRQ_TT_MFP_SCSI , instance);scsi_unregister (atari_scsi_host);atari_stram_free (atari_dma_buffer); atari_dma_buffer =0 ;
@@ -761,7 +761,7 @@ int atari_scsi_detect(struct scsi_host_template *host)int atari_scsi_release (struct Scsi_Host *sh) {if (IS_A_TT ()) -free_irq (IRQ_TT_MFP_SCSI , scsi_tt_intr); +free_irq (IRQ_TT_MFP_SCSI , sh);if (atari_dma_buffer)atari_stram_free (atari_dma_buffer);return 1 ;
drivers/scsi/dtc.c +3 -2
@@ -277,7 +277,8 @@ found:/* With interrupts enabled, it will sometimes hang when doing heavy * reads. So better not enable them until I finger it out. */ if (instance->irq !=SCSI_IRQ_NONE ) -if (request_irq (instance->irq, dtc_intr,IRQF_DISABLED ,"dtc" , instance)) { +if (request_irq (instance->irq, dtc_intr,IRQF_DISABLED , +"dtc" , instance)) {printk (KERN_ERR "scsi%d : IRQ%d not free, interrupts disabled\n" , instance->host_no, instance->irq); instance->irq =SCSI_IRQ_NONE ; }
@@ -459,7 +460,7 @@ static int dtc_release(struct Scsi_Host *shost)NCR5380_local_declare ();NCR5380_setup (shost);if (shost->irq) -free_irq (shost->irq,NULL ); +free_irq (shost->irq, shost);NCR5380_exit (shost);if (shost->io_port && shost->n_io_port)release_region (shost->io_port, shost->n_io_port);
drivers/scsi/g_NCR5380.c +3 -2
@@ -460,7 +460,8 @@ int __init generic_NCR5380_detect(struct scsi_host_template * tpnt) instance->irq =NCR5380_probe_irq (instance,0xffff );if (instance->irq !=SCSI_IRQ_NONE ) -if (request_irq (instance->irq, generic_NCR5380_intr,IRQF_DISABLED ,"NCR5380" , instance)) { +if (request_irq (instance->irq, generic_NCR5380_intr, +IRQF_DISABLED ,"NCR5380" , instance)) {printk (KERN_WARNING "scsi%d : IRQ%d not free, interrupts disabled\n" , instance->host_no, instance->irq); instance->irq =SCSI_IRQ_NONE ; }
@@ -513,7 +514,7 @@ int generic_NCR5380_release_resources(struct Scsi_Host *instance)NCR5380_setup (instance);if (instance->irq !=SCSI_IRQ_NONE ) -free_irq (instance->irq,NULL ); +free_irq (instance->irq, instance);NCR5380_exit (instance);#ifndef CONFIG_SCSI_G_NCR5380_MEM
drivers/scsi/iscsi_tcp.c +69 -70
377 lines not on this page · raw message
drivers/scsi/iscsi_tcp.h +17 -17
@@ -32,21 +32,21 @@#define IN_PROGRESS_PAD_RECV 0x4/* xmit state machine */ -#define XMSTATE_IDLE 0x0 -#define XMSTATE_CMD_HDR_INIT 0x1 -#define XMSTATE_CMD_HDR_XMIT 0x2 -#define XMSTATE_IMM_HDR 0x4 -#define XMSTATE_IMM_DATA 0x8 -#define XMSTATE_UNS_INIT 0x10 -#define XMSTATE_UNS_HDR 0x20 -#define XMSTATE_UNS_DATA 0x40 -#define XMSTATE_SOL_HDR 0x80 -#define XMSTATE_SOL_DATA 0x100 -#define XMSTATE_W_PAD 0x200 -#define XMSTATE_W_RESEND_PAD 0x400 -#define XMSTATE_W_RESEND_DATA_DIGEST 0x800 -#define XMSTATE_IMM_HDR_INIT 0x1000 -#define XMSTATE_SOL_HDR_INIT 0x2000 +#define XMSTATE_VALUE_IDLE 0 +#define XMSTATE_BIT_CMD_HDR_INIT 0 +#define XMSTATE_BIT_CMD_HDR_XMIT 1 +#define XMSTATE_BIT_IMM_HDR 2 +#define XMSTATE_BIT_IMM_DATA 3 +#define XMSTATE_BIT_UNS_INIT 4 +#define XMSTATE_BIT_UNS_HDR 5 +#define XMSTATE_BIT_UNS_DATA 6 +#define XMSTATE_BIT_SOL_HDR 7 +#define XMSTATE_BIT_SOL_DATA 8 +#define XMSTATE_BIT_W_PAD 9 +#define XMSTATE_BIT_W_RESEND_PAD 10 +#define XMSTATE_BIT_W_RESEND_DATA_DIGEST 11 +#define XMSTATE_BIT_IMM_HDR_INIT 12 +#define XMSTATE_BIT_SOL_HDR_INIT 13#define ISCSI_PAD_LEN 4#define ISCSI_SG_TABLESIZE SG_ALL
@@ -122,7 +122,7 @@ struct iscsi_data_task {struct iscsi_tcp_mgmt_task {struct iscsi_hdr hdr;char hdrext[sizeof (__u32)];/* Header-Digest */ -int xmstate;/* mgmt xmit progress */ +unsigned long xmstate;/* mgmt xmit progress */ struct iscsi_buf headbuf;/* header buffer */ struct iscsi_buf sendbuf;/* in progress buffer */ int sent;
@@ -150,7 +150,7 @@ struct iscsi_tcp_cmd_task {int pad_count;/* padded bytes */ struct iscsi_buf headbuf;/* header buf (xmit) */ struct iscsi_buf sendbuf;/* in progress buffer*/ -int xmstate;/* xmit xtate machine */ +unsigned long xmstate;/* xmit xtate machine */ int sent;struct scatterlist *sg;/* per-cmd SG list */ struct scatterlist *bad_sg;/* assert statement */
drivers/scsi/libiscsi.c +0 -3
@@ -291,9 +291,6 @@ invalid_datalen: min_t(uint16_t, senselen, SCSI_SENSE_BUFFERSIZE)); } -if (sc->sc_data_direction ==DMA_TO_DEVICE ) - goto out; -if (rhdr->flags &ISCSI_FLAG_CMD_UNDERFLOW ) {int res_count =be32_to_cpu (rhdr->residual_count);
drivers/scsi/mac_scsi.c +2 -2
@@ -303,7 +303,7 @@ int macscsi_detect(struct scsi_host_template * tpnt)if (instance->irq !=SCSI_IRQ_NONE )if (request_irq (instance->irq, NCR5380_intr,IRQ_FLG_SLOW , -"ncr5380" , instance)) { +"ncr5380" , instance)) {printk (KERN_WARNING "scsi%d: IRQ%d not free, interrupts disabled\n" , instance->host_no, instance->irq); instance->irq =SCSI_IRQ_NONE ;
@@ -326,7 +326,7 @@ int macscsi_detect(struct scsi_host_template * tpnt)int macscsi_release (struct Scsi_Host *shpnt) {if (shpnt->irq !=SCSI_IRQ_NONE ) -free_irq (shpnt->irq, NCR5380_intr); +free_irq (shpnt->irq, shpnt);NCR5380_exit (shpnt);return 0 ;
drivers/scsi/pas16.c +3 -2
@@ -453,7 +453,8 @@ int __init pas16_detect(struct scsi_host_template * tpnt) instance->irq =NCR5380_probe_irq (instance,PAS16_IRQS );if (instance->irq !=SCSI_IRQ_NONE ) -if (request_irq (instance->irq, pas16_intr,IRQF_DISABLED ,"pas16" , instance)) { +if (request_irq (instance->irq, pas16_intr,IRQF_DISABLED , +"pas16" , instance)) {printk ("scsi%d : IRQ%d not free, interrupts disabled\n" , instance->host_no, instance->irq); instance->irq =SCSI_IRQ_NONE ;
@@ -604,7 +605,7 @@ static inline int NCR5380_pwrite (struct Scsi_Host *instance, unsigned char *srcstatic int pas16_release (struct Scsi_Host *shost) {if (shost->irq) -free_irq (shost->irq,NULL ); +free_irq (shost->irq, shost);NCR5380_exit (shost);if (shost->dma_channel !=0xff )free_dma (shost->dma_channel);
drivers/scsi/qla1280.c +166 -221
495 lines not on this page · raw message
drivers/scsi/sun3_scsi.c +2 -2
@@ -268,7 +268,7 @@ int sun3scsi_detect(struct scsi_host_template * tpnt) ((struct NCR5380_hostdata *)instance->hostdata)->ctrl =0 ;if (request_irq (instance->irq, scsi_sun3_intr, -0 ,"Sun3SCSI-5380" ,NULL )) { +0 ,"Sun3SCSI-5380" , instance)) {#ifndef REAL_DMA printk ("scsi%d: IRQ%d not free, interrupts disabled\n" , instance->host_no, instance->irq);
@@ -310,7 +310,7 @@ int sun3scsi_detect(struct scsi_host_template * tpnt)int sun3scsi_release (struct Scsi_Host *shpnt) {if (shpnt->irq !=SCSI_IRQ_NONE ) -free_irq (shpnt->irq,NULL ); +free_irq (shpnt->irq, shpnt);iounmap ((void *)sun3_scsi_regp);
drivers/scsi/sun3_scsi_vme.c +2 -2
@@ -230,7 +230,7 @@ static int sun3scsi_detect(struct scsi_host_template * tpnt) ((struct NCR5380_hostdata *)instance->hostdata)->ctrl =0 ;if (request_irq (instance->irq, scsi_sun3_intr, -0 ,"Sun3SCSI-5380VME" ,NULL )) { +0 ,"Sun3SCSI-5380VME" , instance)) {#ifndef REAL_DMA printk ("scsi%d: IRQ%d not free, interrupts disabled\n" , instance->host_no, instance->irq);
@@ -279,7 +279,7 @@ static int sun3scsi_detect(struct scsi_host_template * tpnt)int sun3scsi_release (struct Scsi_Host *shpnt) {if (shpnt->irq !=SCSI_IRQ_NONE ) -free_irq (shpnt->irq,NULL ); +free_irq (shpnt->irq, shpnt);iounmap ((void *)sun3_scsi_regp);
drivers/scsi/t128.c +3 -2
@@ -259,7 +259,8 @@ found: instance->irq =NCR5380_probe_irq (instance,T128_IRQS );if (instance->irq !=SCSI_IRQ_NONE ) -if (request_irq (instance->irq, t128_intr,IRQF_DISABLED ,"t128" , instance)) { +if (request_irq (instance->irq, t128_intr,IRQF_DISABLED ,"t128" , + instance)) {printk ("scsi%d : IRQ%d not free, interrupts disabled\n" , instance->host_no, instance->irq); instance->irq =SCSI_IRQ_NONE ;
@@ -295,7 +296,7 @@ static int t128_release(struct Scsi_Host *shost)NCR5380_local_declare ();NCR5380_setup (shost);if (shost->irq) -free_irq (shost->irq,NULL ); +free_irq (shost->irq, shost);NCR5380_exit (shost);if (shost->io_port && shost->n_io_port)release_region (shost->io_port, shost->n_io_port);
Quoted 5 lines · James Bottomley
This is a bit of a rash of bug fixes. The qla1280 is actually a bug fix (in spite of the title---it's actually correcting an existing problem with the qla1280 implementation of accessors that broke the current driver).
Recently I build last Linus's git tree, and got:
‘req_cnt’ is used uninitialized in this function,
and see bellow
Quoted 5 lines
The patch is available here:
master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
The short changelog is:
...
Quoted 3 lines
Jes Sorensen (1):
qla1280: convert to use the data buffer accessors
...
Quoted 1 line
scsi/qla1280.c | 387 +++++++++++++++++++++----------------------------
...
drivers/scsi/qla1280.c qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) · line 3086
Quoted 3 lines
drivers/scsi/qla1280.c +0
-1/* Calculate number of entries and segments required. */ - req_cnt =1 ;
Initilization of req_cnt was removed, but in this function there are places likereq_cnt += (seg_cnt - 4) / 7;
or
req_cnt++;
This is should be so?
Signature · 7 lines
/Evgeniy -- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to [email protected] More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/
CC'ed Jes,
Quoted 22 lines · On Tue, 8 Jan 2008 14:15:53 +0300 Evgeniy Dushistov <[email protected]> wrote:
Quoted 5 lines · James Bottomley
This is a bit of a rash of bug fixes. The qla1280 is actually a bug fix (in spite of the title---it's actually correcting an existing problem with the qla1280 implementation of accessors that broke the current driver).
Recently I build last Linus's git tree, and got:
req_cntis used uninitialized in this function,
and see bellowQuoted 5 lines
The patch is available here:
master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
The short changelog is:
...
Quoted 3 lines
Jes Sorensen (1):
qla1280: convert to use the data buffer accessors...
Quoted 1 line
scsi/qla1280.c | 387 +++++++++++++++++++++----------------------------...
Quoted 10 lines
Review
Quoted 3 lines
(quoted diff) +0
-1/* Calculate number of entries and segments required. */ - req_cnt = 1;Initilization of
req_cntwas removed, but in this function there are places likereq_cnt+= (seg_cnt- 4) / 7;
or
req_cnt++;
This is should be so?
req_cnt should not be removed. Jes tested the patch but this critical bug appears only with BITS_PER_LONG != 64 && CONFIG_HIGHMEM=n case. So he didn't see this, I think.
qla1280_32bit_start_scsi also gives the following warning:
drivers/scsi/qla1280.c: In function 'qla1280_32bit_start_scsi':drivers/scsi/qla1280.c:3044: warning: unused variable 'dma_handle'
drivers/scsi/qla1280.c +1 -1
@@ -3041,7 +3041,6 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)int cnt;int req_cnt;int seg_cnt; -dma_addr_t dma_handle;u8 dir;ENTER ("qla1280_32bit_start_scsi" );
@@ -3050,6 +3049,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) cmd->cmnd[0]);/* Calculate number of entries and segments required. */ + req_cnt =1 ; seg_cnt =scsi_dma_map (cmd);if (seg_cnt) {/*
James Bottomley
maintainerQuoted 61 lines · FUJITA Tomonori
CC'ed Jes,
Quoted 22 lines · On Tue, 8 Jan 2008 14:15:53 +0300 Evgeniy Dushistov <[email protected]> wrote:
Quoted 5 lines · James Bottomley
This is a bit of a rash of bug fixes. The qla1280 is actually a bug fix (in spite of the title---it's actually correcting an existing problem with the qla1280 implementation of accessors that broke the current driver).
Recently I build last Linus's git tree, and got:
req_cntis used uninitialized in this function,
and see bellowQuoted 5 lines
The patch is available here:
master.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-rc-fixes-2.6.git
The short changelog is:
...
Quoted 3 lines
Jes Sorensen (1):
qla1280: convert to use the data buffer accessors...
Quoted 1 line
scsi/qla1280.c | 387 +++++++++++++++++++++----------------------------...
Quoted 10 lines
Review
Quoted 3 lines
(quoted diff) +0
-1/* Calculate number of entries and segments required. */ - req_cnt = 1;Initilization of
req_cntwas removed, but in this function there are places likereq_cnt+= (seg_cnt- 4) / 7;
or
req_cnt++;
This is should be so?
req_cntshould not be removed. Jes tested the patch but this critical bug appears only withBITS_PER_LONG!= 64 &&CONFIG_HIGHMEM=ncase. So he didn't see this, I think.
qla1280_32bit_start_scsialso gives the following warning:
drivers/scsi/qla1280.c: In function 'qla1280_32bit_start_scsi':drivers/scsi/qla1280.c:3044: warning: unused variable 'dma_handle'drivers/scsi/qla1280.c +0
-1@@ -3041,7 +3041,6 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp)int cnt;int req_cnt;int seg_cnt; -dma_addr_t dma_handle;u8 dir;ENTER ("qla1280_32bit_start_scsi" );
drivers/scsi/qla1280.c qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) · line 3055
Quoted 7 lines
drivers/scsi/qla1280.c +1
-0@@ -3050,6 +3049,7 @@ qla1280_32bit_start_scsi(struct scsi_qla_host *ha, struct srb * sp) cmd->cmnd[0]);/* Calculate number of entries and segments required. */ + req_cnt =1 ; seg_cnt =scsi_dma_map (cmd);if (seg_cnt) {/*
I tested this on my qla1280 and confirm all else seems well in 32 bit mode. I have to say, 32 bit mode was very difficult to enable. Apparently you not only need a 32 bit non-PAE mode kernel, but also you need to have HIGHMEM disabled for no readily apparent reason.
James