drivers/block/cryptoloop.c | 0 drivers/block/loop.c | 39 +++++++++++++++++++-------------------- include/linux/loop.h | 0 3 files changed, 19 insertions(+), 20 deletions(-) diff -puN drivers/block/cryptoloop.c~loop-highmem-fixes drivers/block/cryptoloop.c diff -puN drivers/block/loop.c~loop-highmem-fixes drivers/block/loop.c --- 25/drivers/block/loop.c~loop-highmem-fixes 2003-10-31 01:02:35.000000000 -0800 +++ 25-akpm/drivers/block/loop.c 2003-10-31 01:02:35.000000000 -0800 @@ -81,18 +81,16 @@ static int transfer_none(struct loop_dev struct page *loop_page, unsigned loop_off, int size, sector_t real_block) { - char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off; - char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off; + char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off; + char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off; - if (raw_buf != loop_buf) { - if (cmd == READ) - memcpy(loop_buf, raw_buf, size); - else - memcpy(raw_buf, loop_buf, size); - } + if (cmd == READ) + memcpy(loop_buf, raw_buf, size); + else + memcpy(raw_buf, loop_buf, size); - kunmap_atomic(raw_page, KM_USER0); - kunmap_atomic(loop_page, KM_USER1); + kunmap_atomic(raw_buf, KM_USER0); + kunmap_atomic(loop_buf, KM_USER1); cond_resched(); return 0; } @@ -102,10 +100,10 @@ static int transfer_xor(struct loop_devi struct page *loop_page, unsigned loop_off, int size, sector_t real_block) { - char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off; - char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off; - char *in, *out, *key; - int i, keysize; + char *raw_buf = kmap_atomic(raw_page, KM_USER0) + raw_off; + char *loop_buf = kmap_atomic(loop_page, KM_USER1) + loop_off; + char *in, *out, *key; + int i, keysize; if (cmd == READ) { in = raw_buf; @@ -120,8 +118,8 @@ static int transfer_xor(struct loop_devi for (i = 0; i < size; i++) *out++ = *in++ ^ key[(i & 511) % keysize]; - kunmap_atomic(raw_page, KM_USER0); - kunmap_atomic(loop_page, KM_USER1); + kunmap_atomic(raw_buf, KM_USER0); + kunmap_atomic(loop_buf, KM_USER1); cond_resched(); return 0; } @@ -225,17 +223,19 @@ do_lo_send(struct loop_device *lo, struc bvec->bv_page, bv_offs, size, IV); if (transfer_result) { + char *kaddr; + /* * The transfer failed, but we still write the data to * keep prepare/commit calls balanced. */ printk(KERN_ERR "loop: transfer error block %llu\n", (unsigned long long)index); - memset(kmap_atomic(page, KM_USER0) + offset, 0, size); - kunmap_atomic(page, KM_USER0); + kaddr = kmap_atomic(page, KM_USER0); + memset(kaddr + offset, 0, size); + kunmap_atomic(kaddr, KM_USER0); } flush_dcache_page(page); - kunmap(page); if (aops->commit_write(file, page, offset, offset+size)) goto unlock; if (transfer_result) @@ -250,7 +250,6 @@ do_lo_send(struct loop_device *lo, struc } up(&mapping->host->i_sem); out: - kunmap(bvec->bv_page); return ret; unlock: diff -puN include/linux/loop.h~loop-highmem-fixes include/linux/loop.h _