diff --git a/drivers/md/dm-ioctl.c b/drivers/md/dm-ioctl.c index 5667cea55e71..42cca3642010 100644 --- a/drivers/md/dm-ioctl.c +++ b/drivers/md/dm-ioctl.c @@ -1264,9 +1264,12 @@ static int table_load(struct dm_ioctl *param, size_t param_size) if (r) goto out; + /* Protect md->type and md->queue against concurrent table loads. */ + dm_lock_md_type(md); r = populate_table(t, param, param_size); if (r) { dm_table_destroy(t); + dm_unlock_md_type(md); goto out; } @@ -1276,12 +1279,11 @@ static int table_load(struct dm_ioctl *param, size_t param_size) DMWARN("can't replace immutable target type %s", immutable_target_type->name); dm_table_destroy(t); + dm_unlock_md_type(md); r = -EINVAL; goto out; } - /* Protect md->type and md->queue against concurrent table loads. */ - dm_lock_md_type(md); if (dm_get_md_type(md) == DM_TYPE_NONE) /* Initial table load: acquire type of table. */ dm_set_md_type(md, dm_table_get_type(t)); diff --git a/drivers/md/dm-table.c b/drivers/md/dm-table.c index f309477d7efe..8f8783533ac7 100644 --- a/drivers/md/dm-table.c +++ b/drivers/md/dm-table.c @@ -888,9 +888,7 @@ static int dm_table_set_type(struct dm_table *t) * Determine the type from the live device. * Default to bio-based if device is new. */ - dm_lock_md_type(t->md); live_md_type = dm_get_md_type(t->md); - dm_unlock_md_type(t->md); if (live_md_type == DM_TYPE_REQUEST_BASED) request_based = 1; else diff --git a/drivers/md/dm.c b/drivers/md/dm.c index ef095a96d039..7faeaa3d4835 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -2235,11 +2235,13 @@ void dm_unlock_md_type(struct mapped_device *md) void dm_set_md_type(struct mapped_device *md, unsigned type) { + BUG_ON(!mutex_is_locked(&md->type_lock)); md->type = type; } unsigned dm_get_md_type(struct mapped_device *md) { + BUG_ON(!mutex_is_locked(&md->type_lock)); return md->type; }