From: "Nicholas A. Bellinger" <nab@linux-iscsi.org>
To: LKML <linux-kernel@vger.kernel.org>,
linux-scsi <linux-scsi@vger.kernel.org>
Cc: Douglas Gilbert <dgilbert@interlog.com>,
James Bottomley <James.Bottomley@HansenPartnership.com>,
Andrew Morton <akpm@linux-foundation.org>,
Mike Christie <michaelc@cs.wisc.edu>,
FUJITA Tomonori <fujita.tomonori@lab.ntt.co.jp>,
Hannes Reinecke <hare@suse.de>, Christoph Hellwig <hch@lst.de>,
"Ross S. W. Walker" <rswwalker@gmail.com>,
Arne Redlich <agr@powerkom-dd.de>,
Rafiu Fakunle <rafiu@openfiler.com>
Subject: [PATCH 4/6] [Target_Core_Mod/ALUA]: Add ALUA struct kmem_caches and update EVPD 0x83 information
Date: Fri, 06 Feb 2009 00:00:38 -0800 [thread overview]
Message-ID: <1233907238.12375.364.camel@haakon2.linux-iscsi.org> (raw)
>From 26cab633d02f548bba95b2b6c4677ce493165854 Mon Sep 17 00:00:00 2001
From: Nicholas Bellinger <nab@linux-iscsi.org>
Date: Thu, 5 Feb 2009 23:18:29 -0800
Subject: [PATCH 4/6] [Target_Core_Mod/ALUA]: Add ALUA struct kmem_caches and update EVPD 0x83 information
This patch adds t10_alua_lu_gp_cache and t10_alua_tg_pt_gp_cache for use with
ALUA Logical Unit Group and Target Port Group emulation.
This patch also updates transport_generic_emulate_inquiry() to set the values
from different ALUA Logical Unit Group and Target Port Group assocations in
EVPD 0x83 response data.
Also, this patch also adds the logic EVPD 0x83 Target port group identifier and
Logical Unit Group identifier are not returned in response data unless said
T10_ALUA(se_subsystem_dev_t)->alue_type == SPC3_ALUA_EMULATED.
Signed-off-by: Nicholas A. Bellinger <nab@linux-iscsi.org>
---
drivers/lio-core/target_core_transport.c | 56 ++++++++++++++++++++++++++----
1 files changed, 49 insertions(+), 7 deletions(-)
diff --git a/drivers/lio-core/target_core_transport.c b/drivers/lio-core/target_core_transport.c
index 28f3126..82ccd3c 100644
--- a/drivers/lio-core/target_core_transport.c
+++ b/drivers/lio-core/target_core_transport.c
@@ -209,6 +209,8 @@ struct kmem_cache *se_cmd_cache = NULL;
struct kmem_cache *se_task_cache = NULL;
struct kmem_cache *se_sess_cache = NULL;
struct kmem_cache *t10_pr_reg_cache = NULL;
+struct kmem_cache *t10_alua_lu_gp_cache = NULL;
+struct kmem_cache *t10_alua_tg_pt_gp_cache = NULL;
EXPORT_SYMBOL(se_global);
static int transport_generic_write_pending (se_cmd_t *);
@@ -254,8 +256,12 @@ extern int init_se_global (void)
return(-1);
};
+ INIT_LIST_HEAD(&global->g_lu_gps_list);
+ INIT_LIST_HEAD(&global->g_tg_pt_gps_list);
INIT_LIST_HEAD(&global->g_se_tpg_list);
spin_lock_init(&global->hba_lock);
+ spin_lock_init(&global->lu_gps_lock);
+ spin_lock_init(&global->tg_pt_gps_lock);
spin_lock_init(&global->plugin_class_lock);
if (!(se_cmd_cache = kmem_cache_create("se_cmd_cache",
@@ -280,6 +286,19 @@ extern int init_se_global (void)
printk(KERN_ERR "kmem_cache_create() for t10_pr_registration_t failed\n");
goto out;
}
+ if (!(t10_alua_lu_gp_cache = kmem_cache_create("t10_alua_lu_gp_cache",
+ sizeof(t10_alua_lu_gp_t), __alignof__(t10_alua_lu_gp_t),
+ 0, NULL))) {
+ printk(KERN_ERR "kmem_cache_create() for t10_alua_lu_gp_cache failed\n");
+ goto out;
+ }
+ if (!(t10_alua_tg_pt_gp_cache = kmem_cache_create("t10_alua_tg_pt_gp_cache",
+ sizeof(t10_alua_tg_pt_gp_t), __alignof__(t10_alua_tg_pt_gp_t),
+ 0, NULL))) {
+ printk(KERN_ERR "kmem_cache_create() for t10_alua_tg_pt_gp_cache failed\n");
+ goto out;
+ }
+
if (!(global->hba_list = kzalloc((sizeof(se_hba_t) *
TRANSPORT_MAX_GLOBAL_HBAS), GFP_KERNEL))) {
TRACE_ERROR("Unable to allocate global->hba_list\n");
@@ -319,6 +338,10 @@ out:
kmem_cache_destroy(se_sess_cache);
if (t10_pr_reg_cache)
kmem_cache_destroy(t10_pr_reg_cache);
+ if (t10_alua_lu_gp_cache)
+ kmem_cache_destroy(t10_alua_lu_gp_cache);
+ if (t10_alua_tg_pt_gp_cache)
+ kmem_cache_destroy(t10_alua_tg_pt_gp_cache);
kfree(global);
return(-1);
}
@@ -336,6 +359,8 @@ extern void release_se_global (void)
kmem_cache_destroy(se_task_cache);
kmem_cache_destroy(se_sess_cache);
kmem_cache_destroy(t10_pr_reg_cache);
+ kmem_cache_destroy(t10_alua_lu_gp_cache);
+ kmem_cache_destroy(t10_alua_tg_pt_gp_cache);
kfree(global);
se_global = NULL;
@@ -2059,11 +2084,13 @@ extern se_device_t *transport_add_device_to_core_hba (
dev->transport = transport;
atomic_set(&dev->active_cmds, 0);
INIT_LIST_HEAD(&dev->dev_sep_list);
+ INIT_LIST_HEAD(&dev->dev_lu_gp_list);
init_MUTEX_LOCKED(&dev->dev_queue_obj->thread_create_sem);
init_MUTEX_LOCKED(&dev->dev_queue_obj->thread_done_sem);
init_MUTEX_LOCKED(&dev->dev_queue_obj->thread_sem);
spin_lock_init(&dev->execute_task_lock);
spin_lock_init(&dev->state_task_lock);
+ spin_lock_init(&dev->dev_alua_lock);
spin_lock_init(&dev->dev_reservation_lock);
spin_lock_init(&dev->dev_status_lock);
spin_lock_init(&dev->dev_status_thr_lock);
@@ -4036,7 +4063,7 @@ extern int transport_generic_emulate_inquiry (
unsigned char *buf = (unsigned char *) T_TASK(cmd)->t_task_buf;
unsigned char *cdb = T_TASK(cmd)->t_task_cdb;
unsigned char *iqn_sn;
- u32 vend_len, prod_len, iqn_sn_len, se_location_len;
+ u32 prod_len, iqn_sn_len, se_location_len;
u32 unit_serial_len, off = 0;
u16 len = 0;
@@ -4165,9 +4192,11 @@ extern int transport_generic_emulate_inquiry (
*/
check_port:
if ((port = lun->lun_sep)) {
+ t10_alua_lu_gp_t *lu_gp_p;
+ t10_alua_tg_pt_gp_t *tg_pt_gp_p;
u32 padding, scsi_name_len;
- u16 lun_gp = 0; // Set to zero for implict ALUA
- u16 tg_pg_i = 0; // Set to zero for implict ALUA
+ u16 lu_gp_id = 0;
+ u16 tg_pt_gp_id = 0;
u16 tpgt;
tpg = port->sep_tpg;
@@ -4199,10 +4228,18 @@ check_port:
* section 7.5.1 Table 362
*/
check_tpgi:
+ if (T10_ALUA(dev->se_sub_dev)->alua_type != SPC3_ALUA_EMULATED)
+ goto check_scsi_name;
+
if (((len + 4) + 8) > cmd->data_length) {
len += 8;
goto check_lu_gp;
}
+ spin_lock(&port->sep_alua_lock);
+ if ((tg_pt_gp_p = port->sep_alua_tg_pt_gp))
+ tg_pt_gp_id = tg_pt_gp_p->tg_pt_gp_id;
+ spin_unlock(&port->sep_alua_lock);
+
buf[off] = (TPG_TFO(tpg)->get_fabric_proto_ident() << 4);
buf[off++] |= 0x1; // CODE SET == Binary
buf[off] = 0x80; // Set PIV=1
@@ -4211,8 +4248,8 @@ check_tpgi:
off++; // Skip over Reserved
buf[off++] = 4; /* DESIGNATOR LENGTH */
off += 2; // Skip over Reserved Field
- buf[off++] = ((tg_pg_i >> 8) & 0xff);
- buf[off++] = (tg_pg_i & 0xff);
+ buf[off++] = ((tg_pt_gp_id >> 8) & 0xff);
+ buf[off++] = (tg_pt_gp_id & 0xff);
len += 8; // Header size + Designation descriptor
/*
* Logical Unit Group identifier, see spc4r17 section 7.7.3.8
@@ -4222,13 +4259,18 @@ check_lu_gp:
len += 8;
goto check_scsi_name;
}
+ spin_lock(&dev->dev_alua_lock);
+ if ((lu_gp_p = dev->dev_alua_lu_gp))
+ lu_gp_id = lu_gp_p->lu_gp_id;
+ spin_unlock(&dev->dev_alua_lock);
+
buf[off++] |= 0x1; // CODE SET == Binary
buf[off++] |= 0x6; // DESIGNATOR TYPE == Logical Unit Group identifier
off++; // Skip over Reserved
buf[off++] = 4; /* DESIGNATOR LENGTH */
off += 2; // Skip over Reserved Field
- buf[off++] = ((lun_gp >> 8) & 0xff);
- buf[off++] = (lun_gp & 0xff);
+ buf[off++] = ((lu_gp_id >> 8) & 0xff);
+ buf[off++] = (lu_gp_id & 0xff);
len += 8; // Header size + Designation descriptor
/*
* SCSI name string designator, see spc4r17 section 7.7.3.11
--
1.5.4.1
reply other threads:[~2009-02-06 8:01 UTC|newest]
Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1233907238.12375.364.camel@haakon2.linux-iscsi.org \
--to=nab@linux-iscsi.org \
--cc=James.Bottomley@HansenPartnership.com \
--cc=agr@powerkom-dd.de \
--cc=akpm@linux-foundation.org \
--cc=dgilbert@interlog.com \
--cc=fujita.tomonori@lab.ntt.co.jp \
--cc=hare@suse.de \
--cc=hch@lst.de \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-scsi@vger.kernel.org \
--cc=michaelc@cs.wisc.edu \
--cc=rafiu@openfiler.com \
--cc=rswwalker@gmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
all inboxes | Powered by JetHome®