Jens Axboe wrote: > On Tue, Mar 08 2005, [EMAIL PROTECTED] wrote: >> >> Hello! >> >> We're seeing a null pointer dereference with certain IDE tape drives >> on >> 2.6.11 when we use it with ide-scsi (i686 architecture). The >> problem is that the scatter-gather pages aren't mapped to kernel >> virtual address space in >> idescsi_output_buffers()/idescsi_input_buffers(), so, if these pages >> are in high memory, page_address() returns a null pointer. >> >> This patch fixes the problem. I'll attach it as a file, too, just in >> case it gets mangled. Please let me know if there are any problems >> with or questions regarding this patch. >> >> Again, this patch is against 2.6.11. >> >> Thanks! >> Stuart Hayes >> [EMAIL PROTECTED] >> >> >> >> --- ide-scsi.c.orig 2005-03-08 13:44:38.000000000 -0500 >> +++ ide-scsi.c 2005-03-08 14:02:43.000000000 -0500 >> @@ -151,8 +151,9 @@ static void idescsi_input_buffers (ide_d >> return; } >> count = min(pc->sg->length - pc->b_count, bcount); >> - buf = page_address(pc->sg->page) + pc->sg->offset; >> + buf = kmap_atomic(pc->sg->page, KM_USER0) + >> pc->sg->offset; >> drive->hwif->atapi_input_bytes(drive, buf + pc->b_count, >> count); >> + kunmap_atomic(buf - pc->sg->offset, KM_USER0); >> bcount -= count; pc->b_count += count; >> if (pc->b_count == pc->sg->length) { >> pc->sg++; > > You need a local_irq_save(flags); ... local_irq_restore(flags); around > the kmap(atomic), transfer, and kunmap_atomic() for this to be safe. > Interrupts may not be disabled at this point, depends on drive > settings. >
Thanks for the quick response! I'll look into this more carefully. --Stuart >> @@ -173,8 +174,9 @@ static void idescsi_output_buffers (ide_ >> return; } >> count = min(pc->sg->length - pc->b_count, bcount); >> - buf = page_address(pc->sg->page) + pc->sg->offset; >> + buf = kmap_atomic(pc->sg->page, KM_USER0) + >> pc->sg->offset; >> drive->hwif->atapi_output_bytes(drive, buf + >> pc->b_count, count); >> + kunmap_atomic(buf - pc->sg->offset, KM_USER0); >> bcount -= count; pc->b_count += count; >> if (pc->b_count == pc->sg->length) { >> pc->sg++; > > Ditto. - To unsubscribe from this list: send the line "unsubscribe linux-scsi" in the body of a message to [EMAIL PROTECTED] More majordomo info at http://vger.kernel.org/majordomo-info.html