2015.Szeptember 29.(K) 20:02 időpontban James Bottomley ezt írta: > On Tue, 2015-09-29 at 10:37 -0700, James Bottomley wrote: >> On Tue, 2015-09-29 at 18:49 +0200, "Tóth Attila" wrote: >> > 2015.Szeptember 27.(V) 23:19 időpontban adam radford ezt írta: >> > > On Sun, Sep 27, 2015 at 4:56 AM, "Tóth Attila" <atoth@xxxxxxxxxxxxx> >> > > wrote: >> > >> The 3ware card is a 9650SE-12ML running in a Asus Z8PE-D12X >> > >> >> > > >> > > Can you re-try with Christoph's patch: >> > > >> > > https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=118c855b5623f3e2e6204f02623d88c09e0c34de >> > >> > As I've told this patch has been already included in the kernel I'm >> using >> > (4.1.7-hardened-r1, which is based on 4.1.7). >> > Out of curiosity I've reverted the patch and the WARNING no longer >> appears >> > during boot... >> >> Ah, it looks like there's a bug in the patch, it doesn't take into >> account that the driver has a minimum sg map length and it copies for >> things under that, so we're likely unmapping something that wasn't >> mapped. It's slightly hard to fix given that the indicator flag we'd >> use for this is gone in that patch; does this fix the warning? > > Actually, strike that, it would still barf on internally generated > commands (and it's recursively calling twa_scsi_dma_unmap). This does a > partial revert of the state check which should pick up all cases the > input didn't go through the mapping. Just to be clear before I try something out. In this latter patch you are resurrecting TW_PHASE_SGLIST, which has been ment to be removed in Christoph's patch from the header. I guess I have to reintroduce those phase defines on top of the changes below in your latest email. Or please let me know what should I exactly try out. Thanks: Dw. -- dr Tóth Attila, Radiológus, 06-20-825-8057 Attila Toth MD, Radiologist, +36-20-825-8057 > > diff --git a/drivers/scsi/3w-9xxx.c b/drivers/scsi/3w-9xxx.c > index add419d..751ed66 100644 > --- a/drivers/scsi/3w-9xxx.c > +++ b/drivers/scsi/3w-9xxx.c > @@ -151,7 +151,13 @@ static void > twa_scsiop_execute_scsi_complete(TW_Device_Extension *tw_dev, int re > static char *twa_string_lookup(twa_message_type *table, unsigned int > aen_code); > > /* Functions */ > +static void twa_scsi_dma_unmap(struct scsi_cmnd *SCpnt) > +{ > + if (SCpnt->SCp.phase == TW_PHASE_SGLIST) > + scsi_dma_unmap(SCpnt); > +} > > + > /* Show some statistics about the card */ > static ssize_t twa_show_stats(struct device *dev, > struct device_attribute *attr, char *buf) > @@ -1339,7 +1345,7 @@ static irqreturn_t twa_interrupt(int irq, void > *dev_instance) > } > > /* Now complete the io */ > - scsi_dma_unmap(cmd); > + twa_scsi_dma_unmap(cmd); > cmd->scsi_done(cmd); > tw_dev->state[request_id] = TW_S_COMPLETED; > twa_free_request_id(tw_dev, request_id); > @@ -1582,7 +1588,7 @@ static int > twa_reset_device_extension(TW_Device_Extension *tw_dev) > struct scsi_cmnd *cmd = tw_dev->srb[i]; > > cmd->result = (DID_RESET << 16); > - scsi_dma_unmap(cmd); > + twa_scsi_dma_unmap(cmd); > cmd->scsi_done(cmd); > } > } > @@ -1762,15 +1768,18 @@ static int twa_scsi_queue_lck(struct scsi_cmnd > *SCpnt, void (*done)(struct scsi_ > /* Save the scsi command for use by the ISR */ > tw_dev->srb[request_id] = SCpnt; > > + /* Initialize phase to zero */ > + SCpnt->SCp.phase = TW_PHASE_INITIAL; > + > retval = twa_scsiop_execute_scsi(tw_dev, request_id, NULL, 0, NULL); > switch (retval) { > case SCSI_MLQUEUE_HOST_BUSY: > - scsi_dma_unmap(SCpnt); > + twa_scsi_dma_unmap(SCpnt); > twa_free_request_id(tw_dev, request_id); > break; > case 1: > SCpnt->result = (DID_ERROR << 16); > - scsi_dma_unmap(SCpnt); > + twa_scsi_dma_unmap(SCpnt); > done(SCpnt); > tw_dev->state[request_id] = TW_S_COMPLETED; > twa_free_request_id(tw_dev, request_id); > @@ -1845,6 +1854,8 @@ static int > twa_scsiop_execute_scsi(TW_Device_Extension *tw_dev, int request_id, > if (sg_count < 0) > goto out; > > + srb->SCp.phase = TW_PHASE_SGLIST; > + > scsi_for_each_sg(srb, sg, sg_count, i) { > command_packet->sg_list[i].address = > TW_CPU_TO_SGL(sg_dma_address(sg)); > command_packet->sg_list[i].length = cpu_to_le32(sg_dma_len(sg)); > > -- 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