Re: [PATCH 33/33] IDE: sg chaining support

2007-07-19 Thread Jens Axboe
On Wed, Jul 18 2007, Bartlomiej Zolnierkiewicz wrote:
> On Monday 16 July 2007, Jens Axboe wrote:
> > Cc: [EMAIL PROTECTED]
> > Signed-off-by: Jens Axboe <[EMAIL PROTECTED]>
> 
> Acked-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>

(for both acks) Thanks for reviewing and acking!

-- 
Jens Axboe

-
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/


Re: [PATCH 33/33] IDE: sg chaining support

2007-07-19 Thread Jens Axboe
On Wed, Jul 18 2007, Bartlomiej Zolnierkiewicz wrote:
 On Monday 16 July 2007, Jens Axboe wrote:
  Cc: [EMAIL PROTECTED]
  Signed-off-by: Jens Axboe [EMAIL PROTECTED]
 
 Acked-by: Bartlomiej Zolnierkiewicz [EMAIL PROTECTED]

(for both acks) Thanks for reviewing and acking!

-- 
Jens Axboe

-
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/


Re: [PATCH 33/33] IDE: sg chaining support

2007-07-18 Thread Bartlomiej Zolnierkiewicz
On Monday 16 July 2007, Jens Axboe wrote:
> Cc: [EMAIL PROTECTED]
> Signed-off-by: Jens Axboe <[EMAIL PROTECTED]>

Acked-by: Bartlomiej Zolnierkiewicz <[EMAIL PROTECTED]>
-
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/


Re: [PATCH 33/33] IDE: sg chaining support

2007-07-18 Thread Bartlomiej Zolnierkiewicz
On Monday 16 July 2007, Jens Axboe wrote:
 Cc: [EMAIL PROTECTED]
 Signed-off-by: Jens Axboe [EMAIL PROTECTED]

Acked-by: Bartlomiej Zolnierkiewicz [EMAIL PROTECTED]
-
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/


[PATCH 33/33] IDE: sg chaining support

2007-07-16 Thread Jens Axboe
Cc: [EMAIL PROTECTED]
Signed-off-by: Jens Axboe <[EMAIL PROTECTED]>
---
 drivers/ide/cris/ide-cris.c   |3 ++-
 drivers/ide/ide-dma.c |2 +-
 drivers/ide/ide-io.c  |3 ++-
 drivers/ide/ide-probe.c   |2 +-
 drivers/ide/ide-taskfile.c|   17 +
 drivers/ide/mips/au1xxx-ide.c |2 +-
 drivers/ide/pci/sgiioc4.c |2 +-
 drivers/ide/ppc/pmac.c|2 +-
 include/linux/ide.h   |2 +-
 9 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c
index 886091b..e1b2d01 100644
--- a/drivers/ide/cris/ide-cris.c
+++ b/drivers/ide/cris/ide-cris.c
@@ -951,7 +951,8 @@ static int cris_ide_build_dmatable (ide_drive_t *drive)
/* group sequential buffers into one large buffer */
addr = page_to_phys(sg->page) + sg->offset;
size = sg_dma_len(sg);
-   while (sg++, --i) {
+   while (--i) {
+   sg = sg_next(sg);
if ((addr + size) != page_to_phys(sg->page) + 
sg->offset)
break;
size += sg_dma_len(sg);
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
index 5fe1d72..a9a18a1 100644
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -294,7 +294,7 @@ int ide_build_dmatable (ide_drive_t *drive, struct request 
*rq)
}
}
 
-   sg++;
+   sg = sg_next(sg);
i--;
}
 
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index c5b5011..2465c24 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -836,7 +836,8 @@ void ide_init_sg_cmd(ide_drive_t *drive, struct request *rq)
ide_hwif_t *hwif = drive->hwif;
 
hwif->nsect = hwif->nleft = rq->nr_sectors;
-   hwif->cursg = hwif->cursg_ofs = 0;
+   hwif->cursg_ofs = 0;
+   hwif->cursg = NULL;
 }
 
 EXPORT_SYMBOL_GPL(ide_init_sg_cmd);
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index cc58013..111ec02 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1352,7 +1352,7 @@ static int hwif_init(ide_hwif_t *hwif)
if (!hwif->sg_max_nents)
hwif->sg_max_nents = PRD_ENTRIES;
 
