Message ID | 20221115141054.1051801-6-yukuai1@huaweicloud.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
Series | fix delayed holder tracking | expand |
Looks good:
Reviewed-by: Christoph Hellwig <hch@lst.de>
On Tue, Nov 15 2022 at 9:10P -0500, Yu Kuai <yukuai1@huaweicloud.com> wrote: > From: Yu Kuai <yukuai3@huawei.com> > > open_table_device() and close_table_device() is protected by > table_devices_lock, hence use it to protect add_disk() and > del_gendisk(). > > Prepare to track per-add_disk holder relations in dm. > > Signed-off-by: Yu Kuai <yukuai3@huawei.com> > --- > drivers/md/dm.c | 16 ++++++++++++++++ > 1 file changed, 16 insertions(+) > > diff --git a/drivers/md/dm.c b/drivers/md/dm.c > index 2917700b1e15..3728b56b364b 100644 > --- a/drivers/md/dm.c > +++ b/drivers/md/dm.c > @@ -1952,7 +1952,14 @@ static void cleanup_mapped_device(struct mapped_device *md) > spin_unlock(&_minor_lock); > if (dm_get_md_type(md) != DM_TYPE_NONE) { > dm_sysfs_exit(md); > + > + /* > + * Hold lock to make sure del_gendisk() won't concurrent > + * with open/close_table_device(). > + */ > + mutex_lock(&md->table_devices_lock); > del_gendisk(md->disk); > + mutex_unlock(&md->table_devices_lock); > } > dm_queue_destroy_crypto_profile(md->queue); > put_disk(md->disk); > @@ -2312,15 +2319,24 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t) > if (r) > return r; > > + /* > + * Hold lock to make sure add_disk() and del_gendisk() won't concurrent > + * with open_table_device() and close_table_device(). > + */ > + mutex_lock(&md->table_devices_lock); > r = add_disk(md->disk); > + mutex_unlock(&md->table_devices_lock); > if (r) > return r; > > r = dm_sysfs_init(md); > if (r) { > + mutex_lock(&md->table_devices_lock); > del_gendisk(md->disk); > + mutex_unlock(&md->table_devices_lock); > return r; > } > + > md->type = type; > return 0; > } > -- > 2.31.1 > In the new comments added: s/concurrent/race/ ? But otherwise: Reviewed-by: Mike Snitzer <snitzer@kernel.org>
diff --git a/drivers/md/dm.c b/drivers/md/dm.c index 2917700b1e15..3728b56b364b 100644 --- a/drivers/md/dm.c +++ b/drivers/md/dm.c @@ -1952,7 +1952,14 @@ static void cleanup_mapped_device(struct mapped_device *md) spin_unlock(&_minor_lock); if (dm_get_md_type(md) != DM_TYPE_NONE) { dm_sysfs_exit(md); + + /* + * Hold lock to make sure del_gendisk() won't concurrent + * with open/close_table_device(). + */ + mutex_lock(&md->table_devices_lock); del_gendisk(md->disk); + mutex_unlock(&md->table_devices_lock); } dm_queue_destroy_crypto_profile(md->queue); put_disk(md->disk); @@ -2312,15 +2319,24 @@ int dm_setup_md_queue(struct mapped_device *md, struct dm_table *t) if (r) return r; + /* + * Hold lock to make sure add_disk() and del_gendisk() won't concurrent + * with open_table_device() and close_table_device(). + */ + mutex_lock(&md->table_devices_lock); r = add_disk(md->disk); + mutex_unlock(&md->table_devices_lock); if (r) return r; r = dm_sysfs_init(md); if (r) { + mutex_lock(&md->table_devices_lock); del_gendisk(md->disk); + mutex_unlock(&md->table_devices_lock); return r; } + md->type = type; return 0; }