drbd: destroy workqueue when drbd device was freed
authorWang ShaoBo <bobo.shaobowang@huawei.com>
Thu, 24 Nov 2022 01:58:17 +0000 (09:58 +0800)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sat, 31 Dec 2022 12:14:12 +0000 (13:14 +0100)
[ Upstream commit 8692814b77ca4228a99da8a005de0acf40af6132 ]

A submitter workqueue is dynamically allocated by init_submitter()
called by drbd_create_device(), we should destroy it when this
device is not needed or destroyed.

Fixes: 113fef9e20e0 ("drbd: prepare to queue write requests on a submit worker")
Signed-off-by: Wang ShaoBo <bobo.shaobowang@huawei.com>
Link: https://lore.kernel.org/r/20221124015817.2729789-3-bobo.shaobowang@huawei.com
Signed-off-by: Jens Axboe <axboe@kernel.dk>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/block/drbd/drbd_main.c

index be819f8..eaf20a3 100644 (file)
@@ -2244,6 +2244,8 @@ void drbd_destroy_device(struct kref *kref)
                kref_put(&peer_device->connection->kref, drbd_destroy_connection);
                kfree(peer_device);
        }
+       if (device->submit.wq)
+               destroy_workqueue(device->submit.wq);
        kfree(device);
        kref_put(&resource->kref, drbd_destroy_resource);
 }
@@ -2797,7 +2799,7 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
 
        err = add_disk(disk);
        if (err)
-               goto out_idr_remove_from_resource;
+               goto out_destroy_workqueue;
 
        /* inherit the connection state */
        device->state.conn = first_connection(resource)->cstate;
@@ -2811,6 +2813,8 @@ enum drbd_ret_code drbd_create_device(struct drbd_config_context *adm_ctx, unsig
        drbd_debugfs_device_add(device);
        return NO_ERROR;
 
+out_destroy_workqueue:
+       destroy_workqueue(device->submit.wq);
 out_idr_remove_from_resource:
        for_each_connection_safe(connection, n, resource) {
                peer_device = idr_remove(&connection->peer_devices, vnr);