> Hayes, Stuart wrote:
>> 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 
>> 
> 
> Oh, yeah, unmaskirq...
> 
> Do you see any problem with masking local IRQs during the transfer? 
> If unmask is set, it could be because the device is a slow PIO
> device, so transferring a whole page could take over 2.5ms.  
> 
> I could check, and if unmask is set && the page is in high memory, I
> could copy the page down to low memory and allow the transfer to the
> drive to proceed with irqs unmasked.  Do you think it would be worth
> the extra code complexity?   
> 
> Thanks
> Stuart
> 
> 

Oops, it's a worst case of ~1.2ms, not 2.5ms.  I guess that would be OK.

I'll rework the patch and send it again in a bit.


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

Reply via email to