-   hwif->sg_table = kmalloc(sizeof(struct scatterlist)*hwif->sg_max_nents,
+   hwif->sg_table = kzalloc(sizeof(struct scatterlist)*hwif->sg_max_nents,
 GFP_KERNEL);
if (!hwif->sg_table) {
printk(KERN_ERR "%s: unable to allocate SG table.\n", 
hwif->name);
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index aa06daf..3c92790 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -263,6 +263,7 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int 
write)
 {
ide_hwif_t *hwif = drive->hwif;
struct scatterlist *sg = hwif->sg_table;
+   struct scatterlist *cursg = hwif->cursg;
struct page *page;
 #ifdef CONFIG_HIGHMEM
unsigned long flags;
@@ -270,8 +271,14 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned 
int write)
unsigned int offset;
u8 *buf;
 
-   page = sg[hwif->cursg].page;
-   offset = sg[hwif->cursg].offset + hwif->cursg_ofs * SECTOR_SIZE;
+   cursg = hwif->cursg;
+   if (!cursg) {
+   cursg = sg;
+   hwif->cursg = sg;
+   }
+
+   page = cursg->page;
+   offset = cursg->offset + hwif->cursg_ofs * SECTOR_SIZE;
 
/* get the current page and offset */
page = nth_page(page, (offset >> PAGE_SHIFT));
@@ -285,8 +292,8 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int 
write)
hwif->nleft--;
hwif->cursg_ofs++;
 
-   if ((hwif->cursg_ofs * SECTOR_SIZE) == sg[hwif->cursg].length) {
-   hwif->cursg++;
+   if ((hwif->cursg_ofs * SECTOR_SIZE) == cursg->length) {
+   hwif->cursg = sg_next(hwif->cursg);
hwif->cursg_ofs = 0;
}
 
@@ -367,6 +374,8 @@ static ide_startstop_t task_error(ide_drive_t *drive, 
struct request *rq,
 
 static void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat)
 {
+   HWIF(drive)->cursg = NULL;
+
if (rq->cmd_type == REQ_TYPE_ATA_TASKFILE) {
ide_task_t *task = rq->special;
 
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c
index 2e7013a..48cfb62 100644
--- a/drivers/ide/mips/au1xxx-ide.c
+++ b/drivers/ide/mips/au1xxx-ide.c
@@ -324,7 +324,7 @@ static int auide_build_dmatable(ide_drive_t *drive)
cur_addr += tc;
cur_len -= tc;
}
-   sg++;
+   sg = sg_next(sg);
i--;
}
 
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
index d396b29..9e36b29 100644
--- a/drivers/ide/pci/sgiioc4.c
+++ 

[PATCH 33/33] IDE: sg chaining support

2007-07-16 Thread Jens Axboe
Cc: [EMAIL PROTECTED]
Signed-off-by: Jens Axboe [EMAIL PROTECTED]
---
 drivers/ide/cris/ide-cris.c   |3 ++-
 drivers/ide/ide-dma.c |2 +-
 drivers/ide/ide-io.c  |3 ++-
 drivers/ide/ide-probe.c   |2 +-
 drivers/ide/ide-taskfile.c|   17 +
 drivers/ide/mips/au1xxx-ide.c |2 +-
 drivers/ide/pci/sgiioc4.c |2 +-
 drivers/ide/ppc/pmac.c|2 +-
 include/linux/ide.h   |2 +-
 9 files changed, 23 insertions(+), 12 deletions(-)

diff --git a/drivers/ide/cris/ide-cris.c b/drivers/ide/cris/ide-cris.c
index 886091b..e1b2d01 100644
--- a/drivers/ide/cris/ide-cris.c
+++ b/drivers/ide/cris/ide-cris.c
@@ -951,7 +951,8 @@ static int cris_ide_build_dmatable (ide_drive_t *drive)
/* group sequential buffers into one large buffer */
addr = page_to_phys(sg-page) + sg-offset;
size = sg_dma_len(sg);
-   while (sg++, --i) {
+   while (--i) {
+   sg = sg_next(sg);
if ((addr + size) != page_to_phys(sg-page) + 
sg-offset)
break;
size += sg_dma_len(sg);
diff --git a/drivers/ide/ide-dma.c b/drivers/ide/ide-dma.c
index 5fe1d72..a9a18a1 100644
--- a/drivers/ide/ide-dma.c
+++ b/drivers/ide/ide-dma.c
@@ -294,7 +294,7 @@ int ide_build_dmatable (ide_drive_t *drive, struct request 
*rq)
}
}
 
-   sg++;
+   sg = sg_next(sg);
i--;
}
 
