target: add helper to find se_device by dev_index
authorMike Christie <mchristi@redhat.com>
Fri, 23 Jun 2017 06:18:14 +0000 (01:18 -0500)
committerNicholas Bellinger <nab@linux-iscsi.org>
Fri, 7 Jul 2017 06:11:38 +0000 (23:11 -0700)
This adds a helper to find a se_device by dev_index. It will
be used in the next patches so tcmu's netlink interface can
execute commands on specific devices.

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
include/target/target_core_backend.h

index f10dfe7b1d54e2916afc5f9106a84027551f700e..de1131612ddc8ebeb57eb1d552df4ee0bdaea06a 100644 (file)
@@ -880,6 +880,30 @@ sector_t target_to_linux_sector(struct se_device *dev, sector_t lb)
 }
 EXPORT_SYMBOL(target_to_linux_sector);
 
+/**
+ * target_find_device - find a se_device by its dev_index
+ * @id: dev_index
+ * @do_depend: true if caller needs target_depend_item to be done
+ *
+ * If do_depend is true, the caller must do a target_undepend_item
+ * when finished using the device.
+ *
+ * If do_depend is false, the caller must be called in a configfs
+ * callback or during removal.
+ */
+struct se_device *target_find_device(int id, bool do_depend)
+{
+       struct se_device *dev;
+
+       mutex_lock(&g_device_mutex);
+       dev = idr_find(&devices_idr, id);
+       if (dev && do_depend && target_depend_item(&dev->dev_group.cg_item))
+               dev = NULL;
+       mutex_unlock(&g_device_mutex);
+       return dev;
+}
+EXPORT_SYMBOL(target_find_device);
+
 int target_configure_device(struct se_device *dev)
 {
        struct se_hba *hba = dev->se_hba;
index 3dbcacd7e8d7a98d4499ed6ed873ec4e18770920..1f2b7007f2df34c4fcecfaec84974d5ffd0d57d8 100644 (file)
@@ -106,6 +106,8 @@ bool        target_lun_is_rdonly(struct se_cmd *);
 sense_reason_t passthrough_parse_cdb(struct se_cmd *cmd,
        sense_reason_t (*exec_cmd)(struct se_cmd *cmd));
 
+struct se_device *target_find_device(int id, bool do_depend);
+
 bool target_sense_desc_format(struct se_device *dev);
 sector_t target_to_linux_sector(struct se_device *dev, sector_t lb);
 bool target_configure_unmap_from_queue(struct se_dev_attrib *attrib,