RDMA/srp: Remove the srp_host.released completion
authorBart Van Assche <bvanassche@acm.org>
Thu, 25 Aug 2022 21:38:58 +0000 (14:38 -0700)
committerLeon Romanovsky <leonro@nvidia.com>
Sun, 28 Aug 2022 10:02:12 +0000 (13:02 +0300)
Move the kfree(host) calls into srp_release_dev(). Convert a
device_unregister() call into a device_del() and a device_put() call.
Remove the host->released completion object. This patch prepares for
handling dev_set_name() failure in srp_add_port().

Link: https://lore.kernel.org/r/20220825213900.864587-3-bvanassche@acm.org
Signed-off-by: Bart Van Assche <bvanassche@acm.org>
Signed-off-by: Leon Romanovsky <leon@kernel.org>
drivers/infiniband/ulp/srp/ib_srp.c
drivers/infiniband/ulp/srp/ib_srp.h

index 8fd6a88..1d3a15e 100644 (file)
@@ -3178,7 +3178,7 @@ static void srp_release_dev(struct device *dev)
        struct srp_host *host =
                container_of(dev, struct srp_host, dev);
 
-       complete(&host->released);
+       kfree(host);
 }
 
 static struct class srp_class = {
@@ -3898,7 +3898,6 @@ static struct srp_host *srp_add_port(struct srp_device *device, u8 port)
 
        INIT_LIST_HEAD(&host->target_list);
        spin_lock_init(&host->target_lock);
-       init_completion(&host->released);
        mutex_init(&host->add_target_mutex);
        host->srp_dev = device;
        host->port = port;
@@ -3922,8 +3921,6 @@ static struct srp_host *srp_add_port(struct srp_device *device, u8 port)
 put_host:
        device_del(&host->dev);
        put_device(&host->dev);
-       kfree(host);
-
        return NULL;
 }
 
@@ -4029,12 +4026,11 @@ static void srp_remove_one(struct ib_device *device, void *client_data)
        srp_dev = client_data;
 
        list_for_each_entry_safe(host, tmp_host, &srp_dev->dev_list, list) {
-               device_unregister(&host->dev);
                /*
-                * Wait for the sysfs entry to go away, so that no new
-                * target ports can be created.
+                * Remove the add_target sysfs entry so that no new target ports
+                * can be created.
                 */
-               wait_for_completion(&host->released);
+               device_del(&host->dev);
 
                /*
                 * Remove all target ports.
@@ -4052,7 +4048,7 @@ static void srp_remove_one(struct ib_device *device, void *client_data)
                 */
                flush_workqueue(srp_remove_wq);
 
-               kfree(host);
+               put_device(&host->dev);
        }
 
        ib_dealloc_pd(srp_dev->pd);
index 55a575e..493e7fd 100644 (file)
@@ -124,7 +124,6 @@ struct srp_host {
        struct device           dev;
        struct list_head        target_list;
        spinlock_t              target_lock;
-       struct completion       released;
        struct list_head        list;
        struct mutex            add_target_mutex;
 };