diff --git a/drivers/ide/ide-io.c b/drivers/ide/ide-io.c
index c5b5011..2465c24 100644
--- a/drivers/ide/ide-io.c
+++ b/drivers/ide/ide-io.c
@@ -836,7 +836,8 @@ void ide_init_sg_cmd(ide_drive_t *drive, struct request *rq)
ide_hwif_t *hwif = drive-hwif;
 
hwif-nsect = hwif-nleft = rq-nr_sectors;
-   hwif-cursg = hwif-cursg_ofs = 0;
+   hwif-cursg_ofs = 0;
+   hwif-cursg = NULL;
 }
 
 EXPORT_SYMBOL_GPL(ide_init_sg_cmd);
diff --git a/drivers/ide/ide-probe.c b/drivers/ide/ide-probe.c
index cc58013..111ec02 100644
--- a/drivers/ide/ide-probe.c
+++ b/drivers/ide/ide-probe.c
@@ -1352,7 +1352,7 @@ static int hwif_init(ide_hwif_t *hwif)
if (!hwif-sg_max_nents)
hwif-sg_max_nents = PRD_ENTRIES;
 
-   hwif-sg_table = kmalloc(sizeof(struct scatterlist)*hwif-sg_max_nents,
+   hwif-sg_table = kzalloc(sizeof(struct scatterlist)*hwif-sg_max_nents,
 GFP_KERNEL);
if (!hwif-sg_table) {
printk(KERN_ERR %s: unable to allocate SG table.\n, 
hwif-name);
diff --git a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c
index aa06daf..3c92790 100644
--- a/drivers/ide/ide-taskfile.c
+++ b/drivers/ide/ide-taskfile.c
@@ -263,6 +263,7 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int 
write)
 {
ide_hwif_t *hwif = drive-hwif;
struct scatterlist *sg = hwif-sg_table;
+   struct scatterlist *cursg = hwif-cursg;
struct page *page;
 #ifdef CONFIG_HIGHMEM
unsigned long flags;
@@ -270,8 +271,14 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned 
int write)
unsigned int offset;
u8 *buf;
 
-   page = sg[hwif-cursg].page;
-   offset = sg[hwif-cursg].offset + hwif-cursg_ofs * SECTOR_SIZE;
+   cursg = hwif-cursg;
+   if (!cursg) {
+   cursg = sg;
+   hwif-cursg = sg;
+   }
+
+   page = cursg-page;
+   offset = cursg-offset + hwif-cursg_ofs * SECTOR_SIZE;
 
/* get the current page and offset */
page = nth_page(page, (offset  PAGE_SHIFT));
@@ -285,8 +292,8 @@ static void ide_pio_sector(ide_drive_t *drive, unsigned int 
write)
hwif-nleft--;
hwif-cursg_ofs++;
 
-   if ((hwif-cursg_ofs * SECTOR_SIZE) == sg[hwif-cursg].length) {
-   hwif-cursg++;
+   if ((hwif-cursg_ofs * SECTOR_SIZE) == cursg-length) {
+   hwif-cursg = sg_next(hwif-cursg);
hwif-cursg_ofs = 0;
}
 
@@ -367,6 +374,8 @@ static ide_startstop_t task_error(ide_drive_t *drive, 
struct request *rq,
 
 static void task_end_request(ide_drive_t *drive, struct request *rq, u8 stat)
 {
+   HWIF(drive)-cursg = NULL;
+
if (rq-cmd_type == REQ_TYPE_ATA_TASKFILE) {
ide_task_t *task = rq-special;
 
diff --git a/drivers/ide/mips/au1xxx-ide.c b/drivers/ide/mips/au1xxx-ide.c
index 2e7013a..48cfb62 100644
--- a/drivers/ide/mips/au1xxx-ide.c
+++ b/drivers/ide/mips/au1xxx-ide.c
@@ -324,7 +324,7 @@ static int auide_build_dmatable(ide_drive_t *drive)
cur_addr += tc;
cur_len -= tc;
}
-   sg++;
+   sg = sg_next(sg);
i--;
}
 
diff --git a/drivers/ide/pci/sgiioc4.c b/drivers/ide/pci/sgiioc4.c
index d396b29..9e36b29 100644
--- a/drivers/ide/pci/sgiioc4.c
+++ b/drivers/ide/pci/sgiioc4.c
@@ -531,7 +531,7 @@