Move lock out of do_origin to the caller. It will be needed for further patches. Signed-off-by: Mikulas Patocka --- drivers/md/dm-snap.c | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) Index: linux-2.6.26-rc5-devel/drivers/md/dm-snap.c =================================================================== --- linux-2.6.26-rc5-devel.orig/drivers/md/dm-snap.c 2008-06-17 01:19:59.000000000 +0200 +++ linux-2.6.26-rc5-devel/drivers/md/dm-snap.c 2008-06-17 01:20:04.000000000 +0200 @@ -1026,7 +1026,9 @@ while (bio) { n = bio->bi_next; bio->bi_next = NULL; + down_read(&_origins_lock); r = do_origin(s->origin, bio); + up_read(&_origins_lock); if (r == DM_MAPIO_REMAPPED) generic_make_request(bio); else @@ -1362,12 +1364,16 @@ if (bio_rw(bio) == WRITE) { up_write(&s->lock); - return do_origin(s->origin, bio); + down_read(&_origins_lock); + r = do_origin(s->origin, bio); + up_read(&_origins_lock); + goto out; } out_unlock: up_write(&s->lock); + out: return r; } @@ -1549,11 +1555,9 @@ struct origin *o; int r = DM_MAPIO_REMAPPED; - down_read(&_origins_lock); o = __lookup_origin(origin->bdev); if (o) r = __origin_write(&o->snapshots, bio->bi_sector, bio); - up_read(&_origins_lock); return r; } @@ -1599,11 +1603,18 @@ static int origin_map(struct dm_target *ti, struct bio *bio, union map_info *map_context) { + int r; struct dm_dev *dev = ti->private; - bio->bi_bdev = dev->bdev; + down_read(&_origins_lock); + + bio->bi_bdev = dev->bdev; /* Only tell snapshots if this is a write */ - return (bio_rw(bio) == WRITE) ? do_origin(dev, bio) : DM_MAPIO_REMAPPED; + r = (bio_rw(bio) == WRITE) ? do_origin(dev, bio) : DM_MAPIO_REMAPPED; + + up_read(&_origins_lock); + + return r; } /*