@@ -730,20 +730,25 @@ static void snapshot_merge_process(struct dm_snapshot *s)
test_again:
/* Reallocate other snapshots; must account for all 'linear_chunks' */
- down_read(&_origins_lock);
- o = __lookup_origin(s->origin->bdev);
must_wait = 0;
- min_chunksize = __minimum_chunk_size(o);
+ /*
+ * Merging snapshot already has the origin's __minimum_chunk_size()
+ * stored in split_io (see: snapshot_merge_resume); avoid rediscovery
+ */
+ min_chunksize = s->ti->split_io;
if (min_chunksize) {
chunk_t n;
+
+ down_read(&_origins_lock);
+ o = __lookup_origin(s->origin->bdev);
for (n = 0; n < io_size; n += min_chunksize) {
r = __origin_write(&o->snapshots, dest.sector + n,
NULL);
if (r == DM_MAPIO_SUBMITTED)
must_wait = 1;
}
+ up_read(&_origins_lock);
}
- up_read(&_origins_lock);
if (must_wait) {
sleep_on_timeout(&_pending_exception_done, HZ / 100 + 1);
goto test_again;