Thanks James. I'll give a try tonight or tomorrow. -J -- On Sat, Feb 16, 2008 at 11:37:41PM +0000, Daniel Drake wrote: > Daniel Drake wrote: >> Here is a patch to address your comments. >> Joshua, would you mind testing this before I submit it properly? It will >> apply cleanly to 2.6.24 on top of the previous patch you tested. I have >> compile-tested it. > > It would help to include the patch. > >From 0a9cd6133fe4f0c3a8906d6be1b9d1ef083345dc Mon Sep 17 00:00:00 2001 > From: Daniel Drake <dsd@xxxxxxxxxx> > Date: Sat, 16 Feb 2008 23:25:02 +0000 > Subject: [PATCH] arcmsr: fix message allocation > > --- > drivers/scsi/arcmsr/arcmsr_hba.c | 26 +++++++++++--------------- > 1 files changed, 11 insertions(+), 15 deletions(-) > > diff --git a/drivers/scsi/arcmsr/arcmsr_hba.c b/drivers/scsi/arcmsr/arcmsr_hba.c > index 4f9ff32..f91f79c 100644 > --- a/drivers/scsi/arcmsr/arcmsr_hba.c > +++ b/drivers/scsi/arcmsr/arcmsr_hba.c > @@ -1387,18 +1387,16 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \ > switch(controlcode) { > > case ARCMSR_MESSAGE_READ_RQBUFFER: { > - unsigned long *ver_addr; > + unsigned char *ver_addr; > uint8_t *pQbuffer, *ptmpQbuffer; > int32_t allxfer_len = 0; > - void *tmp; > > - tmp = kmalloc(1032, GFP_KERNEL|GFP_DMA); > - ver_addr = (unsigned long *)tmp; > - if (!tmp) { > + ver_addr = kmalloc(1032, GFP_ATOMIC); > + if (!ver_addr) { > retvalue = ARCMSR_MESSAGE_FAIL; > goto message_out; > } > - ptmpQbuffer = (uint8_t *) ver_addr; > + ptmpQbuffer = ver_addr; > while ((acb->rqbuf_firstindex != acb->rqbuf_lastindex) > && (allxfer_len < 1031)) { > pQbuffer = &acb->rqbuffer[acb->rqbuf_firstindex]; > @@ -1427,26 +1425,24 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \ > } > arcmsr_iop_message_read(acb); > } > - memcpy(pcmdmessagefld->messagedatabuffer, (uint8_t *)ver_addr, allxfer_len); > + memcpy(pcmdmessagefld->messagedatabuffer, ver_addr, allxfer_len); > pcmdmessagefld->cmdmessage.Length = allxfer_len; > pcmdmessagefld->cmdmessage.ReturnCode = ARCMSR_MESSAGE_RETURNCODE_OK; > - kfree(tmp); > + kfree(ver_addr); > } > break; > > case ARCMSR_MESSAGE_WRITE_WQBUFFER: { > - unsigned long *ver_addr; > + unsigned char *ver_addr; > int32_t my_empty_len, user_len, wqbuf_firstindex, wqbuf_lastindex; > uint8_t *pQbuffer, *ptmpuserbuffer; > - void *tmp; > > - tmp = kmalloc(1032, GFP_KERNEL|GFP_DMA); > - ver_addr = (unsigned long *)tmp; > - if (!tmp) { > + ver_addr = kmalloc(1032, GFP_ATOMIC); > + if (!ver_addr) { > retvalue = ARCMSR_MESSAGE_FAIL; > goto message_out; > } > - ptmpuserbuffer = (uint8_t *)ver_addr; > + ptmpuserbuffer = ver_addr; > user_len = pcmdmessagefld->cmdmessage.Length; > memcpy(ptmpuserbuffer, pcmdmessagefld->messagedatabuffer, user_len); > wqbuf_lastindex = acb->wqbuf_lastindex; > @@ -1492,7 +1488,7 @@ static int arcmsr_iop_message_xfer(struct AdapterControlBlock *acb, \ > retvalue = ARCMSR_MESSAGE_FAIL; > } > } > - kfree(tmp); > + kfree(ver_addr); > } > break; > > -- > 1.5.4 > - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html