target: break up free_device callback
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>
This commit is contained in:
parent
2d76443e02
commit
926347061e
|
@ -974,6 +974,8 @@ void target_free_device(struct se_device *dev)
|
||||||
if (dev->dev_flags & DF_CONFIGURED) {
|
if (dev->dev_flags & DF_CONFIGURED) {
|
||||||
destroy_workqueue(dev->tmr_wq);
|
destroy_workqueue(dev->tmr_wq);
|
||||||
|
|
||||||
|
dev->transport->destroy_device(dev);
|
||||||
|
|
||||||
mutex_lock(&g_device_mutex);
|
mutex_lock(&g_device_mutex);
|
||||||
list_del(&dev->g_dev_node);
|
list_del(&dev->g_dev_node);
|
||||||
mutex_unlock(&g_device_mutex);
|
mutex_unlock(&g_device_mutex);
|
||||||
|
|
|
@ -236,6 +236,11 @@ static void fd_dev_call_rcu(struct rcu_head *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void fd_free_device(struct se_device *dev)
|
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);
|
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);
|
filp_close(fd_dev->fd_file, NULL);
|
||||||
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,
|
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,
|
.detach_hba = fd_detach_hba,
|
||||||
.alloc_device = fd_alloc_device,
|
.alloc_device = fd_alloc_device,
|
||||||
.configure_device = fd_configure_device,
|
.configure_device = fd_configure_device,
|
||||||
|
.destroy_device = fd_destroy_device,
|
||||||
.free_device = fd_free_device,
|
.free_device = fd_free_device,
|
||||||
.parse_cdb = fd_parse_cdb,
|
.parse_cdb = fd_parse_cdb,
|
||||||
.set_configfs_dev_params = fd_set_configfs_dev_params,
|
.set_configfs_dev_params = fd_set_configfs_dev_params,
|
||||||
|
|
|
@ -189,6 +189,11 @@ static void iblock_dev_call_rcu(struct rcu_head *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void iblock_free_device(struct se_device *dev)
|
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);
|
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);
|
blkdev_put(ib_dev->ibd_bd, FMODE_WRITE|FMODE_READ|FMODE_EXCL);
|
||||||
if (ib_dev->ibd_bio_set != NULL)
|
if (ib_dev->ibd_bio_set != NULL)
|
||||||
bioset_free(ib_dev->ibd_bio_set);
|
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(
|
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,
|
.detach_hba = iblock_detach_hba,
|
||||||
.alloc_device = iblock_alloc_device,
|
.alloc_device = iblock_alloc_device,
|
||||||
.configure_device = iblock_configure_device,
|
.configure_device = iblock_configure_device,
|
||||||
|
.destroy_device = iblock_destroy_device,
|
||||||
.free_device = iblock_free_device,
|
.free_device = iblock_free_device,
|
||||||
.parse_cdb = iblock_parse_cdb,
|
.parse_cdb = iblock_parse_cdb,
|
||||||
.set_configfs_dev_params = iblock_set_configfs_dev_params,
|
.set_configfs_dev_params = iblock_set_configfs_dev_params,
|
||||||
|
|
|
@ -563,6 +563,11 @@ static void pscsi_dev_call_rcu(struct rcu_head *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void pscsi_free_device(struct se_device *dev)
|
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_dev_virt *pdv = PSCSI_DEV(dev);
|
||||||
struct pscsi_hba_virt *phv = dev->se_hba->hba_ptr;
|
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;
|
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,
|
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,
|
.pmode_enable_hba = pscsi_pmode_enable_hba,
|
||||||
.alloc_device = pscsi_alloc_device,
|
.alloc_device = pscsi_alloc_device,
|
||||||
.configure_device = pscsi_configure_device,
|
.configure_device = pscsi_configure_device,
|
||||||
|
.destroy_device = pscsi_destroy_device,
|
||||||
.free_device = pscsi_free_device,
|
.free_device = pscsi_free_device,
|
||||||
.transport_complete = pscsi_transport_complete,
|
.transport_complete = pscsi_transport_complete,
|
||||||
.parse_cdb = pscsi_parse_cdb,
|
.parse_cdb = pscsi_parse_cdb,
|
||||||
|
|
|
@ -338,11 +338,15 @@ static void rd_dev_call_rcu(struct rcu_head *p)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void rd_free_device(struct se_device *dev)
|
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);
|
struct rd_dev *rd_dev = RD_DEV(dev);
|
||||||
|
|
||||||
rd_release_device_space(rd_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)
|
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,
|
.detach_hba = rd_detach_hba,
|
||||||
.alloc_device = rd_alloc_device,
|
.alloc_device = rd_alloc_device,
|
||||||
.configure_device = rd_configure_device,
|
.configure_device = rd_configure_device,
|
||||||
|
.destroy_device = rd_destroy_device,
|
||||||
.free_device = rd_free_device,
|
.free_device = rd_free_device,
|
||||||
.parse_cdb = rd_parse_cdb,
|
.parse_cdb = rd_parse_cdb,
|
||||||
.set_configfs_dev_params = rd_set_configfs_dev_params,
|
.set_configfs_dev_params = rd_set_configfs_dev_params,
|
||||||
|
|
|
@ -1379,6 +1379,14 @@ static void tcmu_blocks_release(struct tcmu_dev *udev)
|
||||||
}
|
}
|
||||||
|
|
||||||
static void tcmu_free_device(struct se_device *dev)
|
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_dev *udev = TCMU_DEV(dev);
|
||||||
struct tcmu_cmd *cmd;
|
struct tcmu_cmd *cmd;
|
||||||
|
@ -1411,9 +1419,6 @@ static void tcmu_free_device(struct se_device *dev)
|
||||||
|
|
||||||
uio_unregister_device(&udev->uio_info);
|
uio_unregister_device(&udev->uio_info);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* release ref from init */
|
|
||||||
kref_put(&udev->kref, tcmu_dev_kref_release);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
|
@ -1705,6 +1710,7 @@ static struct target_backend_ops tcmu_ops = {
|
||||||
.detach_hba = tcmu_detach_hba,
|
.detach_hba = tcmu_detach_hba,
|
||||||
.alloc_device = tcmu_alloc_device,
|
.alloc_device = tcmu_alloc_device,
|
||||||
.configure_device = tcmu_configure_device,
|
.configure_device = tcmu_configure_device,
|
||||||
|
.destroy_device = tcmu_destroy_device,
|
||||||
.free_device = tcmu_free_device,
|
.free_device = tcmu_free_device,
|
||||||
.parse_cdb = tcmu_parse_cdb,
|
.parse_cdb = tcmu_parse_cdb,
|
||||||
.set_configfs_dev_params = tcmu_set_configfs_dev_params,
|
.set_configfs_dev_params = tcmu_set_configfs_dev_params,
|
||||||
|
|
|
@ -30,6 +30,7 @@ struct target_backend_ops {
|
||||||
|
|
||||||
struct se_device *(*alloc_device)(struct se_hba *, const char *);
|
struct se_device *(*alloc_device)(struct se_hba *, const char *);
|
||||||
int (*configure_device)(struct se_device *);
|
int (*configure_device)(struct se_device *);
|
||||||
|
void (*destroy_device)(struct se_device *);
|
||||||
void (*free_device)(struct se_device *device);
|
void (*free_device)(struct se_device *device);
|
||||||
|
|
||||||
ssize_t (*set_configfs_dev_params)(struct se_device *,
|
ssize_t (*set_configfs_dev_params)(struct se_device *,
|
||||||
|
|
Loading…
Reference in New Issue