--- loop.c.orig Sun Feb 2 21:14:34 2003 +++ loop.c Sun Feb 2 21:34:01 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; @@ -276,7 +278,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; @@ -469,7 +471,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; @@ -530,7 +532,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;