Skip to content

Commit

Permalink
target: use idr for se_device dev index
Browse files Browse the repository at this point in the history
In the next patches we will add tcmu netlink support that allows
userspace to send commands to target_core_user. To execute operations
on a se_device/tcmu_dev we need to be able to look up a dev by any old
id. This patch replaces the se_device->dev_index with a idr created
id.

The next patches will also remove the g_device_list and replace it with
the idr.

Signed-off-by: Mike Christie <mchristi@redhat.com>
Signed-off-by: Nicholas Bellinger <nab@linux-iscsi.org>
  • Loading branch information
Mike Christie authored and Nicholas Bellinger committed Jul 7, 2017
1 parent 9263470 commit 0a5eee6
Show file tree
Hide file tree
Showing 2 changed files with 26 additions and 5 deletions.
30 changes: 26 additions & 4 deletions drivers/target/target_core_device.c
Original file line number Diff line number Diff line change
Expand Up @@ -51,6 +51,7 @@

DEFINE_MUTEX(g_device_mutex);
LIST_HEAD(g_device_list);
static DEFINE_IDR(devices_idr);

static struct se_hba *lun0_hba;
/* not static, needed by tpg.c */
Expand Down Expand Up @@ -882,17 +883,34 @@ EXPORT_SYMBOL(target_to_linux_sector);
int target_configure_device(struct se_device *dev)
{
struct se_hba *hba = dev->se_hba;
int ret;
int ret, id;

if (dev->dev_flags & DF_CONFIGURED) {
pr_err("se_dev->se_dev_ptr already set for storage"
" object\n");
return -EEXIST;
}

/*
* Add early so modules like tcmu can use during its
* configuration.
*/
mutex_lock(&g_device_mutex);
/*
* Use cyclic to try and avoid collisions with devices
* that were recently removed.
*/
id = idr_alloc_cyclic(&devices_idr, dev, 0, INT_MAX, GFP_KERNEL);
mutex_unlock(&g_device_mutex);
if (id < 0) {
ret = -ENOMEM;
goto out;
}
dev->dev_index = id;

ret = dev->transport->configure_device(dev);
if (ret)
goto out;
goto out_free_index;
/*
* XXX: there is not much point to have two different values here..
*/
Expand All @@ -907,12 +925,11 @@ int target_configure_device(struct se_device *dev)
dev->dev_attrib.hw_block_size);
dev->dev_attrib.optimal_sectors = dev->dev_attrib.hw_max_sectors;

dev->dev_index = scsi_get_new_index(SCSI_DEVICE_INDEX);
dev->creation_time = get_jiffies_64();

ret = core_setup_alua(dev);
if (ret)
goto out;
goto out_free_index;

/*
* Startup the struct se_device processing thread
Expand Down Expand Up @@ -960,6 +977,10 @@ int target_configure_device(struct se_device *dev)

out_free_alua:
core_alua_free_lu_gp_mem(dev);
out_free_index:
mutex_lock(&g_device_mutex);
idr_remove(&devices_idr, dev->dev_index);
mutex_unlock(&g_device_mutex);
out:
se_release_vpd_for_dev(dev);
return ret;
Expand All @@ -977,6 +998,7 @@ void target_free_device(struct se_device *dev)
dev->transport->destroy_device(dev);

mutex_lock(&g_device_mutex);
idr_remove(&devices_idr, dev->dev_index);
list_del(&dev->g_dev_node);
mutex_unlock(&g_device_mutex);

Expand Down
1 change: 0 additions & 1 deletion include/target/target_core_base.h
Original file line number Diff line number Diff line change
Expand Up @@ -219,7 +219,6 @@ enum tcm_tmrsp_table {
*/
typedef enum {
SCSI_INST_INDEX,
SCSI_DEVICE_INDEX,
SCSI_AUTH_INTR_INDEX,
SCSI_INDEX_TYPE_MAX
} scsi_index_t;
Expand Down

0 comments on commit 0a5eee6

Please sign in to comment.