--- drivers/block/loop.c.orig Fri Jun 20 11:02:10 2003 +++ drivers/block/loop.c Fri Jun 20 11:02:49 2003 @@ -79,6 +79,8 @@ #include +#define LOOP_IV_SECTOR_BITS 9 + static int max_loop = 8; static struct loop_device *loop_dev; static struct gendisk **disks; @@ -196,7 +198,7 @@ data = kmap(bvec->bv_page) + bvec->bv_offset; len = bvec->bv_len; while (len > 0) { - sector_t IV = index * (PAGE_CACHE_SIZE/bsize) + offset/bsize; + sector_t IV = (index << (PAGE_CACHE_SHIFT - LOOP_IV_SECTOR_BITS)) + (offset >> LOOP_IV_SECTOR_BITS); int transfer_result; size = PAGE_CACHE_SIZE - offset; @@ -279,7 +281,7 @@ unsigned long count = desc->count; struct lo_read_data *p = (struct lo_read_data*)desc->buf; struct loop_device *lo = p->lo; - int IV = page->index * (PAGE_CACHE_SIZE/p->bsize) + offset/p->bsize; + int IV = (page->index << (PAGE_CACHE_SHIFT - LOOP_IV_SECTOR_BITS)) + (offset >> LOOP_IV_SECTOR_BITS); if (size > count) size = count; @@ -484,7 +486,7 @@ bio_transfer(struct loop_device *lo, struct bio *to_bio, struct bio *from_bio) { - unsigned long IV = loop_get_iv(lo, from_bio->bi_sector); + unsigned long IV = from_bio->bi_sector + (lo->lo_offset >> LOOP_IV_SECTOR_BITS); struct bio_vec *from_bvec, *to_bvec; char *vto, *vfrom; int ret = 0, i; @@ -545,7 +547,7 @@ * piggy old buffer on original, and submit for I/O */ new_bio = loop_get_buffer(lo, old_bio); - IV = loop_get_iv(lo, old_bio->bi_sector); + IV = old_bio->bi_sector + (lo->lo_offset >> LOOP_IV_SECTOR_BITS); if (rw == WRITE) { if (bio_transfer(lo, new_bio, old_bio)) goto err;