[PATCH 1/4] [Target_Core_Mod]: Move core se_port_t logic to target_core_device.c

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



>From 12ba78888935ebf41ee769f57aced3e3599c7a8c Mon Sep 17 00:00:00 2001
From: Nicholas Bellinger <nab@xxxxxxxxxxxxxxx>
Date: Sun, 1 Feb 2009 21:29:03 -0800
Subject: [PATCH 1/4] [Target_Core_Mod]: Move core se_port_t logic to target_core_device.c

This patch adds core_alloc_port(), core_export_port() and core_release_port()
and adds their usage in dev_obj_export() and dev_obj_unexport().

Also, in core_alloc_port() the RELATIVE TARGET PORT IDENTIFER gets set to
a unique 16-bit value per se_device_t using se_device_t->dev_rpti_counter.
This value now replaces previous SCSI MIB SCSI_PORT_INDEX usage with
se_port_t->sep_rtpi for SCSI MIB se_port_t->sep_index value assignment.

Here is what it looks like with active LIO-Target v3.0 iSCSI Target ports,
the RELATIVE TARGET PORT IDENTIFER is displayed under the port_index column:

The first two rows are for a single Target_Core_Mod/IBLOCK storage object that
is exported across two different iSCSI Target Endports (TargetName+TPGT):

target:# cat /proc/scsi_target/mib/scsi_tgt_port
inst device indx name port_index in_cmds write_mbytes read_mbytes hs_in_cmds
1 1 0 iSCSIPort#0 iqn.2003-01.org.linux-iscsi.target.i686:sn.e475ed6fcdd0+t+1 20 0 0 0
1 1 1 iSCSIPort#1 iqn.2003-01.org.linux-iscsi.target.i686:sn.cff3eedbd2fd+t+1 9 0 0 0
2 2 0 iSCSIPort#0 iqn.2003-01.org.linux-iscsi.target.i686:sn.e475ed6fcdd0+t+1 0 0 0 0
3 3 0 iSCSIPort#0 iqn.2003-01.org.linux-iscsi.target.i686:sn.e475ed6fcdd0+t+1 0 0 0 0

Signed-off-by: Nicholas A. Bellinger <nab@xxxxxxxxxxxxxxx>
---
 drivers/lio-core/target_core_base.h   |    4 +-
 drivers/lio-core/target_core_device.c |   66 +++++++++++++++++++++++++++++++++
 drivers/lio-core/target_core_device.h |    3 +
 drivers/lio-core/target_core_mib.h    |    1 -
 drivers/lio-core/target_core_seobj.c  |   33 +++-------------
 5 files changed, 78 insertions(+), 29 deletions(-)

