]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
target: break up free_device callback
authorMike Christie <mchristi@redhat.com>
Fri, 23 Jun 2017 06:18:12 +0000 (01:18 -0500)
committerNicholas Bellinger <nab@linux-iscsi.org>
Fri, 7 Jul 2017 06:11:37 +0000 (23:11 -0700)
With this patch free_device is now used to free what is allocated in the
alloc_device callback and destroy_device tears down the resources that are
setup in the configure_device callback.

This patch will be needed in the next patch where tcmu needs
to be able to look up the device in the destroy callback.

Signed-off-by: Mike Christie <mchristi@redhat.com>
Reviewed-by: Bart Van Assche <bart.vanassche@wdc.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
drivers/target/target_core_device.c
drivers/target/target_core_file.c
drivers/target/target_core_iblock.c
drivers/target/target_core_pscsi.c
drivers/target/target_core_rd.c
drivers/target/target_core_user.c
include/target/target_core_backend.h

index 11c80c47b9d3e514686ae57fd1d6307101752cd4..16a701fed66b265d7813f3c4c13d0d1a23be1bfb 100644 (file)
@@ -974,6 +974,8 @@ void target_free_device(struct se_device *dev)
        if (dev->dev_flags & DF_CONFIGURED) {
                destroy_workqueue(dev->tmr_wq);
 
+               dev->transport->destroy_device(dev);
+
                mutex_lock(&g_device_mutex);
                list_del(&dev->g_dev_node);
                mutex_unlock(&g_device_mutex);
index 73b8f93a5fefbf18dfe06f763ffc07ceaca059a3..50f2355805461755e43aa9d0854d02e85a876e02 100644 (file)
@@ -236,6 +236,11 @@ static void fd_dev_call_rcu(struct rcu_head *p)
 }
 
 static void fd_free_device(struct se_device *dev)
+{
+       call_rcu(&dev->rcu_head, fd_dev_call_rcu);
+}
+
+static void fd_destroy_device(struct se_device *dev)
 {
        struct fd_dev *fd_dev = FD_DEV(dev);
 
@@ -243,7 +248,6 @@ static void fd_free_device(struct se_device *dev)
                filp_close(fd_dev->fd_file, NULL);
                fd_dev->fd_file = NULL;
        }
