--- x/drivers/md/dm-table.c +++ y/drivers/md/dm-table.c @@ -400,8 +400,8 @@ int dm_get_device(struct dm_target *ti, if (r) return r; } - refcount_inc(&dd->count); out: + refcount_inc(&dd->count); *result = dd->dm_dev; return 0; } --- x/drivers/md/dm-snap.c +++ y/drivers/md/dm-snap.c @@ -1390,6 +1390,7 @@ static int snapshot_ctr(struct dm_target if (r) goto bad_read_metadata; + dm_put_device(ti, s->cow); return 0; bad_read_metadata: --- x/drivers/md/dm.c +++ y/drivers/md/dm.c @@ -823,9 +823,8 @@ int dm_get_table_device(struct mapped_de mutex_unlock(&md->table_devices_lock); return PTR_ERR(td); } - } else { - refcount_inc(&td->count); } + refcount_inc(&td->count); mutex_unlock(&md->table_devices_lock); *result = &td->dm_dev;