diff --git a/drivers/lio-core/target_core_base.h b/drivers/lio-core/target_core_base.h
index c900517..5e979ff 100644
--- a/drivers/lio-core/target_core_base.h
+++ b/drivers/lio-core/target_core_base.h
@@ -536,7 +536,9 @@ typedef struct se_device_s {
 	u8			type;		/* Type of disk transport used for device */
 	u8			thread_active;	/* Set to 1 if thread is NOT sleeping on thread_sem */
 	u8			dev_status_timer_flags;
+	u16			dev_rpti_counter; /* RELATIVE TARGET PORT IDENTIFER Counter */
 	u32			dev_flags;
+	u32			dev_port_count;
 	u32			dev_status;
 	u32			dev_tcq_window_closed;
 	u32			queue_depth;	/* Physical device queue depth */
@@ -544,7 +546,6 @@ typedef struct se_device_s {
 	void 			*dev_ptr; 	/* Pointer to transport specific device structure */
 #ifdef SNMP_SUPPORT
 	u32			dev_index;
-	u32			dev_port_count;
 	u64			creation_time;
 	u32			num_resets;
 	u64			num_cmds;
@@ -653,6 +654,7 @@ typedef struct se_lun_s {
 #define LUN_OBJ_API(lun)	((struct se_obj_lun_type_s *)(lun)->lun_obj_api)
 
 typedef struct se_port_s {
+	u16		sep_rtpi; /* RELATIVE TARGET PORT IDENTIFER */
 #ifdef SNMP_SUPPORT
         u32             sep_index;
         scsi_port_stats_t sep_stats;
diff --git a/drivers/lio-core/target_core_device.c b/drivers/lio-core/target_core_device.c
index 98334a4..53741d8 100644
--- a/drivers/lio-core/target_core_device.c
+++ b/drivers/lio-core/target_core_device.c
@@ -491,6 +491,72 @@ extern void core_clear_lun_from_tpg (se_lun_t *lun, se_portal_group_t *tpg)
         return;
 }
 
+extern se_port_t *core_alloc_port (se_device_t *dev)
+{
+	se_port_t *port, *port_tmp;
+	
+	if (!(port = kzalloc(sizeof(se_port_t), GFP_KERNEL))) {
+		printk(KERN_ERR "Unable to allocate se_port_t\n");
+		return(NULL);
+	}
+	INIT_LIST_HEAD(&port->sep_list);
+
+	spin_lock(&dev->se_port_lock);
+	if (dev->dev_port_count == 0x0000ffff) {
+		printk(KERN_WARNING "Reached dev->dev_port_count == 0x0000ffff\n");
+		spin_unlock(&dev->se_port_lock);
+		return(NULL);
+	}
+again:
+	port->sep_rtpi = dev->dev_rpti_counter++;
+	list_for_each_entry(port_tmp, &dev->dev_sep_list, sep_list) {
+		/*
+		 * Make sure RELATIVE TARGET PORT IDENTIFER is unique
+		 * for 16-bit wrap..
+		 */
+		if (port->sep_rtpi == port_tmp->sep_rtpi) 
+			goto again;
+	}
+	spin_unlock(&dev->se_port_lock);
+
+	return(port);
+}
+
+extern void core_export_port (
+	se_device_t *dev,
+	se_portal_group_t *tpg,
+	se_port_t *port,
+	se_lun_t *lun)
+{
+	spin_lock(&dev->se_port_lock);
+	spin_lock(&lun->lun_sep_lock);
+	port->sep_tpg = tpg;
+	port->sep_lun = lun;
+	lun->lun_sep = port;
+	spin_unlock(&lun->lun_sep_lock);
+
+	list_add_tail(&port->sep_list, &dev->dev_sep_list);
+	spin_unlock(&dev->se_port_lock);
+
+	dev->dev_port_count++;
+#ifdef SNMP_SUPPORT
+	port->sep_index = port->sep_rtpi; /* RELATIVE TARGET PORT IDENTIFER */
+#endif
+	return;
+}
+
+/*
+ *	Called with se_device_t->se_port_lock spinlock held.
+ */
+extern void core_release_port (se_device_t *dev, se_port_t *port)
+{
+	list_del(&port->sep_list);
+	dev->dev_port_count--;
+	kfree(port);
+
+	return;
+}
+
 extern int transport_core_report_lun_response (se_cmd_t *se_cmd)
 {
 	se_dev_entry_t *deve;
diff --git a/drivers/lio-core/target_core_device.h b/drivers/lio-core/target_core_device.h
index c2d4b12..eff0c0a 100644
--- a/drivers/lio-core/target_core_device.h
+++ b/drivers/lio-core/target_core_device.h
@@ -40,6 +40,9 @@ extern void core_dec_lacl_count (struct se_node_acl_s *, struct se_cmd_s *);
 extern void core_update_device_list_access (u32, u32, se_node_acl_t *);
 extern void core_update_device_list_for_node (se_lun_t *lun, u32, u32, se_node_acl_t *, se_portal_group_t *, int);
 extern void core_clear_lun_from_tpg (se_lun_t *, se_portal_group_t *);
+extern struct se_port_s *core_alloc_port (struct se_device_s *);
+extern void core_export_port (struct se_device_s *, struct se_portal_group_s *, struct se_port_s *, struct se_lun_s *);
+extern void core_release_port (struct se_device_s *, struct se_port_s *);
 extern int transport_core_report_lun_response (se_cmd_t *);
 extern void se_release_device_for_hba (se_device_t *);
 extern void se_release_evpd_for_dev (se_device_t *);
diff --git a/drivers/lio-core/target_core_mib.h b/drivers/lio-core/target_core_mib.h
index d4a9d31..127d113 100644
--- a/drivers/lio-core/target_core_mib.h
+++ b/drivers/lio-core/target_core_mib.h
@@ -30,7 +30,6 @@
 typedef enum {
 	SCSI_INST_INDEX,
 	SCSI_DEVICE_INDEX,
-	SCSI_PORT_INDEX,
 	SCSI_AUTH_INTR_INDEX,
 	SCSI_INDEX_TYPE_MAX
 } scsi_index_t;
diff --git a/drivers/lio-core/target_core_seobj.c b/drivers/lio-core/target_core_seobj.c
index 182a016..643659c 100644
--- a/drivers/lio-core/target_core_seobj.c
+++ b/drivers/lio-core/target_core_seobj.c
@@ -185,45 +185,28 @@ extern void dev_put_obj (void *p)
 extern int dev_obj_export (void *p, se_portal_group_t *tpg, se_lun_t *lun)
 {
 	se_device_t *dev  = (se_device_t *)p;
-	se_port_t *sep;
+	se_port_t *port;
 
-	if (!(sep = kmalloc(sizeof(se_port_t), GFP_KERNEL))) {
-		TRACE_ERROR("Unable to allocate se_port_t\n");
+	if (!(port = core_alloc_port(dev)))
 		return(-1);
-	}
-	memset(sep, 0, sizeof(se_port_t));
-	INIT_LIST_HEAD(&sep->sep_list);
 
 	lun->se_dev = dev;
 	if (DEV_OBJ_API(dev)->activate(p) < 0) {
 		lun->se_dev = NULL;
-		kfree(sep);
+		kfree(port);
 		return(-1);
 	}
 
 	DEV_OBJ_API(dev)->inc_count(&dev->dev_export_obj);
 
-	spin_lock(&dev->se_port_lock);
-	spin_lock(&lun->lun_sep_lock);
-	sep->sep_tpg = tpg;
-	sep->sep_lun = lun;
-	lun->lun_sep = sep;
-	spin_unlock(&lun->lun_sep_lock);
-
-	list_add_tail(&sep->sep_list, &dev->dev_sep_list);
-	spin_unlock(&dev->se_port_lock);
-#ifdef SNMP_SUPPORT
-	dev->dev_port_count++;
-	sep->sep_index = scsi_get_new_index(SCSI_PORT_INDEX);
-#endif
-
+	core_export_port(dev, tpg, port, lun);
 	return(0);
 }
 
 extern void dev_obj_unexport (void *p, se_portal_group_t *tpg, se_lun_t *lun)
 {
 	se_device_t *dev  = (se_device_t *)p;
-	se_port_t *sep = lun->lun_sep;
+	se_port_t *port = lun->lun_sep;
 
 	spin_lock(&dev->se_port_lock);
 	spin_lock(&lun->lun_sep_lock);
@@ -236,12 +219,8 @@ extern void dev_obj_unexport (void *p, se_portal_group_t *tpg, se_lun_t *lun)
 
 	DEV_OBJ_API(dev)->dec_count(&dev->dev_export_obj);
 
-	list_del(&sep->sep_list);
+	core_release_port(dev, port);
 	spin_unlock(&dev->se_port_lock);
-#ifdef SNMP_SUPPORT
-	dev->dev_port_count--;
-#endif  
-	kfree(sep);
 
 	DEV_OBJ_API(dev)->deactivate(p);
 	lun->se_dev = NULL;
-- 
1.5.4.1



--
To unsubscribe from this list: send the line "unsubscribe linux-scsi" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [SCSI Target Devel]     [Linux SCSI Target Infrastructure]     [Kernel Newbies]     [IDE]     [Security]     [Git]     [Netfilter]     [Bugtraq]     [Yosemite News]     [MIPS Linux]     [ARM Linux]     [Linux Security]     [Linux RAID]     [Linux ATA RAID]     [Linux IIO]     [Samba]     [Device Mapper]
  Powered by Linux