# This is a BitKeeper generated patch for the following project: # Project Name: Linux kernel tree # This patch format is intended for GNU patch command version 2.5 or higher. # This patch includes the following deltas: # ChangeSet 1.637 -> 1.638 # drivers/ide/ide-taskfile.c 1.2 -> 1.3 # include/linux/ide.h 1.13 -> 1.14 # drivers/ide/ide-disk.c 1.14 -> 1.15 # # The following is the BitKeeper ChangeSet Log # -------------------------------------------- # 02/09/11 axboe@burns.home.kernel.dk 1.638 # ide_map_buffer() and ide_unmap_buffer() could cause imbalanced calls # to bio_kmap/kunmap_irq(), which would screw the preemption count. pass # in rq to ide_unmap_buffer() as well to make the right decision. # -------------------------------------------- # diff -Nru a/drivers/ide/ide-disk.c b/drivers/ide/ide-disk.c --- a/drivers/ide/ide-disk.c Wed Sep 11 12:46:57 2002 +++ b/drivers/ide/ide-disk.c Wed Sep 11 12:46:57 2002 @@ -173,7 +173,7 @@ drive->name, rq->sector, rq->sector+nsect-1, (unsigned long) rq->buffer+(nsect<<9), rq->nr_sectors-nsect); #endif - ide_unmap_buffer(to, &flags); + ide_unmap_buffer(rq, to, &flags); rq->sector += nsect; rq->errors = 0; i = (rq->nr_sectors -= nsect); @@ -227,7 +227,7 @@ unsigned long flags; char *to = ide_map_buffer(rq, &flags); taskfile_output_data(drive, to, SECTOR_WORDS); - ide_unmap_buffer(to, &flags); + ide_unmap_buffer(rq, to, &flags); if (HWGROUP(drive)->handler != NULL) BUG(); ide_set_handler(drive, &write_intr, WAIT_CMD, NULL); @@ -304,7 +304,7 @@ * re-entering us on the last transfer. */ taskfile_output_data(drive, buffer, nsect<<7); - ide_unmap_buffer(buffer, &flags); + ide_unmap_buffer(rq, buffer, &flags); } while (mcount); return 0; @@ -522,7 +522,7 @@ BUG(); ide_set_handler(drive, &write_intr, WAIT_CMD, NULL); taskfile_output_data(drive, to, SECTOR_WORDS); - ide_unmap_buffer(to, &flags); + ide_unmap_buffer(rq, to, &flags); } return ide_started; } diff -Nru a/drivers/ide/ide-taskfile.c b/drivers/ide/ide-taskfile.c --- a/drivers/ide/ide-taskfile.c Wed Sep 11 12:46:57 2002 +++ b/drivers/ide/ide-taskfile.c Wed Sep 11 12:46:57 2002 @@ -60,7 +60,7 @@ #endif #define task_map_rq(rq, flags) ide_map_buffer((rq), (flags)) -#define task_unmap_rq(rq, buf, flags) ide_unmap_buffer((buf), (flags)) +#define task_unmap_rq(rq, buf, flags) ide_unmap_buffer((rq), (buf), (flags)) inline u32 task_read_24 (ide_drive_t *drive) { diff -Nru a/include/linux/ide.h b/include/linux/ide.h --- a/include/linux/ide.h Wed Sep 11 12:46:57 2002 +++ b/include/linux/ide.h Wed Sep 11 12:46:57 2002 @@ -894,9 +894,10 @@ return rq->buffer + task_rq_offset(rq); } -extern inline void ide_unmap_buffer(char *buffer, unsigned long *flags) +extern inline void ide_unmap_buffer(struct request *rq, char *buffer, unsigned long *flags) { - bio_kunmap_irq(buffer, flags); + if (rq->bio) + bio_kunmap_irq(buffer, flags); } #define IDE_CHIPSET_PCI_MASK \