-       call_rcu(&dev->rcu_head, fd_dev_call_rcu);
 }
 
 static int fd_do_rw(struct se_cmd *cmd, struct file *fd,
@@ -826,6 +830,7 @@ static const struct target_backend_ops fileio_ops = {
        .detach_hba             = fd_detach_hba,
        .alloc_device           = fd_alloc_device,
        .configure_device       = fd_configure_device,
+       .destroy_device         = fd_destroy_device,
        .free_device            = fd_free_device,
        .parse_cdb              = fd_parse_cdb,
        .set_configfs_dev_params = fd_set_configfs_dev_params,
index b2044133d747c725a2ad653d347904592bdcec8c..a5e16f715392031712027e08b7a2aeaef31e6a97 100644 (file)
@@ -189,6 +189,11 @@ static void iblock_dev_call_rcu(struct rcu_head *p)
 }
 
 static void iblock_free_device(struct se_device *dev)
+{
+       call_rcu(&dev->rcu_head, iblock_dev_call_rcu);
+}
+
+static void iblock_destroy_device(struct se_device *dev)
 {
        struct iblock_dev *ib_dev = IBLOCK_DEV(dev);
 
@@ -196,8 +201,6 @@ static void iblock_free_device(struct se_device *dev)
                blkdev_put(ib_dev->ibd_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
        if (ib_dev->ibd_bio_set != NULL)
                bioset_free(ib_dev->ibd_bio_set);
-
-       call_rcu(&dev->rcu_head, iblock_dev_call_rcu);
 }
 
 static unsigned long long iblock_emulate_read_cap_with_block_size(
@@ -858,6 +861,7 @@ static const struct target_backend_ops iblock_ops = {
        .detach_hba             = iblock_detach_hba,
        .alloc_device           = iblock_alloc_device,
        .configure_device       = iblock_configure_device,
+       .destroy_device         = iblock_destroy_device,
        .free_device            = iblock_free_device,
        .parse_cdb              = iblock_parse_cdb,
        .set_configfs_dev_params = iblock_set_configfs_dev_params,
index e0be4aa3832833da778bc684119647ce65ab8649..7d944b23aeeee1b4439ffb2919faff9e1b6e1042 100644 (file)
@@ -563,6 +563,11 @@ static void pscsi_dev_call_rcu(struct rcu_head *p)
 }
 
 static void pscsi_free_device(struct se_device *dev)
+{
+       call_rcu(&dev->rcu_head, pscsi_dev_call_rcu);
+}
+
+static void pscsi_destroy_device(struct se_device *dev)
 {
        struct pscsi_dev_virt *pdv = PSCSI_DEV(dev);
        struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
@@ -592,7 +597,6 @@ static void pscsi_free_device(struct se_device *dev)
 
                pdv->pdv_sd = NULL;
        }
-       call_rcu(&dev->rcu_head, pscsi_dev_call_rcu);
 }
 
 static void pscsi_transport_complete(struct se_cmd *cmd, struct scatterlist *sg,
@@ -1084,6 +1088,7 @@ static const struct target_backend_ops pscsi_ops = {
        .pmode_enable_hba       = pscsi_pmode_enable_hba,
        .alloc_device           = pscsi_alloc_device,
        .configure_device       = pscsi_configure_device,
+       .destroy_device         = pscsi_destroy_device,
        .free_device            = pscsi_free_device,
        .transport_complete     = pscsi_transport_complete,
        .parse_cdb              = pscsi_parse_cdb,
index d12967690054dd160a94770cc6acabfb1207208c..a6e8106abd6ffbcf44f76aa24622b52b473a5e10 100644 (file)
@@ -338,11 +338,15 @@ static void rd_dev_call_rcu(struct rcu_head *p)
 }
 
 static void rd_free_device(struct se_device *dev)
+{
+       call_rcu(&dev->rcu_head, rd_dev_call_rcu);
+}
+
+static void rd_destroy_device(struct se_device *dev)
 {
        struct rd_dev *rd_dev = RD_DEV(dev);
 
        rd_release_device_space(rd_dev);
-       call_rcu(&dev->rcu_head, rd_dev_call_rcu);
 }
 
 static struct rd_dev_sg_table *rd_get_sg_table(struct rd_dev *rd_dev, u32 page)
@@ -651,6 +655,7 @@ static const struct target_backend_ops rd_mcp_ops = {
        .detach_hba             = rd_detach_hba,
        .alloc_device           = rd_alloc_device,
        .configure_device       = rd_configure_device,
+       .destroy_device         = rd_destroy_device,
        .free_device            = rd_free_device,
        .parse_cdb              = rd_parse_cdb,
        .set_configfs_dev_params = rd_set_configfs_dev_params,
index ca5b081295db84f039e13aa812b70e8f62433ab0..e58127b8db8af27690cef4305bb2e37dcf4dd779 100644 (file)
@@ -1379,6 +1379,14 @@ static void tcmu_blocks_release(struct tcmu_dev *udev)
 }
 
 static void tcmu_free_device(struct se_device *dev)
+{
+       struct tcmu_dev *udev = TCMU_DEV(dev);
+
+       /* release ref from init */
+       kref_put(&udev->kref, tcmu_dev_kref_release);
+}
+
+static void tcmu_destroy_device(struct se_device *dev)
 {
        struct tcmu_dev *udev = TCMU_DEV(dev);
        struct tcmu_cmd *cmd;
@@ -1411,9 +1419,6 @@ static void tcmu_free_device(struct se_device *dev)
 
                uio_unregister_device(&udev->uio_info);
        }
-
-       /* release ref from init */
-       kref_put(&udev->kref, tcmu_dev_kref_release);
 }
 
 enum {
@@ -1705,6 +1710,7 @@ static struct target_backend_ops tcmu_ops = {
        .detach_hba             = tcmu_detach_hba,
        .alloc_device           = tcmu_alloc_device,
        .configure_device       = tcmu_configure_device,
+       .destroy_device         = tcmu_destroy_device,
        .free_device            = tcmu_free_device,
        .parse_cdb              = tcmu_parse_cdb,
        .set_configfs_dev_params = tcmu_set_configfs_dev_params,
index b76071161cdc7f86816b3457e2aecdebb7f51d1e..3dbcacd7e8d7a98d4499ed6ed873ec4e18770920 100644 (file)
@@ -30,6 +30,7 @@ struct target_backend_ops {
 
        struct se_device *(*alloc_device)(struct se_hba *, const char *);
        int (*configure_device)(struct se_device *);
+       void (*destroy_device)(struct se_device *);
        void (*free_device)(struct se_device *device);
 
        ssize_t (*set_configfs_dev_params)(struct se_device *,