Re: [PATCH] 2.5.44-ac3, cciss, more scatter gather elements

Stephen Cameron (steve.cameron@hp.com)
Wed, 30 Oct 2002 14:23:55 -0600


I wrote:
[...]
> Anyway, here is a new cciss patch to work with your ll_rw_blk.c patch
> to use more than 31 scatter gather entries.

And that patch was missing something important. It didn't unmap
all the addresses correctly. That's what I get for sitting on a patch
since 2.5.7, I guess. Here's a patch to fix that.

-- steve

drivers/block/cciss.c | 20 ++++++++++++++++----
1 files changed, 16 insertions, 4 deletions

--- lx2544ac5/drivers/block/cciss.c~sgc4 Wed Oct 30 14:09:56 2002
+++ lx2544ac5-root/drivers/block/cciss.c Wed Oct 30 14:09:56 2002
@@ -1719,6 +1719,8 @@ static inline void complete_command( ctl
int i;
int retry_cmd = 0;
u64bit temp64;
+ int sgpage, sgelem;
+ SGDescriptor_struct *sgd;

if (timeout)
status = 0;
@@ -1830,13 +1832,23 @@ static inline void complete_command( ctl
}
/* command did not need to be retried */
/* unmap the DMA mapping for all the scatter gather elements */
- for(i=0; i<cmd->Header.SGList; i++) {
- temp64.val32.lower = cmd->SG[i].Addr.lower;
- temp64.val32.upper = cmd->SG[i].Addr.upper;
+ sgpage = 0;
+ sgelem = 0;
+ for(i=0; i<cmd->Header.SGTotal; i++) {
+ sgd = &cmd->sgdlist[sgpage].sgd[sgelem];
+ if (sgelem == MAXSGENTRIES-1 && sgd->Ext) {
+ i++;
+ sgpage++;
+ sgelem=0;
+ sgd = &cmd->sgdlist[sgpage].sgd[sgelem];
+ }
+ temp64.val32.lower = sgd->Addr.lower;
+ temp64.val32.upper = sgd->Addr.upper;
pci_unmap_page(hba[cmd->ctlr]->pdev,
- temp64.val, cmd->SG[i].Len,
+ temp64.val, sgd->Len,
(cmd->Request.Type.Direction == XFER_READ) ?
PCI_DMA_FROMDEVICE : PCI_DMA_TODEVICE);
+ sgelem++;
}
complete_buffers(cmd->rq->bio, status);

.
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/