--- drivers/md/dm-thin.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) Index: linux/drivers/md/dm-thin.c =================================================================== --- linux.orig/drivers/md/dm-thin.c +++ linux/drivers/md/dm-thin.c @@ -221,6 +221,7 @@ struct pool_c { struct thin_c { struct dm_dev *pool_dev; struct dm_dev *origin_dev; + sector_t origin_dev_size; dm_thin_id dev_id; struct pool *pool; @@ -1216,7 +1217,9 @@ static void process_bio(struct thin_c *t break; case -ENODATA: - if (bio_data_dir(bio) == READ && tc->origin_dev) { +// AGK FIXME Must also deal with overlap/splitting somewhere? + if (bio_data_dir(bio) == READ && tc->origin_dev && + bio->bi_sector + bio->bi_size > tc->origin_dev_size) { inc_all_io_entry(pool, bio); cell_defer_no_holder(tc, cell); @@ -2744,6 +2747,7 @@ static int thin_ctr(struct dm_target *ti goto bad_origin_dev; } tc->origin_dev = origin_dev; + tc->origin_dev_size = i_size_read(origin_dev->bdev->bd_inode) >> SECTOR_SHIFT; } r = dm_get_device(ti, argv[0], dm_table_get_mode(ti->table), &pool_dev);