diff options
Diffstat (limited to 'drivers/scsi/ide-scsi.c')
| -rw-r--r-- | drivers/scsi/ide-scsi.c | 44 | 
1 files changed, 32 insertions, 12 deletions
| diff --git a/drivers/scsi/ide-scsi.c b/drivers/scsi/ide-scsi.c index 00d6a6657eb..a440ea38efa 100644 --- a/drivers/scsi/ide-scsi.c +++ b/drivers/scsi/ide-scsi.c @@ -180,12 +180,22 @@ static void idescsi_input_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsigne  			return;  		}  		count = min(pc->sg->length - pc->b_count, bcount); -		buf = kmap_atomic(pc->sg->page, KM_IRQ0); -		drive->hwif->atapi_input_bytes(drive, -				buf + pc->b_count + pc->sg->offset, count); -		kunmap_atomic(buf, KM_IRQ0); -		bcount -= count; -		pc->b_count += count; +		if (PageHighMem(pc->sg->page)) { +			unsigned long flags; + +			local_irq_save(flags); +			buf = kmap_atomic(pc->sg->page, KM_IRQ0) + +					pc->sg->offset; +			drive->hwif->atapi_input_bytes(drive, +						buf + pc->b_count, count); +			kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); +			local_irq_restore(flags); +		} else { +			buf = page_address(pc->sg->page) + pc->sg->offset; +			drive->hwif->atapi_input_bytes(drive, +						buf + pc->b_count, count); +		} +		bcount -= count; pc->b_count += count;  		if (pc->b_count == pc->sg->length) {  			pc->sg++;  			pc->b_count = 0; @@ -205,12 +215,22 @@ static void idescsi_output_buffers (ide_drive_t *drive, idescsi_pc_t *pc, unsign  			return;  		}  		count = min(pc->sg->length - pc->b_count, bcount); -		buf = kmap_atomic(pc->sg->page, KM_IRQ0); -		drive->hwif->atapi_output_bytes(drive, -				buf + pc->b_count + pc->sg->offset, count); -		kunmap_atomic(buf, KM_IRQ0); -		bcount -= count; -		pc->b_count += count; +		if (PageHighMem(pc->sg->page)) { +			unsigned long flags; + +			local_irq_save(flags); +			buf = kmap_atomic(pc->sg->page, KM_IRQ0) + +						pc->sg->offset; +			drive->hwif->atapi_output_bytes(drive, +						buf + pc->b_count, count); +			kunmap_atomic(buf - pc->sg->offset, KM_IRQ0); +			local_irq_restore(flags); +		} else { +			buf = page_address(pc->sg->page) + pc->sg->offset; +			drive->hwif->atapi_output_bytes(drive, +						buf + pc->b_count, count); +		} +		bcount -= count; pc->b_count += count;  		if (pc->b_count == pc->sg->length) {  			pc->sg++;  			pc->b_count = 0; | 
